STM32G431RBT6----NVIC中断

目录

一、程序代码执行流程

 二、中断处理机制

1.NVIC解释

2.中断向量表

 3.优先级

三、串口配置

1.通用同步/异步收发器接口USART

2.电路原理图

3.CubeMX配置

4.打开工程


一、程序代码执行流程

STM32G431RBT6----NVIC中断_第1张图片

 二、中断处理机制

1.NVIC解释

stm32G431总共有111个中断源,所以有时难免有两个或者两个以上的中断一起来临,或者正在处理一个中断服务函数时突然又有一个中断来临,以上种种情况微控制器要怎样运行

呢?所以微控制器都有一个处理中断的机制。stm32系列芯片用到的机制是:NVIC。

VIC即嵌套向量中断控制器(Nested Vectored Interrupt Controller)。STM32的中有一个强大而方便的NVIC,它是属于CM4内核的器件。NVIC 控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对CM4内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32的NVIC是CM4的NVIC的一个子集。

NVIC寄存器定义在core_cm4.h文件中,CM4内核支持256个中断,其中包含了16个系统异常和240个外部中断,并且具有256级的可编程中断设置。但 STM32并没有使用CM4内核的全部东西,而是只用了它的一部分。 stm32G431芯片有111个中断,包括9个内核中断和102个可屏蔽中断,具有16级可编程的中断优先级,我们常用的就是这102个可屏蔽中断。

2.中断向量表

STM32G431RBT6----NVIC中断_第2张图片

 3.优先级

支持3个固定的高优先级和多达256级的可编程优先级,支持128级抢占。
每个中断的优先级由一个8位的寄存器来设定,分为高低两个位段。高位段表示抢占优先级,低位段表示响应(子)优先级。 CM4允许最少使用位数为3个位,即至少要支持8级优先级。
优先级以MSB对齐,简化程序的跨器件移植。

STM32G431RBT6----NVIC中断_第3张图片

 STM32只用了中断优先级寄存器的高4位

STM32 中有两个优先级的概念:抢占式优先级和响应优先级,响应优先级也称子优先级,每个中 断源都需要被指定这两种优先级。
具有 高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应 ,即中断嵌套,或者说高抢占式优先级的中断可以嵌套在低抢占式优先级的中断中。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系, 当一个中断到来后,如
果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理
如果这 两个中断同时到达 则中断控制器根据他们的响应优先级高低来决定先处理哪一个
如果他们的 抢占式优先级和响应优先级都相等 ,则根据他们在 中断向量表中的排位顺序决定 先处理哪一个
是否请求是由中断源控制的,是否响应是由响应方控制的

三、串口配置

1.通用同步/异步收发器接口USART

STM32G431RBT6----NVIC中断_第4张图片

 STM32G431RBT6----NVIC中断_第5张图片

 USART和UART有S的就是同步,没有S的就是异步

同步通信以时钟为代价找到传送数据的开始

异步通信以冗余信息为代价找到传送数据的开始,当线上的电压为高电平时处于空闲态,当起始位电平为低时说明数据开始传输;停止位就是重新置为0,使之处于高电平,重新处于空闲态,以便下次传输数据的时候能检测的低电平,重新传输数据;停止位的位数取决于处理数据的能力;校验位就是为了保证传输信息的准确性。

2.电路原理图

STM32G431RBT6----NVIC中断_第6张图片

两根线可以实现单工和半双工

三根线可以实现全双工

因此至少两根线才能实现通信

 STM32G431RBT6----NVIC中断_第7张图片

 USART1中断向量表信息

STM32G431RBT6----NVIC中断_第8张图片

3.CubeMX配置

1.以上一篇12届的节选题为背景,打开CubeMX

2.配置引脚PA9,PA10

STM32G431RBT6----NVIC中断_第9张图片

STM32G431RBT6----NVIC中断_第10张图片

 3.模式选择异步

STM32G431RBT6----NVIC中断_第11张图片

4.设置波特率、字节长度、校正等

STM32G431RBT6----NVIC中断_第12张图片

 5.串口调试工具配置相一致

STM32G431RBT6----NVIC中断_第13张图片

 STM32G431RBT6----NVIC中断_第14张图片

 6.配置中断接收字节(触发中断)-----允许串口中断

STM32G431RBT6----NVIC中断_第15张图片

中断一产生就会跳到中断子程序中去,项目中有多个中断源,就可以根据需要设置成不同的就级别,一共有0-15个优先级(看下图)

嵌套的矢量中断就是可以被优先级高的打断,所以设置中断的优先级,

 STM32G431RBT6----NVIC中断_第16张图片

 STM32G431RBT6----NVIC中断_第17张图片

抢占优先级(主优先级)与响应优先级(子优先级)的区别:
1.高抢占优先的中断可以打断正在进行的低抢让优先级的中断。
2.在抢占优先级相同的时候,响应优先级高的可以打断响应优先级的任务。
3.抢占优先和响应优先级相同的情况下,根据谁先执行。
中断数字越小,优先级更高
例子:
中断3(RTC)的抢占优先级为2,响应优先级为1
中断6(外部中断0)的抢占优先级为3,响应优先级为0
中断7(外部中断1)的抢占优先级为2,响应优先级为0
那么这三个中断的优先顺序为 中断7>中断3>中断6
 

最后,GENERATE生成代码即可

STM32G431RBT6----NVIC中断_第18张图片

4.打开工程

1.编译完成后会出现很多error和warning ,因为重新配置CubeMX之后main函数会重新写,只需要根据编译完成后出现的错误修改即可

STM32G431RBT6----NVIC中断_第19张图片

2.我重新编译后出现的错误就是缺少了一些头文件,重新添加上即可

STM32G431RBT6----NVIC中断_第20张图片

 3.在工程中可以发现多了串口的初始化函数

STM32G431RBT6----NVIC中断_第21张图片

 4.定义并写中断子程序

在uart.c中写一个简单的中断处理函数

STM32G431RBT6----NVIC中断_第22张图片

中断处理函数的定义在以下的文件中有解释,这个函数是个弱函数,意思就是当没有中断处理函数的时候就执行这个弱函数,当出现同名函数的时候就跳到同名的中断处理函数中去。

STM32G431RBT6----NVIC中断_第23张图片

 

 

你可能感兴趣的:(stm32,单片机,嵌入式硬件)