本帖最后由 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, 下载次数: 4)
|