分享

单片机STM32开发自学第三天

 山峰云绕 2023-11-13 发布于贵州

https://m.toutiao.com/is/iRSWjuR9/ 



STM32开发——外部中断

一、外部中断

中断的作用和意义

1、实时控制:在确定时间内对相对应的事件作出响应

2、故障处理:检测到故障,需要第一时间处理

3、数据传输:不确定数据何时会来,处理串口数据接收

中断的意义:高效处理紧急程序,不会一直占用CPU资源

中断分为外部中断和内部中断,外部中断是依赖GPIO接收外设的中断请求。STM32 中的中断优先级由NVIC中的“中断优先级(8Bit 位宽)”将优先级分为:抢占优先级、响应优先级当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循自然优先级,看中断向量表的中断排序,数值越小,优先级越高。

NVIC 寄存器

NVIC 相关的寄存器定义了可以在 core_cm3.h 文件中,其定义如下:

typedef struct{ __IOM uint32_t ISER[8U]; /* 中断使能寄存器 */uint32_t RESERVED0[24U]; __IOM uint32_t ICER[8U]; /* 中断清除使能寄存器 */uint32_t RSERVED1[24U]; __IOM uint32_t ISPR[8U]; /* 中断使能挂起寄存器 */uint32_t RESERVED2[24U]; __IOM uint32_t ICPR[8U]; /* 中断解挂寄存器 */uint32_t RESERVED3[24U]; __IOM uint32_t IABR[8U]; /* 中断有效位寄存器 */uint32_t RESERVED4[56U]; __IOM uint8_t IP[240U]; /* 中断优先级寄存器(8Bit 位宽) */uint32_t RESERVED5[644U]; __OM uint32_t STIR; /* 软件触发中断寄存器 */} NVIC_Type;

NVIC 部分常用相关函数

1.
HAL_NVIC_SetPriorityGrouping 函数

ST 公司把 core_cm3.h 文件的 NVIC 相关函数封装到 stm32f1xx_hal_cortex.c 文件中,
HAL_NVIC_SetPriorityGrouping 是设置
中断优先级分组函数。其声明如下:

void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);

函数形参:是中断优先级分组号,可以选择范围:NVIC_PRIORITYGROUP_0 到NVIC_PRIORITYGROUP_4(共 5 组)

2. HAL_NVIC_SetPriority 函数

HAL_NVIC_SetPriority 是设置中断优先级函数。其声明如下:

void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority,uint32_t SubPriority);

函数形参:

形参 1 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 stm32f103xe.h。

形参 2 是抢占优先级,可以选择范围:0 到 15。

形参 3 是响应优先级,可以选择范围:0 到 15。

3. HAL_NVIC_EnableIRQ 函数

HAL_NVIC_EnableIRQ 是中断使能函数。其声明如下:

void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);

函数形参:形参 IRQn 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 stm32f103xe.h。

4. HAL_NVIC_DisableIRQ 函数

HAL_NVIC_DisableIRQ 是中断除能函数。其声明如下:

void HAL_NVIC_disableIRQ(IRQn_Type IRQn);

函数形参:形参 IRQn 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 stm32f103xe.h。

5. HAL_NVIC_SystemReset 函数

HAL_NVIC_SystemReset 是系统复位函数。其声明如下:

void HAL_NVIC_SystemReset(void);

二、EXTI

EXTI 即是外部中断和事件控制器,它是由 20 个产生事件/中断请求的边沿检测器组成。每一条输入线都可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。

①,边沿检测 ②,软件触发 ③,中断屏蔽/清除 ④,事件屏蔽

中断和事件的理解:

中断:要进入NVIC,有相应的中断服务函数,需要CPU处理

事件:不进入NVIC,仅用于内部硬件自动控制的,如:TIM、DMA、ADC

三、AFIO简介(F1)

AFIO即复用功能IO,主要用于重映射和外部中断映射配置

1、调试IO配置:AFIO_MAPR[26:24],配置JTAG/SWD的开关状态

2、重映射配置:AFIO_MAPR,部分外设IO重映射配置

3、外部中断配置:AFIO_EXTICR1~4,配置EXTI中断线0~15对应具体哪个IO口

特别注意:配置AFIO寄存器之前要使能AFIO时钟,方法如下:

__HAL_RCC_AFIO_CLK_ENABLE(); 对应RCC_APB2ENR寄存器 位0

四、EXTI 与 IO对应关系

AFIO_EXTICR1的 EXTI0[3:0]位控制(F1)

五、如何使用中断

STM32 EXTI的配置步骤(外部中断)

1,使能GPIO时钟:使能GPIO时钟

2,设置GPIO输入模式:上/下拉/浮空输入

3,使能AFIO/SYSCFG时钟:设置AFIO/SYSCFG时钟开启寄存器

4,设置EXTI和IO对应关系:选择PA~PK到底哪组IO对应EXTI输入线,AFIO_EXTICR/ SYSCFG_EXTICR

5,设置EXTI屏蔽,上/下沿:设置EXTI对应通道的屏蔽和上升沿/下降沿触发,IMR、 RTSR/FTSR

步骤2 - 5使用 HAL_GPIO_Init 一步到位

6,设置NVIC:分3步,见前面内容,即:设置优先级分组、设置优先级、使能中断

7,设计中断服务函数:编写对应中断的中断服务函数!清中断标志!

STM32 EXTI的HAL库设置步骤(外部中断)

1,使能GPIO时钟——使用:
__HAL_RCC_GPIOx_CLK_ENABLE

2,GPIO/AFIO(SYSCFG)/EXTI——使用:HAL_GPIO_Init,一步到位

3,设置中断分组——使用:
HAL_NVIC_SetPriorityGrouping(
此函数仅需设置一次

4,设置中断优先级——使用: HAL_NVIC_SetPriority

5,使能中断——使用: HAL_NVIC_EnableIRQ

6,设计中断服务函数——编写:EXTIx_IRQHandler,中断服务函数,清中断标志

STM32仅有:EXTI0~4、EXTI9_5、EXTI15_10,7个外部中断服务函数

六、通用外设驱动模型(四步法)

通用外设驱动模型

七、HAL库中断回调处理机制

中断回调函数大概原理

以上是对第三天学习的了内容做了大概的总结,由于我个人选择的是STM32F1系列的开发进行学习,所总结的大部分内容仅限于F1系列使用。由于篇幅受限,很多地方有缩略,欢迎小伙伴们在评论区相互交流。今天的内容到此结束,打工仔只能不定期更新,再见!#30天学会STM32##STM32#

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多