介绍: 采用的芯片是GD32F450IK,芯片厂商为兆易创新,开发板是厂商寄过来的。采用的是keil5.25.
代码例程是在兆易创新官网下载的,链接如下。
http://gd32mcu.com/cn/download/0?kw=GD32F4
代码例程图片如下:
不多说,直接上代码讲解。
int main(void)
{
/* configure systick */
systick_config();
/* enable the LEDs GPIO clock */
rcu_periph_clock_enable(RCU_GPIOE);
rcu_periph_clock_enable(RCU_GPIOF);
/* configure LED1 GPIO port */
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2);
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
/* reset LED1 GPIO pin */
gpio_bit_reset(GPIOE, GPIO_PIN_2);
/* enable the LED2 GPIO clock */
/* configure LED2 GPIO port */
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_3);
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
/* reset LED2 GPIO pin */
gpio_bit_reset(GPIOE, GPIO_PIN_3);
/* enable the LED3 GPIO clock */
/* configure LED3 GPIO port */
gpio_mode_set(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_10);
gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
/* reset LED3 GPIO pin */
gpio_bit_reset(GPIOF, GPIO_PIN_10);
while(1){
/* turn on LED1, turn off LED3 */
gpio_bit_set(GPIOE, GPIO_PIN_2);
gpio_bit_reset(GPIOF, GPIO_PIN_10);
delay_1ms(1000);
/* turn on LED2, turn off LED1 */
gpio_bit_set(GPIOE, GPIO_PIN_3);
gpio_bit_reset(GPIOE, GPIO_PIN_2);
delay_1ms(1000);
/* turn on LED3, turn off LED2 */
gpio_bit_set(GPIOF, GPIO_PIN_10);
gpio_bit_reset(GPIOE, GPIO_PIN_3);
delay_1ms(1000);
}
}
Systick_config:配置滴答定时器计数频率,直接配置为1khz,也就是1ms中断一次。
delay_ms就是基于此实现的,需要用到delay_ms函数就必须先配置滴答定时器,如果不太懂的童鞋,看下systick_config源码就能懂
rcu_periph_clock_enable(RCU_GPIOE);
rcu_periph_clock_enable(RCU_GPIOF);
看名字就知道是使能时钟!但是为什么要使能GPIOE和GPIOF的时钟呢?就要查看原理图,如下所示
可以看到PE2 PE3 PF10管脚连接的是LED灯,因此肯定是要配置对应GPIO端口的时钟
时钟配置完毕之后,就要配置GPIO管脚的参数了。
配置PE2管脚为输出模式,不上拉。
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2);
配置PE2为推挽输出,速度为50MHZ。
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
也就是说从这俩函数看出来GPIO配置的参数有6个
-
GPIOE :端口号,如GPIOA GPIOB GPIOC GPIOD 等等,用到哪个端口就写哪个端口。
-
GPIO_PIN:GPIOE和GPIO_PIN_2,对应的管脚就为原理图上的PE2.
-
GPIO_MODE_OUTPUT: 需要的功能为点LED灯,也就是GPIO的输出高低电平,自然为输出模式。
-
GPIO_PUPD_NONE:不上拉,一般都为不上拉。
-
GPIO_OTYPE_PP:推挽输出,还有个模式为开漏输出,开漏输出需要上拉电阻才有驱动能力。一般都是推挽输出,先记着再说
-
GPIO_OSPEED_50MHZ:GPIO管脚的速度,就选个50MHZ够用了。
至此PE2管脚就配置完成了,PE2 和PF10管脚的配置代码与之一样就不赘述了。
gpio_bit_reset(GPIOF, GPIO_PIN_10);
这个函数的意思就是给PF10管脚拉低,也就是PF10管脚的电平为低电平。
从原理图上看出,PF10为低电平的时候,LED3的不亮的。
后续的代码主要用到三个函数:
gpio_bit_reset:刚刚讲过
gpio_bit_set:给对应的GPIO管脚拉高,给个高电平,从原理图上看,对应的GPIO拉高,led灯就会亮
delay_1ms(1000):延时函数,1000为1000ms,就是延时一秒。
因此通过gpio_bit_reset和gpio_bit_set拉高拉低管脚电平,led灯就会亮灭。通过delay_1ms可以改变亮灭的时间差,也就是频率的意思吧