【AT-START-M412测评】+ 按钮学习,多路IO中断
IO的单路学习分享参考下面的帖子https://bbs.21ic.com/icview-3461522-1-1.html
本贴在此基础上进行拓展,实现4个IO的中断操作
IO的初始化配置如下
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_MODERATE;
gpio_init_struct.gpio_out_type= GPIO_OUTPUT_OPEN_DRAIN;
gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_4 | GPIO_PINS_5 | GPIO_PINS_7 | GPIO_PINS_10;
gpio_init_struct.gpio_pull = GPIO_PULL_UP;
gpio_init(GPIOB, &gpio_init_struct);
}我使用了四个IO,GPIOB上的4/5/7/10
设置为输入模式,内部上拉电阻
这样按下的时候就是下降沿,松开时候就是上升沿。
接下来配置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);
scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOB, SCFG_PINS_SOURCE5);
scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOB, SCFG_PINS_SOURCE7);
scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOB, SCFG_PINS_SOURCE10);
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_LINE_5 | EXINT_LINE_7 | EXINT_LINE_10;
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);
nvic_irq_enable(EXINT9_5_IRQn, 0, 0);
nvic_irq_enable(EXINT15_10_IRQn, 0, 0);
}设置为了下降沿中断。
4个IO的中断函数处理
void button_B4_isr(void)
{
/* delay 5ms */
delay_ms(5);
/* clear interrupt pending bit */
exint_flag_clear(EXINT_LINE_4);
/* check input pin state */
if(RESET == gpio_input_data_bit_read(GPIOB, GPIO_PINS_4))
{
if(g_speed == SLOW)
g_speed = FAST;
else
g_speed = SLOW;
}
}
void button_B5_isr(void)
{
/* delay 5ms */
delay_ms(5);
/* clear interrupt pending bit */
exint_flag_clear(EXINT_LINE_5);
/* check input pin state */
if(RESET == gpio_input_data_bit_read(GPIOB, GPIO_PINS_5))
{
if(g_speed == SLOW)
g_speed = FAST;
else
g_speed = SLOW;
}
}
void button_B7_isr(void)
{
/* delay 5ms */
delay_ms(5);
/* clear interrupt pending bit */
exint_flag_clear(EXINT_LINE_7);
/* check input pin state */
if(RESET == gpio_input_data_bit_read(GPIOB, GPIO_PINS_7))
{
if(g_speed == SLOW)
g_speed = FAST;
else
g_speed = SLOW;
}
}
void button_B10_isr(void)
{
/* delay 5ms */
delay_ms(5);
/* clear interrupt pending bit */
exint_flag_clear(EXINT_LINE_10);
/* check input pin state */
if(RESET == gpio_input_data_bit_read(GPIOB, GPIO_PINS_10))
{
if(g_speed == SLOW)
g_speed = FAST;
else
g_speed = SLOW;
}
}将中断处理函数加入到启动文件里的中断向量函数里
void EXINT4_IRQHandler(void)
{
button_B4_isr();
}
void EXINT9_5_IRQHandler(void)
{
button_B5_isr();
button_B7_isr();
}
void EXINT15_10_IRQHandler(void)
{
button_B10_isr();
}我们可以看到5到9的IO端口共用一个入口,10到15的共用一个入口。
相关的定义在.s启动文件里startup_at32m412_416.s
编译下载
可以看到这四个按钮按下都可以切换流水灯的速度了。
说明实现了相关目的。
该测试可以为后续的总体功能实现提供 4个基于中断的按钮。 增加按下后打印消息
void button_B4_isr(void)
{
/* delay 5ms */
delay_ms(5);
/* clear interrupt pending bit */
exint_flag_clear(EXINT_LINE_4);
/* check input pin state */
if(RESET == gpio_input_data_bit_read(GPIOB, GPIO_PINS_4))
{
if(g_speed == SLOW)
g_speed = FAST;
else
g_speed = SLOW;
}
printf("GPIOB_04 is pressed.\r\n");
}
void button_B5_isr(void)
{
/* delay 5ms */
delay_ms(5);
/* clear interrupt pending bit */
exint_flag_clear(EXINT_LINE_5);
/* check input pin state */
if(RESET == gpio_input_data_bit_read(GPIOB, GPIO_PINS_5))
{
if(g_speed == SLOW)
g_speed = FAST;
else
g_speed = SLOW;
printf("GPIOB_05 is pressed.\r\n");
}
}
void button_B7_isr(void)
{
/* delay 5ms */
delay_ms(5);
/* clear interrupt pending bit */
exint_flag_clear(EXINT_LINE_7);
/* check input pin state */
if(RESET == gpio_input_data_bit_read(GPIOB, GPIO_PINS_7))
{
if(g_speed == SLOW)
g_speed = FAST;
else
g_speed = SLOW;
printf("GPIOB_07 is pressed.\r\n");
}
}
void button_B10_isr(void)
{
/* delay 5ms */
delay_ms(5);
/* clear interrupt pending bit */
exint_flag_clear(EXINT_LINE_10);
/* check input pin state */
if(RESET == gpio_input_data_bit_read(GPIOB, GPIO_PINS_10))
{
if(g_speed == SLOW)
g_speed = FAST;
else
g_speed = SLOW;
printf("GPIOB_10 is pressed.\r\n");
}
}
6啊,多路按键中断是在一个中断里面判断按个按键按下吗? 顶点追寻者 发表于 2025-6-18 13:04
6啊,多路按键中断是在一个中断里面判断按个按键按下吗?
是多个中断入口,这个其中两个共用了一个入口的。四个按钮使用了三个中断入口 纯库函数编程,听说有图形化工具,怎么不用用。看看好用不
页:
[1]