RISC-V技术论坛
直播中

华仔stm32

3年用户 2959经验值
擅长:嵌入式技术
私信 关注
[经验]

【兆易创新GD32VF103R-START开发板试用体验】流水灯

【感谢】感谢电子发烧友论坛、兆易创新公司对我的信任,将GD32VF103R开发板试用的机会给我。这也是我第二次试用GD的产品。

【目的】学习使用GPIO + 中断,实现按键切换不同的流水灯。
【步骤】
1、初始化GPIO:根据开发板的原理图,板载了4个LED灯,分别是GPIOA的7、8、10,GPIOC的13。首先开启PA、PC的GPIO时钟。然后配置为输出。然后置低电平,让开机四个灯是灭的。
  1. void led_init(void)
  2. {
  3.     /* enable the LEDs clock */
  4.    rcu_periph_clock_enable(RCU_GPIOA);
  5.    rcu_periph_clock_enable(RCU_GPIOC);
  6.    /* configure LEDs GPIO port */
  7.    gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_10);
  8.    gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);

  9.    /* turn off LEDs */
  10.    gpio_bit_reset(GPIOA, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_10);
  11.    gpio_bit_reset(GPIOC, GPIO_PIN_13);
  12. }
2、配置按键:首先打开全局的中断,设置中断的设置优先级组为LEVEL3,然后配置PA0的GPIO为下降降沿输入。开启中断线路为:EXti0_IRQn, 1, 1。(这些都是抄作业的。。。)

  1. void key_init(void)
  2. {
  3.      /* enable the global interrupt */
  4.     eclic_global_interrupt_enable();
  5.     eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);

  6.      /* configure button pin as input */
  7.     gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
  8.    
  9.     /* enable and set key EXTI interrupt to the lowest priority */
  10.     eclic_irq_enable(EXTI0_IRQn, 1, 1);

  11.     /* connect key EXTI line to key GPIO pin */
  12.     gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0);

  13.     /* configure key EXTI line */
  14.     exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  15.     exti_interrupt_flag_clear(EXTI_0);
  16. }
3、加入gd32vf103_it.c文件,并添加中断函数:定义是5个状态。

  1. void EXTI0_IRQHandler(void)
  2. {
  3.     if(RESET != exti_interrupt_flag_get(EXTI_0)){
  4.         exti_interrupt_flag_clear(EXTI_0);
  5.         key_sta ++;
  6.         if (key_sta == 5)
  7.                 key_sta = 0;
  8.     }
  9. }
4、定义LED亮灯函数:

  1. void led_flash(void)
  2. {
  3.     gpio_bit_write(GPIOA, GPIO_PIN_7, led_sta[0]);
  4.     gpio_bit_write(GPIOA, GPIO_PIN_8, led_sta[1]);
  5.     gpio_bit_write(GPIOA, GPIO_PIN_10, led_sta[2]);
  6.     gpio_bit_write(GPIOC, GPIO_PIN_13, led_sta[3]);
  7. }
5、定义LED亮灯组数:

  1. int led_ligt[][4] ={
  2.     {0,0,0,0},
  3.     {1,0,0,0},
  4.     {1,1,0,0},
  5.     {1,1,1,0},
  6.     {1,1,1,1},//1
  7.     {1,1,1,0},
  8.     {1,1,0,0},
  9.     {1,0,0,0},
  10.     {0,0,0,0},//2
  11.     {0,1,0,0},
  12.     {1,0,0,0},
  13.     {0,0,0,1},
  14.     {0,0,1,0},//3
  15.     {1,1,1,1},
  16.     {0,0,0,0},
  17.     {1,0,0,0},
  18.     {0,1,0,0},//4
  19.     {0,0,1,0},
  20.     {0,0,0,1},
  21.     {1,1,1,1},
  22. };
6、定义状态转换函数:这里的思路是状态 sta*4+X来实现流水灯的转换。

  1. void sta_flash(int sta)
  2. {
  3.     int i;
  4.     static int x = 0;
  5.         for ( i = 0; i < 4; i++)
  6.         {
  7.             led_sta[i] = led_ligt[x+sta*4][i];
  8.             
  9.         }
  10.         led_flash();
  11.         delay_1ms(400);
  12.         x = x+1;
  13.         if (x==5)
  14.             x=0;
  15. }
主函数:

  1. int main(void)
  2. {  
  3.     led_init();
  4.     key_init();

  5.     /* enable the key clock */
  6.     rcu_periph_clock_enable(RCU_GPIOA);
  7.     rcu_periph_clock_enable(RCU_AF);
  8.    
  9.     while(1){
  10.         sta_flash(key_sta);
  11.     }
  12. }
【总结】拿到这个板,环境搭建花了好些功夫,因为以前没怎么用eclipse,环境的设置,我参照教程弄了差不多一天也没有弄好,还好兆易的小仙女弄好的环境,从百度网盘下载下来就行了。大家有需要可以去链接下载https://pan.baidu.com/s/19J_SGRdLb3GYnzRPh16iIg 提取码:1234
IDE也没有代码提示,补全功能,我翻了资料也没弄好,后面用vscode来写代码,用NucleiStudio进行编译下载。

GD32VF103R流水灯

更多回帖

发帖
×
20
完善资料,
赚取积分