发新帖本帖赏金 20.00元(功能说明)我要提问
返回列表
打印
[MM32生态]

基于MM32F0140实现EXTI触发中断样例

[复制链接]
3578|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 春娇霹雳娃 于 2023-7-25 15:47 编辑

#申请原创#@21小跑堂

1.简介
1.1 EXTI简介
EXTI是外部中断/事件控制器,包含多个边沿检测器,通过检测I/O端口的电平变化判断是否产生中断/事件请求。嵌套向量中断控制器(NVIC)连接处理器核,管理低延迟的异常和中断处理。NVIC 内部包含 4 位的中断优先级配置位,从而可提供 16 个中断优先级等级。EXTI 模块包括边沿检测电路,能够产生中断请求或者唤醒事件,边沿检测支持上升沿、下降沿、任意边沿配置。每一个边沿检测电路支持独立的使能与屏蔽。

其特点为:
  • 独立触发与屏蔽每个中断
  • 软件配置中断/事件输出
  • 产生唤醒事件唤醒低功耗模式
  • 挂起寄存器保存对应每条中断线的状态
  • 所有 GPIO 支持配置为 EXTI 的触发源
  • 支持上升沿触发,下降沿触发和任意边沿触发

EXTI进行边沿检测时包含三种触发类型:
  • 上升沿触发:电平由低到高时的一瞬间称为上升沿,由上升沿的产生触发输出变化就称作上升沿触发。
  • 下降沿触发:电平由高到低时的一瞬间称为下降沿,由下降沿的产生触发输出变化则称为下降沿触发。
  • 任意边沿触发:电平产生上升沿或下降沿时触发输出变化被称作任意边沿触发。

EXTI边沿检测引脚的外部输入电平,若由于外部因素导致了引脚电平变化并产生边沿触发,则边沿检测电路输出有效信号。或门电路接收边沿检测电路输出的信号与软件事件中断寄存器(EXTI_SWIER)的输出,软件事件中断寄存器能够通过软件启动中断/事件线。当外部中断线上触发边沿事件时,挂起寄存器(EXTI_PR)的对应位被置1,可通过读EXTI_PR寄存器获取当前中断/事件状态。或门电路的输出与中断屏蔽寄存器(EXTI_IMR)的输出相与,在使能对应线中断位且边沿触发有效信号时,输出有效信号到内核的NVIC中,NVIC进行中断/事件的处理。或门电路的输出与事件屏蔽寄存器(EXTI_EMR)的输出结果相与,当使能对应事件线位且边沿触发有效信号时,输出有效信号1,即脉冲信号,该脉冲信号可用于其他外设,例如触发TIM。其框图如下图所示:


1.2 MM32F0140简介
MM32F0140使用高性能的 Arm® Cortex-M0 为内核的 32 位微控制器,最高工作频率可达 72MHz,内置高速存储器,丰富的增强型 I/O 端口和多种外设。含64KB Flash,8KB SRAM。

其电路原理图如下图所示:


MM32F0140的EXTI包含19个外部中断线,其中外部中断线EXTI0 ~ EXTI15用于I/O映射,EXTI16连接到PVD输出,EXTI19连接到比较器1输出,EXTI24连接到IWDG中断。可通过软件控制任意一个I/O端口作为EXTI的输入源,EXTI检测对应端口是否产生边沿触发,若产生边沿触发则产生中断/事件请求,GPIO对应的16个外部中断/事件映射关系如下图所示:


2.实验环境
硬件环境
  • MiniBoard (MM32F0144C6P)
  • JLINK v11.0
软件环境
  • F0140 pack
  • 串口终端软件Tera Term
  • KEIL v5.37

3.软件配置
3.1中断配置
配置并使能中断线,判断指定I/O端口对应的外部中断线与SYSCFG_EXTICRx寄存器中的控制位,(EXTI0~EXTI3使用SYSCFG_EXTICR1寄存器,EXTI4~EXTI7使用SYSCFG_EXTICR2寄存器,EXTI8~EXTI11使用SYSCFG_EXTICR3寄存器,EXTI12~EXTI15使用SYSCFG_EXTICR4寄存器)向SYSCFG_EXTICRx寄存器中外部中断线的对应位赋值,若使用PA管脚则对应位赋值为0000,PB管脚对应位赋值为0001,PC管脚对应位赋值为0010,PD管脚对应位赋值为0011。

