本帖最后由 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)
|