打印
[活动专区]

【AT-START-F425测评】5、EXINT

[复制链接]
817|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 lisingch 于 2022-3-21 12:41 编辑

      本次实验为外部中断测试。外部中断源为来自于PA0端口的按键,根据采集到的外部中断产生次数控制板载三颗LED产生不同的状态变化。
一、知识准备
      与外部中断关系比较密切的管理模块包括系统配置控制器(SCFG)、外部中断和事件控制器(EXINT) 。



      从上面图中描述可以看到,一共有22条中断线,每条中断线均可被“边沿触发”和“软件触发”并产生中断或事件。系统配置控制器(SCFG) 管理着连接到GPIO口的外部中断。
      开发板上为提供了一只用户按键,该按键一端连接至“VCC”;另一端通过“R7”至“GND”的同时并通过“R2”连接至PA0端口。当按键按下便会在"PA0"端口产生一个由低至高的电平变化信号。MCU因“PA0”端口的这一上升沿电平变化便会产生“中断”。


二、程序实现
      程序参考了相关例程,局部修改。
外部中断源配置:
void KEY_Config(void)
{
  exint_init_type exint_init_struct;

  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK, TRUE);

  scfg_exint_line_config(SCFG_PORT_SOURCE_GPIOA, SCFG_PINS_SOURCE0);

  exint_default_para_init(&exint_init_struct);
  exint_init_struct.line_enable = TRUE;
  exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
  exint_init_struct.line_select = EXINT_LINE_0;
  exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
  exint_init(&exint_init_struct);

  nvic_priority_group_config(NVIC_PRIORITY_GROUP_0);
  nvic_irq_enable(EXINT1_0_IRQn, 0, 0);
}
中断处理:
void EXINT1_0_IRQHandler(void)
{
        static uint8_t num=0;
        
        exint_flag_clear(EXINT_LINE_0);

        if(SET == gpio_input_data_bit_read(KEY_PORT, KEY_PIN))
        {
                num++;
                if(num==4)num=0;
                switch(num)
                {
                        case 0: {
                                                                at32_led_off(LED2);
                                                                at32_led_off(LED3);
                                                                at32_led_off(LED4);
                                                        }break;
                        
                        case 1: {
                                                                at32_led_on(LED2);
                                                                at32_led_off(LED3);
                                                                at32_led_off(LED4);
                                                        }break;
                        
                        case 2: {
                                                                at32_led_off(LED2);
                                                                at32_led_on(LED3);
                                                                at32_led_off(LED4);
                                                        }break;
                        
                        case 3: {
                                                                at32_led_off(LED2);
                                                                at32_led_off(LED3);
                                                                at32_led_on(LED4);
                                                        }break;
                        default: break;
                }
        }
}
主程序:
int main(void)
{
  system_clock_config();

  at32_board_init();

  KEY_Config();

  while(1)
  {

  }
}


三、实验结果
如题头描述。
EXINT.rar (287.24 KB)



使用特权

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

本版积分规则

99

主题

14990

帖子

17

粉丝