GD32 开发笔记

0x01 GPIO时钟使能的坑

使用GD32的GPIO引脚来控制 74HC595 ,发现引脚一直无法控制,始终输出3.3v,初始化环节应该是出了问题。用通俗的话来说,就是点灯点不亮

排查了MCU、光耦隔离芯片、被强行上拉等问题,最后发现是GD的GPIO时钟使能问题。

以下是错误使用方法:

c 复制代码
    rcu_periph_clock_enable(RCU_SER | RCU_SCK);

修改为以下方法即可:

c 复制代码
    rcu_periph_clock_enable(RCU_SER);
    rcu_periph_clock_enable(RCU_SCK);

日后想必也会经常需要验证GD32,留个点灯函数在这里

c 复制代码
rcu_periph_clock_enable(RCU_GPIOC);
gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_13);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);

gpio_bit_set(GPIOC,GPIO_PIN_13);
gpio_bit_reset(GPIOC,GPIO_PIN_13);

0x02 微秒级延时函数

systick.c

c 复制代码
#include "gd32f1x0.h"
#include "systick.h"

volatile static uint32_t delay;

#include "systick.h"

volatile static float count_1us = 0;
volatile static float count_1ms = 0;

void delay_decrement(void)
{
    if (0U != delay){
        delay--;
    }
}

void systick_config(void)
{
	/* systick clock source is from HCLK/8 内部时钟的108M/8分频 */
    systick_clksource_set(SYSTICK_CLKSOURCE_HCLK_DIV8);
    count_1us = (float)SystemCoreClock/12000000;//延时1us需要的时钟数量 108M/8M = 13.5 
    count_1ms = (float)count_1us * 1000;//延时1ms需要的时钟数量 108M/8M *1000= 13500 
}

void delay_1us(uint32_t count)
{
    uint32_t ctl;
    SysTick->LOAD = (uint32_t)(count * count_1us);
    SysTick->VAL = 0x0000U;
    SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
    do{
        ctl = SysTick->CTRL;
    }while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
    SysTick->VAL = 0x0000U;
}

void delay_1ms(uint32_t count)
{
    uint32_t ctl;
    SysTick->LOAD = (uint32_t)(count * count_1ms);
    SysTick->VAL = 0x0000U;
    SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
    do{
        ctl = SysTick->CTRL;
    }while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));
    SysTick->VAL = 0x0000U;
}

systick.h

c 复制代码
#ifndef SYSTICK_H
#define SYSTICK_H

#include <stdint.h>

void systick_config(void);
void delay_1ms(uint32_t count);
void delay_1us(uint32_t count);
void delay_decrement(void);

#endif 
相关推荐
芯岭技术5 小时前
不到一块钱的带USB 2.4G收发 SOC芯片,集成2.4G射频 32位MCU
单片机·嵌入式硬件
普中科技6 小时前
【普中DSP28335开发攻略】-- 第 15 章 外部中断实验
单片机·嵌入式硬件·开发板·外部中断·dsp28335·普中科技
IT阳晨。6 小时前
【STM32】ADC
stm32·单片机·嵌入式硬件
纳祥科技8 小时前
方案分享:一款基于高性能单片机的落日灯方案
单片机·嵌入式硬件
三佛科技-134163842129 小时前
智能保温杯方案,保温杯MCU控制方案设计
单片机·嵌入式硬件·智能家居·pcb工艺
Wave84510 小时前
STM32_标准库转hal库
stm32·单片机·嵌入式硬件
智者知已应修善业11 小时前
【51单片机:两边向中间流水:即两边先点亮然后熄灭,次边的点亮再熄灭,直到最中间的两个点亮再熄灭,然后重复动作。】2023-3-4
c语言·c++·经验分享·笔记·嵌入式硬件·算法·51单片机
嵌入式软硬件攻城狮12 小时前
6.单片机回调函数
单片机·嵌入式硬件
就是蠢啊12 小时前
单片机入门实验——点灯
单片机·嵌入式硬件
@曾记否12 小时前
瑞控FPVF405飞控开发板硬件功能整理
stm32·嵌入式硬件