当前位置:网站首页>第四篇,STM32中断控制编程
第四篇,STM32中断控制编程
2022-07-06 17:07:00 【车水码浓】
1.中断概念
中断指的是在计算机工作期间,出现了需要立即停止正在运行的程序,转而去处理意外发生的情形。发生中断之后,CPU会去执行事先写好的处理中断的代码,处理完成后回到被打断的位置继续执行。
编写中断程序需要注意事项:
a.中断处理程序执行事件尽量短(不能睡眠以及延时),给其他程序让出CPU。
b.中断程序中访问的共享数据必须进行保护。
Stm32中断流程,Stm32中,中断源产生中断信号,提交给向量中断控制器(NVIC),中断控制器做进一步处理再提交给CPU,CPU执行中断处理中断处理程序
2.向量中断控制器(NVIC)
(1)NVIC介绍
NVIC外部中断(中断信号来自于芯片外部),一共有23个外部中断源,包括16个GPIO中断和7个其他中断。
(2)中断优先级 (数字越小,优先级越高) 这点需要特别注意。
stm32的中断优先级分为2类:抢占优先级和响应优先级
抢占优先级:抢占优先级高的中断可以打断抢占优先级低的中断
响应优先级:响应优先级高的不能打断响应优先级低的中断,当两个抢占优先级相同的两个中断同时发生,CPU优先处理响应优先级比较高的中断。抢占优先级和响应优先级一起最多占8位或者4位字节,配置两个优先级所占的位数叫做中断优先级分组。
以上NVIC的配置,通过库函数NVIC_Init()来实现
优先级分组是通过NVIC_PriorityGroupConfig来配置,该函数只能在程序开头调用,并且只能调用一次
NVIC配置函数
void NVIC_Init (NVIC_InitTypeDef* NVIC_InitStruct);
//传入NVIC初始化结构体
typedef struct
{
uint8_t NVIC_IRQChannel; /*!< 中断通道 @ref IRQn_Type */
uint8_t NVIC_IRQChannelPreemptionPriority; /*!< 抢占优先级 */
uint8_t NVIC_IRQChannelSubPriority; /*!< 响应优先级 */
FunctionalState NVIC_IRQChannelCmd; /*!< 使能/禁止 ENABLE or DISABLE */
} NVIC_InitTypeDef;
优先级分组配置函数
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
参数:
* @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
* 4 bits for subpriority
* @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
* 3 bits for subpriority
* @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
* 2 bits for subpriority
* @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
* 1 bits for subpriority
* @arg NVIC_PriorityGroup_4:4 bits for pre-emption priority
* 0 bits for subpriority
3.外部中断源EXIT
(1)EXIT主要的特性(在编写程序时常用特性)
每个中断/事件线上都具有独立的触发和屏蔽
每个中断线具有专用的状态位
支持多达23个软件事件/中断请求
(2)EXIT处理框图
(3)外部中断源映射
在stm32中,一共有16个GPIO中断,stm32中的GPIO引脚,一共有16(A~I)组引脚,每一个GPIO都能配置成一个外部中断,通过不同的引脚序号将不同中断触发源分成不同的组,这也是stm32的一个强大之处。
PA0,PB0,PC0, ... ...PH0,PI0为一组中断源,以此类推,一共有16组中断源,每一组只能有一个中断触发源工作,那么,整个中断源做多工作的也就16个外部中断。STM32F103 的中断控制器⽀持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独⽴的触发和屏蔽设置。STM32F103 的19 个外部中断为:
中断线 0~15:对应外部 IO 的输入中断。
中断线 16:连接到 PVD 输出。
中断线 17:连接到 RTC 闹钟事件。
中断线 18:连接到 USB 唤醒事件
注意:GPIO设置为外部中断时需要将其配置为中断模式
——————————————————————————————————————————————————————————————————————————————————————
4.编程实现GPIO中断,主要步骤如下。
工程中添加中断库函数文件
(1)配置中断优先级分组,下面函数中,抢占优先级和响应优先级一共占4位
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
参数: //抢占优先级占0位,响应优先级占4位
* @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority *
4 bits for subpriority
* @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority *
3 bits for subpriority
* @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority *
2 bits for subpriority
* @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority *
1 bits for subpriority
* @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority *
0 bits for subpriority
——————————————————————————————————————————-
(2)外部中断源初始化
(3)GPIO时钟和SYSCFG时钟初始化
RCC_AHB1... //初始化GPIO时钟,此处省略
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //初始化SYSCFG时钟
——————————————————————————————————————————
(4)GPIO配置为输入模式
GPIO_init(); //此处省略
- 设置GPIO和外部中断线的关系
Void SYSCFG_EXITLineConfig(uint8_t EXIT_PortSourceGPIOx,uint8_t EXIT_PinSourcex);
参数:EXIT_PortSourceGPIOx 哪一组引脚
EXIT_PinSourcex 哪个脚
———————————————————————————————————————————
(5)初始化外部中断
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
参数:
typedef struct
{
uint32_t EXTI_Line; /*!< 哪条外部中断线 @ref EXTI_Lines */
EXTIMode_TypeDef EXTI_Mode; /*!< 模式选择事件/中断 @ref EXTIMode_TypeDef */
EXTITrigger_TypeDef EXTI_Trigger; /*!< 触发边沿选择 @ref EXTITrigger_TypeDef */
FunctionalState EXTI_LineCmd; /*!< 使能/禁止 ENABLE or DISABLE */
} EXTI_InitTypeDef;
——————————————————————————————————————————
NVIC向量中断控制器初始化
(6)初始化NVIC
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
//传入NVIC初始化结构体
typedef struct
{ uint8_t NVIC_IRQChannel; /*!< 中断通道 @ref IRQn_Type */
uint8_t NVIC_IRQChannelPreemptionPriority; /*!< 抢占优先级 */
uint8_t NVIC_IRQChannelSubPriority; /*!< 响应优先级 */
FunctionalState NVIC_IRQChannelCmd; /*!< 使能/禁止 ENABLE or DISABLE */
} NVIC_InitTypeDef;
———————————————————————————————————————————
(7)实现中断处理函数
函数名在启动文件的异常向量表中去找,比如:EXTI0_IRQHandler
中断处理函数无参无返回值
中断处理函数中必须清除中断标志
———————————————————————————————————————————
(8)清除中断标志位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
//传入初始化的外部中断线
边栏推荐
- 如何判断一个数组中的元素包含一个对象的所有属性值
- [force buckle]41 Missing first positive number
- .class文件的字节码结构
- The difference between redirectto and navigateto in uniapp
- The programmer resigned and was sentenced to 10 months for deleting the code. Jingdong came home and said that it took 30000 to restore the database. Netizen: This is really a revenge
- New feature of Oracle 19C: automatic DML redirection of ADG, enhanced read-write separation -- ADG_ REDIRECT_ DML
- C Primer Plus Chapter 14 (structure and other data forms)
- Uniapp uploads and displays avatars locally, and converts avatars into Base64 format and stores them in MySQL database
- 智能运维应用之道,告别企业数字化转型危机
- Data analysis course notes (III) array shape and calculation, numpy storage / reading data, indexing, slicing and splicing
猜你喜欢
Js+svg love diffusion animation JS special effects
How to judge whether an element in an array contains all attribute values of an object
JS+SVG爱心扩散动画js特效
基于SSM框架的文章管理系统
三维扫描体数据的VTK体绘制程序设计
Stm32f407 ------- SPI communication
Dr selection of OSPF configuration for Huawei devices
stm32F407-------SPI通信
Zynq transplant ucosiii
Attention SLAM:一種從人類注意中學習的視覺單目SLAM
随机推荐
[daily problem insight] prefix and -- count the number of fertile pyramids in the farm
【批處理DOS-CMD命令-匯總和小結】-字符串搜索、查找、篩選命令(find、findstr),Find和findstr的區別和辨析
学习使用代码生成美观的接口文档!!!
深度学习简史(一)
The programmer resigned and was sentenced to 10 months for deleting the code. Jingdong came home and said that it took 30000 to restore the database. Netizen: This is really a revenge
AI超清修复出黄家驹眼里的光、LeCun大佬《深度学习》课程生还报告、绝美画作只需一行代码、AI最新论文 | ShowMeAI资讯日报 #07.06
Understand the misunderstanding of programmers: Chinese programmers in the eyes of Western programmers
Advanced learning of MySQL -- basics -- multi table query -- joint query
On February 19, 2021ccf award ceremony will be held, "why in Hengdian?"
在jupyter中实现实时协同是一种什么体验
Chapter 5 DML data operation
37頁數字鄉村振興智慧農業整體規劃建設方案
Leecode brush question record sword finger offer 58 - ii Rotate string left
JWT signature does not match locally computed signature. JWT validity cannot be asserted and should
@TableId can‘t more than one in Class: “com.example.CloseContactSearcher.entity.Activity“.
Leecode brush questions record sword finger offer 43 The number of occurrences of 1 in integers 1 to n
Advanced learning of MySQL -- basics -- multi table query -- self join
OSPF configuration command of Huawei equipment
Cross-entrpy Method
Learn to use code to generate beautiful interface documents!!!