打印
[AT32M412]

【AT-START-M412测评】+ 按钮学习,IO中断,为何下降沿不中断

[复制链接]
204|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
如果说只跑官方的示例,或者用官方做好的配置文件,那就没啥学习价值了,需要自己动手做一个找不到参考的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);
}
大家看看问题出在哪儿,为何上升沿中断可以,下降沿就不行了?

使用特权

评论回复
沙发
gaoyang9992006|  楼主 | 2025-6-14 06:57 | 只看该作者
经过一夜的思考,我好像知道了原因。
在原版的示例,仅仅修改为下降沿中断

仍然不工作,是不工作吗,还是官方提供的示例的判断方式有问题?
仔细阅读全部代码,发现问题

在执行动作的时候,它的代码逻辑是选择的是否为高电平。那么板载的板子上是按下后为高电平,上升沿。所以它这么做。
注释掉该行之后,OK了,下降沿的中断动作可以在流水灯上显现出来了。

使用特权

评论回复
板凳
gaoyang9992006|  楼主 | 2025-6-14 07:05 | 只看该作者

经过一夜的梦中分析,找到了问题的所在,原来官方的示例中对IO的状态进行了判断后才执行的切换动作。
这或许是为了区分相同中断源的不同IO触发的中断。至此,已经学会了使用该芯片的IO操作方法。

使用特权

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

本版积分规则

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

2027

主题

16276

帖子

218

粉丝