如果说只跑官方的示例,或者用官方做好的配置文件,那就没啥学习价值了,需要自己动手做一个找不到参考的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);
}
大家看看问题出在哪儿,为何上升沿中断可以,下降沿就不行了?
|