基于兆易创新GD32F450IK芯片的流水灯程序,详解,对入门童鞋友好的讲解

介绍: 采用的芯片是GD32F450IK,芯片厂商为兆易创新,开发板是厂商寄过来的。采用的是keil5.25.
代码例程是在兆易创新官网下载的,链接如下。
http://gd32mcu.com/cn/download/0?kw=GD32F4
代码例程图片如下:
基于兆易创新GD32F450IK芯片的流水灯程序,详解,对入门童鞋友好的讲解
不多说,直接上代码讲解。

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的时钟呢?就要查看原理图,如下所示
基于兆易创新GD32F450IK芯片的流水灯程序,详解,对入门童鞋友好的讲解
可以看到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个

  1. GPIOE :端口号,如GPIOA GPIOB GPIOC GPIOD 等等,用到哪个端口就写哪个端口。

  2. GPIO_PIN:GPIOE和GPIO_PIN_2,对应的管脚就为原理图上的PE2.

  3. GPIO_MODE_OUTPUT: 需要的功能为点LED灯,也就是GPIO的输出高低电平,自然为输出模式。

  4. GPIO_PUPD_NONE:不上拉,一般都为不上拉。

  5. GPIO_OTYPE_PP:推挽输出,还有个模式为开漏输出,开漏输出需要上拉电阻才有驱动能力。一般都是推挽输出,先记着再说

  6. 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可以改变亮灭的时间差,也就是频率的意思吧

上一篇:兵贵神速——快速排序


下一篇:[ Redis16篇]BitMap布隆过滤器