STM32hal库学习(F1)-EXTI

本文详细介绍了STM32中的NVIC中断控制器,包括其结构、中断优先级、抢占优先级、响应优先级、EXTI线的使用以及中断配置步骤。通过代码示例展示了如何设置中断优先级和启用中断服务函数。
摘要由CSDN通过智能技术生成

NVIC

中断资源

10个内核中断,60个外部中断,16个中断优先级

中断向量表

定义在启动文件,发生中断,CPU会自动执行中断服务函数

NVIC相关寄存器

相关寄存器

位数

寄存器个数

备注

中断使能寄存器(ISER)

32

8

每个位控制一个中断

中断除能寄存器(ICER)

32

8

每个位控制一个中断

应用程序中断及复位控制寄存器(AIRCR)

32

1

位[10:8]控制优先级分组

中断优先级寄存器(IPR)

8

240

8个位对应一个中断优先级

而STM32只使用高4位

此外NVIC还有中断挂起,解挂,激活标志等非常用功能

NVIC工作原理

c8ac6e61db744182a39780aff713da21.png

中断优先级介绍

抢占优先级:高抢占可以打断低抢占

响应优先级:响应高优先响应,但不能互相打断

自然优先级:中断向量表的顺序

优先级数值越小,表示优先级越高

优先级分组

优先级分组

AIRCR[10:8]

IPRx bit[7:4]分配

分配结果

0

111

 None  [7:4]

0位抢占优先级,4位响应优先级

1

110

       [7]  [6:4]

1位抢占优先级,3位响应优先级

2

101

   [7:6]  [5:4]

2位抢占优先级,2位响应优先级

3

100

   [7:5]  [4]  

3位抢占优先级,1位响应优先级

4

011

   [7:4]  None

4位抢占优先级,0位响应优先级

只需设置一次优先级,且优先级在

HAL_Init();

定义过了

NVIC配置步骤

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); //设置优先级分组2;AIRCR[10:8]

HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);//设置中断优先级,抢占2,响应0;IPRx bit[7:4]

HAL_NVIC_EnableIRQ(EXTI0_IRQn);//使能中断;ISERx

EXTI

F1拥有20条EXTI线

EXTI工作原理

64c64b91e70f42a3a080550c652a25df.png

可以分为四个步骤

边沿检测-》软件触发-》中断屏蔽/清除-》事件屏蔽


EXTI可配置事件输入CPU唤醒

唤醒功能不妨先理解未电脑的睡眠模式

ddf6ccac7546413f81e45ba614935868.png

AFIO

复用功能IO,主要用于引脚重复,把功能重新映射到另外的引脚

在定时器时再好好讲讲

中断配置布骤

5cf37f4416d2459b8aa322c48e466fab.png

56531fc6d6434dd683530f1376b0c12e.png

代码演示

void EXTI_Init()
{
    GPIO_InitTypeDef GPIO_InitStructure;

    __HAL_RCC_GPIOA_CLK_ENABLE();//使能时钟

    GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;    //上升沿中断
    GPIO_InitStructure.Pin = GPIO_PIN_0;              //PA0
    GPIO_InitStructure.Pull = GPIO_PULLDOWN;          //默认下拉
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;  //高速
    HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);        //初始化

    //中断线0-PA0
    HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);           //设置优先级,中断分组在HAL_Init();
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);                   //使能中断
}

void EXTI0_IRQHandler()                               //中断服务函数
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);             //中断公共服务函数,会清理标志位,且会调                        
                                                      //用回调函数
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)        //回调函数,编写中断内容
{

}

该文章参考正点原子资料,请勿商用

有错误地方请大家指点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油门子z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值