STMCU小助手
发布时间:2023-3-3 14:00
|
一、程序代码执行流程5 C r/ f1 f1 @5 d+ N, S0 l. T+ c0 a4 z 3 s- x! i- G0 g
二、中断处理机制 1.NVIC解释- b0 b$ ~* w: K, ?+ ` stm32G431总共有111个中断源,所以有时难免有两个或者两个以上的中断一起来临,或者正在处理一个中断服务函数时突然又有一个中断来临,以上种种情况微控制器要怎样运行呢?所以微控制器都有一个处理中断的机制。stm32系列芯片用到的机制是:NVIC。. v) D4 B ?9 c. E* Y 0 a( {& r3 d( n7 `! L VIC即嵌套向量中断控制器(Nested Vectored Interrupt Controller)。STM32的中有一个强大而方便的NVIC,它是属于CM4内核的器件。NVIC 控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对CM4内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32的NVIC是CM4的NVIC的一个子集。# Z8 M& f7 b; Y5 l* _ s. }! u1 j: V8 e5 I, z1 c NVIC寄存器定义在core_cm4.h文件中,CM4内核支持256个中断,其中包含了16个系统异常和240个外部中断,并且具有256级的可编程中断设置。但 STM32并没有使用CM4内核的全部东西,而是只用了它的一部分。 stm32G431芯片有111个中断,包括9个内核中断和102个可屏蔽中断,具有16级可编程的中断优先级,我们常用的就是这102个可屏蔽中断。' l% h n) Z9 T4 G+ l 2.中断向量表* b" w& Q. @& e 6 U W/ w! o5 b/ o9 D! m0 K
/ I1 B2 u! r/ w) i8 S8 e, e 3.优先级9 x; Y& I7 ~3 x6 S 支持3个固定的高优先级和多达256级的可编程优先级,支持128级抢占。6 z- I0 e6 M$ p1 _# X* Z* o 每个中断的优先级由一个8位的寄存器来设定,分为高低两个位段。高位段表示抢占优先级,低位段表示响应(子)优先级。 CM4允许最少使用位数为3个位,即至少要支持8级优先级。$ B: U$ S: N/ S 优先级以MSB对齐,简化程序的跨器件移植。 5 r- L3 z9 f+ o; u& }
' t& n3 o$ U! P T STM32只用了中断优先级寄存器的高4位 STM32 中有两个优先级的概念:抢占式优先级和响应优先级,响应优先级也称子优先级,每个中 断源都需要被指定这两种优先级。9 p- G# p8 w" {$ R, F! I* _& X4 } 具有 高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应 ,即中断嵌套,或者说高抢占式优先级的中断可以嵌套在低抢占式优先级的中断中。 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系, 当一个中断到来后,如9 C: B3 I5 ? l$ O' h p9 _+ g, B 果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理 。* j3 |. i! e( m* Y 如果这 两个中断同时到达 , 则中断控制器根据他们的响应优先级高低来决定先处理哪一个 ; 如果他们的 抢占式优先级和响应优先级都相等 ,则根据他们在 中断向量表中的排位顺序决定 先处理哪一个0 j9 g M1 S8 N0 ^7 e8 l& Z' R/ W 是否请求是由中断源控制的,是否响应是由响应方控制的 三、串口配置( _8 y$ K, U. J1 L- J. @/ q 1.通用同步/异步收发器接口USART3 T1 G6 |3 n. Y # f7 b, a8 R$ k- t2 I
& I. X- i( U& V5 V! y0 S* v USART和UART有S的就是同步,没有S的就是异步 同步通信以时钟为代价找到传送数据的开始8 R3 O5 W4 A, \5 N 异步通信以冗余信息为代价找到传送数据的开始,当线上的电压为高电平时处于空闲态,当起始位电平为低时说明数据开始传输;停止位就是重新置为0,使之处于高电平,重新处于空闲态,以便下次传输数据的时候能检测的低电平,重新传输数据;停止位的位数取决于处理数据的能力;校验位就是为了保证传输信息的准确性。% _" Z2 r6 r, T8 c6 d 2.电路原理图 u$ j$ `/ \4 \4 n3 y / x' }9 z/ m& Z$ P# a
- J: v# u& T! ^6 R( _5 |6 R 两根线可以实现单工和半双工" m! M8 v7 S% ~. g- m4 P [ 三根线可以实现全双工; B7 t/ b. W8 g 因此至少两根线才能实现通信* i3 d7 @4 ^, p% A3 [
- V0 `, Y4 Y. B# f % { g( J. {& h% ]( z USART1中断向量表信息 5 D3 Y' |1 |7 v% `. j% `
3.CubeMX配置 1.以上一篇12届的节选题为背景,打开CubeMX ; M+ a' m1 t6 |9 G) n5 [ 2.配置引脚PA9,PA10
/ `; J( u/ I( ?: q F: _7 ^
3.模式选择异步# P- ?% ]) s) r2 ?0 U 7 v3 {) W4 u% d% O4 w
4.设置波特率、字节长度、校正等" R, U4 r6 Z$ G3 q' a B8 c& I3 v 1 ]( ~+ L9 e6 b7 G
. Z- c( h& K" W' B( w& N 4 g9 D, g6 t+ W0 Y9 r- u# A 5.串口调试工具配置相一致; d! [8 R! Z. D1 n% x. C4 \
, G% ~' u4 I( U! A% t
6.配置中断接收字节(触发中断)-----允许串口中断
中断一产生就会跳到中断子程序中去,项目中有多个中断源,就可以根据需要设置成不同的就级别,一共有0-15个优先级(看下图) 3 B0 c( T* `& R: J0 e 嵌套的矢量中断就是可以被优先级高的打断,所以设置中断的优先级,& p. R- |" [; {1 l
) ~! u, k" @7 @+ t! q0 K
抢占优先级(主优先级)与响应优先级(子优先级)的区别: 1.高抢占优先的中断可以打断正在进行的低抢让优先级的中断。- ?- m/ Q& g% c# r& d# N h 2.在抢占优先级相同的时候,响应优先级高的可以打断响应优先级的任务。 3.抢占优先和响应优先级相同的情况下,根据谁先执行。 中断数字越小,优先级更高' G& G$ K, L3 i3 J9 [1 @6 m 例子:( o5 |- Y8 Q8 D$ L2 n# C 中断3(RTC)的抢占优先级为2,响应优先级为19 s3 ]1 a. N5 Z* N. G( `+ x& K 中断6(外部中断0)的抢占优先级为3,响应优先级为0$ e* z8 L6 |) L# l8 P+ \ 中断7(外部中断1)的抢占优先级为2,响应优先级为0 那么这三个中断的优先顺序为 中断7>中断3>中断6 / Z! ^1 ^9 y% C1 D/ h 最后,GENERATE生成代码即可! Q( [+ A5 c0 q% Z: |6 f
4.打开工程 1.编译完成后会出现很多error和warning ,因为重新配置CubeMX之后main函数会重新写,只需要根据编译完成后出现的错误修改即可9 J8 ^7 c7 y* p: m$ N
0 I% q1 a( q& Z- I6 B8 L r1 o 2.我重新编译后出现的错误就是缺少了一些头文件,重新添加上即可 . ~. I# ~$ _% J% |2 ?* A; N
3.在工程中可以发现多了串口的初始化函数( o( |' E6 n3 K: d( Q* L, h
* q4 v. v. m6 _, M' G1 r 4.定义并写中断子程序 在uart.c中写一个简单的中断处理函数( j+ r! O) g9 n9 K( W+ R 2 ]$ X3 j) |* h0 I8 {: i
中断处理函数的定义在以下的文件中有解释,这个函数是个弱函数,意思就是当没有中断处理函数的时候就执行这个弱函数,当出现同名函数的时候就跳到同名的中断处理函数中去。7 B C/ p% y5 ]0 L; j
, y5 I. J& z) \/ Z3 p" Z' E) Z* } ————————————————3 K7 }$ i% e# {) S y6 U 版权声明:想要优秀点儿% G i- |; L' Q! U5 ~( T- x; {/ S * B- A. W! C4 x . o i: P/ b/ s: k |
STM32G47x 双 Bank 模式下在线升级
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【经验分享】STM32G4之基本定时器
NUCLEO-G474RE 扩展 LSM6DSO 传感器数据融合实操演示全解析
经验分享 | STM32G474 高精度定时器同步功能全解析 从内部互联到多芯片协同的实现方案
经验分享 | STM32G4双BANK启动应用演示
STM32G4 LPTIM+DMAMUX 实现并行输出应用示例
实战经验 | LAT1578 SAU对NSC分区的影响
经验分享 | STM32G474 HRTIM Triggered-half模式实现两相交错电源180°相位同步方案
STM32大神笔记,超详细单片机学习汇总资料
微信公众号
手机版