0
【感谢】感谢电子发烧友论坛、兆易创新公司对我的信任,将GD32VF103R开发板试用的机会给我。这也是我第二次试用GD的产品。
【目的】学习使用GPIO + 中断,实现按键切换不同的流水灯。
【步骤】
1、初始化GPIO:根据开发板的原理图,板载了4个LED灯,分别是GPIOA的7、8、10,GPIOC的13。首先开启PA、PC的GPIO时钟。然后配置为输出。然后置低电平,让开机四个灯是灭的。
- void led_init(void)
- {
- /* enable the LEDs clock */
- rcu_periph_clock_enable(RCU_GPIOA);
- rcu_periph_clock_enable(RCU_GPIOC);
- /* configure LEDs GPIO port */
- gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_10);
- gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
- /* turn off LEDs */
- gpio_bit_reset(GPIOA, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_10);
- gpio_bit_reset(GPIOC, GPIO_PIN_13);
- }
复制代码
2、配置按键:首先打开全局的中断,设置中断的设置优先级组为LEVEL3,然后配置PA0的GPIO为下降降沿输入。开启中断线路为:EXti0_IRQn, 1, 1。(这些都是抄作业的。。。)
- void key_init(void)
- {
- /* enable the global interrupt */
- eclic_global_interrupt_enable();
- eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);
- /* configure button pin as input */
- gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
-
- /* enable and set key EXTI interrupt to the lowest priority */
- eclic_irq_enable(EXTI0_IRQn, 1, 1);
- /* connect key EXTI line to key GPIO pin */
- gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0);
- /* configure key EXTI line */
- exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
- exti_interrupt_flag_clear(EXTI_0);
- }
复制代码
3、加入gd32vf103_it.c文件,并添加中断函数:定义是5个状态。
- void EXTI0_IRQHandler(void)
- {
- if(RESET != exti_interrupt_flag_get(EXTI_0)){
- exti_interrupt_flag_clear(EXTI_0);
- key_sta ++;
- if (key_sta == 5)
- key_sta = 0;
- }
- }
复制代码
4、定义LED亮灯函数:
- void led_flash(void)
- {
- gpio_bit_write(GPIOA, GPIO_PIN_7, led_sta[0]);
- gpio_bit_write(GPIOA, GPIO_PIN_8, led_sta[1]);
- gpio_bit_write(GPIOA, GPIO_PIN_10, led_sta[2]);
- gpio_bit_write(GPIOC, GPIO_PIN_13, led_sta[3]);
- }
复制代码
5、定义LED亮灯组数:
- int led_ligt[][4] ={
- {0,0,0,0},
- {1,0,0,0},
- {1,1,0,0},
- {1,1,1,0},
- {1,1,1,1},//1
- {1,1,1,0},
- {1,1,0,0},
- {1,0,0,0},
- {0,0,0,0},//2
- {0,1,0,0},
- {1,0,0,0},
- {0,0,0,1},
- {0,0,1,0},//3
- {1,1,1,1},
- {0,0,0,0},
- {1,0,0,0},
- {0,1,0,0},//4
- {0,0,1,0},
- {0,0,0,1},
- {1,1,1,1},
- };
复制代码
6、定义状态转换函数:这里的思路是状态 sta*4+X来实现流水灯的转换。
- void sta_flash(int sta)
- {
- int i;
- static int x = 0;
- for ( i = 0; i < 4; i++)
- {
- led_sta[i] = led_ligt[x+sta*4][i];
-
- }
- led_flash();
- delay_1ms(400);
- x = x+1;
- if (x==5)
- x=0;
- }
复制代码
主函数:
- int main(void)
- {
- led_init();
- key_init();
- /* enable the key clock */
- rcu_periph_clock_enable(RCU_GPIOA);
- rcu_periph_clock_enable(RCU_AF);
-
- while(1){
- sta_flash(key_sta);
- }
- }
复制代码
【总结】拿到这个板,环境搭建花了好些功夫,因为以前没怎么用eclipse,环境的设置,我参照教程弄了差不多一天也没有弄好,还好兆易的小仙女弄好的环境,从百度网盘下载下来就行了。大家有需要可以去链接下载https://pan.baidu.com/s/19J_SGRdLb3GYnzRPh16iIg 提取码:1234
IDE也没有代码提示,补全功能,我翻了资料也没弄好,后面用vscode来写代码,用NucleiStudio进行编译下载。
GD32VF103R流水灯
|
|