目录
概述
本文主要是使用AT32F403A开发板,基于V2库的外部中断功能的使用。
串口工具使用的Atlink-ez自带的串口功能。
工程建立、调试工具配置在前面章节有详细介绍。
硬件
硬件方面使用的是参考官方AT32F437 SURF板子而设计的一个AT32F403A开发板,板子上的芯片是AT32F403AVGT7的型号,开发板上面还板载了一个atlink-ez的仿真器,atlink-ez除了可以在线仿真和下载之外还有一个串口的功能,硬件上是通过跳线帽接到了MCU的串口1,pa9/10上面。
如下图是开发板pcb图,以及硬件资源。(左边上角的就是atlink-ez,用usb线接到pc即可):
如下是实物图:
本章的主要内容是使用板子上面的按键key1,key2作为触发源,相关原理图部分如下:
外部中断
EXINT 共计有 20 条中断线 EXINT_LINE[19:0],每条中断线均支持通过边沿检测触发和软件触发来产生 中断或事件。EXINT 可以根据软件配置,独立的使能或禁止中断或事件,并采取不同的边沿检测方式(检 测上升沿或检测下降沿或同时检测上升沿和下降沿)以及触发方式(边沿检测触发或软件触发或边沿检测 和软件同时触发)响应触发源独立的产生中断或事件。
每个IO都可以作为外部中断的功能,但是一共只能支持20条中断线的,而且四个还是其他的中断线,所以这里的使用时是分组的,中断线0对应gpio的0 pin脚,同时还不能同时使用,也就是PA0/PB0/PC0….是不能同时使用于外部中断功能的,以此类推PA1/PB1/PC1….对应的是中断线1,也不能同时使用,这样16个pin脚对应着16个中断线。
软件
初始化
首先开启复用时钟MUX,设置gpio为输入上拉、下拉或者无上下拉模式(根据设置的触发极性来设定),使能外部中断号并设置优先级,配置IO为中断源,设置触发极性以及使能外部中断。
下面是外部中断结构体:
typedef struct
{
exint_line_mode_type line_mode; /*!< choose mode event or interrupt mode */
uint32_t line_select; /*!< select the exint line, availiable for single line or multiple lines */
exint_polarity_config_type line_polarity; /*!< select the tregger polarity, with rising edge, falling edge or both edge */
confirm_state line_enable; /*!< enable or disable exint */
} exint_init_type;
line_mode:选择线模式,中断、软件触发
line_select:选择中断线
line_polarity:触发极性,上升沿、下降沿、双沿
line_enable:使能
本文使用触发源是开发板上的user按键PA0,所以使用的外部中断线0,并且触发方式设定为上升沿触发模式,并通过下面函数来设置IO为中断源,最后对外部中断0服务器函数编写服务函数。
需要注意的是并不是每个外部中断线都有单独的中断服务函数,只有0-4的中断线是每个都单独占一个中断号,也就有单独的中断服务函数,5-9是共用中断服务函数,10-15也是共用一个服务函数。
EXINT0_IRQHandler //中断线0中断服务函数
EXINT1_IRQHandler //中断线1中断服务函数
EXINT2_IRQHandler //中断线2中断服务函数
EXINT3_IRQHandler //中断线3中断服务函数
EXINT4_IRQHandler //中断线4中断服务函数
EXINT9_5_IRQHandler //中断线5-9 中断服务函数
EXINT15_10_IRQHandler //中断线10-15 中断服务函数
初始化代码:
PA0:
PC13:
中断服务函数:
中断线0:
中断线13:
注意: 一定要清除中断标志位。
测试
通过按Key1或者Key2按键触发中断,mcu响应中断后,进入中断服务函数,并输出log,
测试代码:
测试结果:(功能正常运行)
最后
有问题的可以加QQ群技术交流,同时相关代码上传到QQ群中。