如果说只跑官方的示例,或者用官方做好的配置文件,那就没啥学习价值了,需要自己动手做一个找不到参考的IO来做中断按钮才行。
开发板上使用的IO是PA0,使用的是下拉电阻,好奇怪,以前我都是看到的上拉电阻,这里用的下拉电阻。
所以我这里切换成我自己画的扩展板上的。我的原理图如下所示,这里使用PB4作为测试IO
根据我的电路,需要将PB4设置为上拉电阻模式,按钮按下会产生下降沿,我们可以设置下降沿中断。
看到官方做了相关的宏,修改就可以直接配置,但是在中断初始化里又用的是库里面的宏,所以这里我觉得不如直接用库里的,如果你考虑可移植性,那就做彻底啊。
- void at32_button_init(void)
- {
- gpio_init_type gpio_init_struct;
- /* enable the button clock */
- crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
- /* set default parameter */
- gpio_default_para_init(&gpio_init_struct);
- /* configure button pin as input with pull-up/pull-down */
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
- gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
- gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
- gpio_init_struct.gpio_pins = GPIO_PINS_4;
- gpio_init_struct.gpio_pull = GPIO_PULL_UP;
- gpio_init(GPIOB, &gpio_init_struct);
- }
接下来实现IO中断的初始化配置
照葫芦画瓢,修改成下降沿
- void button_exint_init(void)
- {
- exint_init_type exint_init_struct;
- crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK, TRUE);
- scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOB, SCFG_PINS_SOURCE4);
- exint_default_para_init(&exint_init_struct);
- exint_init_struct.line_enable = TRUE;
- exint_init_struct.line_mode = EXINT_LINE_INTERRUPT;
- exint_init_struct.line_select = EXINT_LINE_4;
- exint_init_struct.line_polarity = EXINT_TRIGGER_FALLING_EDGE;
- exint_init(&exint_init_struct);
- nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
- nvic_irq_enable(EXINT4_IRQn, 0, 0);
配套的其他函数也要修改
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] button handler function
- * @param none
- * @retval none
- */
- void button_isr(void)
- {
- /* delay 5ms */
- delay_ms(5);
- /* clear interrupt pending bit */
- exint_flag_clear(EXINT_LINE_4);
- /* check input pin state */
- if(SET == gpio_input_data_bit_read(GPIOB, GPIO_PINS_4))
- {
- if(g_speed == SLOW)
- g_speed = FAST;
- else
- g_speed = SLOW;
- }
- }
- /**
- * @brief exint0 interrupt handler
- * @param none
- * @retval none
- */
- void EXINT4_IRQHandler(void)
- {
- button_isr();
- }
注意这里都修改成跟GPIOB4相关的参数
编译烧录,发现没反应。。。
改成上升沿中断,可以工作
- void button_exint_init(void)
- {
- exint_init_type exint_init_struct;
- crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK, TRUE);
- scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOB, SCFG_PINS_SOURCE4);
- exint_default_para_init(&exint_init_struct);
- exint_init_struct.line_enable = TRUE;
- exint_init_struct.line_mode = EXINT_LINE_INTERRUPT;
- exint_init_struct.line_select = EXINT_LINE_4;
- exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
- exint_init(&exint_init_struct);
- nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
- nvic_irq_enable(EXINT4_IRQn, 0, 0);
- }
大家看看问题出在哪儿,为何上升沿中断可以,下降沿就不行了?
|