配置边缘检测触发器的触发类型,若使用上升沿触发,则对上升沿触发选择寄存器(EXTI_RTSR)的外部中断线对应位置1;若使用下降沿触发,则对下降沿触发选择寄存器(EXTI_FTSR)的外部中断线对应位置1;若使用任意边沿触发,则EXTI_RTSR寄存器与EXTI_FTSR寄存器的外部中断线对应位均置1。中断屏蔽寄存器(EXTI_IMR)的外部中断线对应位置1,允许中断请求。当指定的外部中断线检测到配置的触发条件时,产生一个中断请求,挂起寄存器(EXTI_PR)的对应位置1。通过软件对挂起寄存器中对应写入1,使中断被清除。

配置软件中断事件寄存器(EXTI_SWIER)的外部中断线对应位为1并置1 EXTI_IMR寄存器的外部中断线对应位,也能产生中断。
<blockquote>void EXTI_EnableLineInterrupt(EXTI_Type * EXTIx, uint32_t lines, bool enable){

3.2 事件配置
配置并使能事件线,对SYSCFG_EXTICRx寄存器中外部事件线的对应位赋值;配置边缘检测触发寄存器为需要的触发类型,对EXTI_RTSR寄存器与EXTI_FTSR寄存器赋值;事件屏蔽寄存器(EXTI_EMR)的对应位置1,允许事件请求。当检测到配置的触发条件时,产生一个事件请求,挂起寄存器对应位置 1;通过对挂起寄存器对应位写1清除事件。

配置软件中断事件寄存器(EXTI_SWIER)的外部中断/事件线对应位为1并置1 EXTI_EMR寄存器的对应位,也能产生事件。
<blockquote>void EXTI_EnableLineEvent(EXTI_Type * EXTIx, uint32_t lines, bool enable){

本实验在灵动官方开发板MB-023上进行,通过配置EXTI下降沿触发中断,按下按键后产生边沿触发,进行中断处理。配置按键所使用的I/O端口的对应外部中断线,对SYSCFG_EXTICRx寄存器的EXTIx位赋值,对EXTI_RTSR寄存器和EXTI_FTSR寄存器赋值配置触发类型,使用EXTI_IMR寄存器使能中断,EXTI_PR寄存器对应位置1清除中断。若按下K2,按键对应的端口输入低电平,下降沿触发,产生中断。实验现象为按下按键K2,串口打印事件一次。

4.实验结果
整个工程框架如下图所示:


初始化外设时钟
// Enable SYSCFG clock.
RCC->APB2ENR |= (1u << 0u);
// Enable GPIOB clock.
RCC->AHB1ENR |= (1u << 18u); /* RCC_AHB1ENR_GPIOB_MASK */
初始化按键,实验使用引脚为PB2的K2按键,按键原理图如图4所示,若K2按键按下则与GND导通,因此在初始化按键时需配置该端口的工作模式为上拉输入。

/* PB2 - K2. */
    gpio_init.Pins  = GPIO_PIN_2;
    gpio_init.PinMode  = GPIO_PinMode_In_PullUp;
    gpio_init.Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &gpio_init);
配置中断
/*EXTI*/
#define BOARD_EXTI_PORT              EXTI
#define BOARD_EXTI_LINE              EXTI_LINE_2
#define BOARD_EXTI_IRQN              EXTI2_3_IRQn
#define BOARD_EXTI_IRQHandler        EXTI2_3_IRQHandler
配置中断线
/*SYSCFG*/
#define BOARD_SYSCFG_EXTIPORT        SYSCFG_EXTIPort_GPIOB
#define BOARD_SYSCFG_EXTILINE        SYSCFG_EXTILine_2
主函数为:
int main(void){
    BOARD_Init();

    printf("\r\nexti_basic example.\r\n");

    /* set up exti and syscfg. */
    app_exti_init();

    while (1){
        while ( !app_exti_event_on ) /* check interrupt status. */{}
        app_exti_event_on = false; /* clear status. */
        app_exti_event_times += 1u; /* accumulation. */
        printf("exti interrupt times:%u.\r\n", (unsigned)app_exti_event_times);}}

/* setup the external interrupt and system conf. */
void app_exti_init(void){
    /* setup syscfg for port and line. */
    SYSCFG_SetExtIntMux(BOARD_SYSCFG_EXTIPORT, BOARD_SYSCFG_EXTILINE);

    /* setup exti and enable. */
    EXTI_SetTriggerIn(BOARD_EXTI_PORT, BOARD_EXTI_LINE, EXTI_TriggerIn_FallingEdge);
    EXTI_EnableLineInterrupt(BOARD_EXTI_PORT, BOARD_EXTI_LINE, true);

    /* setup NVIC */
    NVIC_EnableIRQ(BOARD_EXTI_IRQN);}

/* EXTI IRQ Handler */
void BOARD_EXTI_IRQHandler(void){
    uint32_t flags = EXTI_GetLineStatus(BOARD_EXTI_PORT);
    if ( 0u != ( flags & BOARD_EXTI_LINE ) ) /* Interrupts. */{
        app_exti_event_on = true;}
    EXTI_ClearLineStatus(BOARD_EXTI_PORT, flags);}
串口结果如下图所示:


5.附件
1.A0140电路图: Mini-A0144_SCH.pdf (999.53 KB)
2.工程文件: mini-f0140_exti_basic_mdk.zip (523.68 KB)


使用特权

评论回复

打赏榜单

21小跑堂 打赏了 20.00 元 2023-07-28
理由:恭喜通过原创审核!期待您更多的原创作品~

评论
春娇霹雳娃 2023-7-31 14:37 回复TA
@viczhang谢谢~ 
viczhang 2023-7-30 18:22 回复TA
棒棒的! 
21小跑堂 2023-7-28 14:15 回复TA
以MM32F0140为例,详细介绍了单片机的常用功能--EXIT外部中断/事件控制器,实现了外部中断和事件两种触发方式,值得借鉴学习 
沙发
xld0932| | 2023-7-26 09:23 | 只看该作者

使用特权

评论回复
板凳
victory007| | 2023-7-31 17:41 | 只看该作者

使用特权

评论回复
地板
春娇霹雳娃|  楼主 | 2023-7-31 17:42 | 只看该作者

使用特权

评论回复
5
春娇霹雳娃|  楼主 | 2023-8-22 13:17 | 只看该作者

使用特权

评论回复
6
春娇霹雳娃|  楼主 | 2023-8-22 13:17 | 只看该作者

使用特权

评论回复
7
zhaoxqi| | 2023-8-22 23:48 | 只看该作者
通过软件对挂起寄存器中对应写入1,使中断被清除。

使用特权

评论回复
8
春娇霹雳娃|  楼主 | 2023-8-23 09:23 | 只看该作者
zhaoxqi 发表于 2023-8-22 23:48
通过软件对挂起寄存器中对应写入1,使中断被清除。

使用特权

评论回复
9
forgot| | 2023-8-24 11:30 | 只看该作者
EXTI是外部中断/事件控制器,包含多个边沿检测器,通过检测I/O端口的电平变化判断是否产生中断/事件请求。

使用特权

评论回复
10
春娇霹雳娃|  楼主 | 2023-8-25 09:02 | 只看该作者
forgot 发表于 2023-8-24 11:30
EXTI是外部中断/事件控制器,包含多个边沿检测器,通过检测I/O端口的电平变化判断是否产生中断/事件请求。 ...

使用特权

评论回复
11
sasdfji001| | 2023-8-29 14:22 | 只看该作者
这个必须点赞,很棒的例子。

使用特权

评论回复
12
kjkujkj21| | 2023-8-29 15:12 | 只看该作者
感谢楼主的分享,不错的。

使用特权

评论回复
13
udaidfa002| | 2023-8-29 15:27 | 只看该作者
感谢楼主的分享,学到了很多知识。

使用特权

评论回复
14
春娇霹雳娃|  楼主 | 2023-8-30 09:19 | 只看该作者
udaidfa002 发表于 2023-8-29 15:27
感谢楼主的分享,学到了很多知识。

使用特权

评论回复
15
春娇霹雳娃|  楼主 | 2023-8-30 09:19 | 只看该作者
sasdfji001 发表于 2023-8-29 14:22
这个必须点赞,很棒的例子。

使用特权

评论回复
发新帖 本帖赏金 20.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:灵动系统开发工程师
简介:none........

19

主题

154

帖子

3

粉丝