打印
[AT32M412]

【AT-START-M412测评】+ 按钮学习,多路IO中断

[复制链接]
424|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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

编译下载
可以看到这四个按钮按下都可以切换流水灯的速度了。
说明实现了相关目的。


使用特权

评论回复
沙发
gaoyang9992006|  楼主 | 2025-6-14 22:49 | 只看该作者
该测试可以为后续的总体功能实现提供 4个基于中断的按钮。

使用特权

评论回复
板凳
gaoyang9992006|  楼主 | 2025-6-14 23:18 | 只看该作者
增加按下后打印消息
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");
  }

}

使用特权

评论回复
地板
顶点追寻者| | 2025-6-18 13:04 | 只看该作者
6啊,多路按键中断是在一个中断里面判断按个按键按下吗?

使用特权

评论回复
5
gaoyang9992006|  楼主 | 2025-6-19 16:47 | 只看该作者
顶点追寻者 发表于 2025-6-18 13:04
6啊,多路按键中断是在一个中断里面判断按个按键按下吗?

是多个中断入口,这个其中两个共用了一个入口的。四个按钮使用了三个中断入口

使用特权

评论回复
6
zhuomuniao110| | 2025-6-29 13:14 | 只看该作者
纯库函数编程,听说有图形化工具,怎么不用用。看看好用不

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2030

主题

16290

帖子

218

粉丝