STMCU小助手
发布时间:2021-12-20 17:00
|
14.1 初学者重要提示 1、 电源管理部分涉及到的各种低功耗方式会在后面章节中为大家讲解,当前阶段仅需了解低功耗属于电源管理部分即可。 2、 电源管理部分最繁琐的就是CPU,D1,D2,D3域的各种运行,待机,停机状态切换,这部分知识点也放在后面低功耗章节学习。6 B' {6 ~" V8 L, F7 D' R4 a 14.2 电源 电源是系统稳定运行的根本,主要分为以下几个知识点,电源供电、供电监控、电源管理和低功耗。当前阶段主要了解电源供电和硬件上电时序。 14.2.1 电源供电1 I/ E" O2 X, m- L2 h Y 学习STM32H7的电源供电,往往被一堆电源标识Vdd,Vdda,Vcap,Vss等搞迷糊,这些标识整明白了,电源供电部分也就理解了,首先看下面的框图:* q7 Z; ^$ e" `8 j3 d * @9 B6 w3 V% u' d2 c, a3 E* `
这些常用标识的解释如下:* d7 W4 c: R1 G' \# | 0 ?0 J+ I! h9 I5 h \
对于电源供电部分了解了这些知识点就够用。 14.2.2 系统上电启动+ h& h: \8 B4 z k+ y5 z" | Q! d. [ 系统上电到程序开始运行期间,H7都做哪些工作,一张时序图可以说明问题: 9 l, P8 ?. I* m2 ?1 ?. l
: O6 }( V. I3 y- m$ {5 w( I 对于上面的截图,主要看Operating mode部分,依次是Power down –> Reset -> Wait Oscillator ->HW system init -> Run -> Wait ACTVOS RDY –> Run,即断电状态 -> 复位状态 -> 等待HSI就绪->硬件初始化 -> 运行 -> 等ACTVOS位就绪 -> 正式运行。1 T t# f7 n' c, ` 详细些的执行流程如下:' H3 T+ u2 a+ \; x5 F. n; W) J( B 4 L0 [( s& S( e# k; W9 V; r 当系统上电后,POR(Power on reset 上电复位)会检测VDD供电,当VDD大于POR设置的阀值时,将使能电压稳压器,注意看VDD那条线的变化。1 ?3 _. `: t( K: x* [( h 看VCORE那条曲线,只要VOSRDY未就绪,就会一直处于复位状态。2 r) H: L) P9 I2 O* O 一旦VCORE正常输出,系统将走出复位状态,内部高速RC振荡器HSI将使能。* x& l. X/ N U$ w; N6 p HSI稳定后,将开始系统初始化,主要是Flash和可选字节的加载,这些都是由硬件完成的,CPU也将以受限的方式运行(主要是指不允许对RAM进行写操作)。% _* l6 z+ ?. Z3 N( B" \2 n! A 软件程序初始化系统,包括供电配置。当供电配置完成后,等待ACTVOSRDY位置1,完成置1后,CPU就进入正常的运行的模式,允许读写RAM了。 14.2.3 电源管理 关于电源管理部分,H7参考手册中讲解的还挺复杂的,当前阶段我们仅需了解几个重要的工作状态即可,看到这几个单词了要认识,因为官方文档中多处要用这几个标识。 为了实现各种低功耗模式,CPU和D1,D2,D3域支持的各种模式如下: CPU模式( ^" l) E4 H0 |! y CRun:运行状态,CPU和CPU子系统外设正常运行。% ^ ?* G7 ~; K9 L( z% b CSleep:休眠状态,CPU时钟停止运行,CPU子系统外设正常运行。5 [1 j, w" F- C3 B$ a . T( ] G6 r/ L: z: A) b8 b4 K CStop:停止状态,CPU和CPU子系统外设都停止运行。) G7 h. z$ [% e8 \& G * m( a+ c0 S3 c* a$ w9 d% G% S* R D1域模式& G2 }$ m! p7 }/ ~ DRun:运行状态,D1域的总线矩阵正常运行,CPU子系统运行在CRun或者CSleep模式。5 Q! R2 B+ n4 o, @' Y DStop:停机状态,D1域的总线矩阵时钟停止运行,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。6 p* p) R3 p) K7 W DStandby:待机状态,D1域的总线矩阵断电,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。 ' `: p) m1 Z4 P3 C# ]0 M$ ?% E7 W D2域模式" h; w% N1 d: Q DRun:运行状态,D2域的总线矩阵正常运行,CPU子系统在D2域中有分配的外设,CPU子系统运行在CRun或者CSleep模式。 4 W' s5 @, m/ h, d DStop:停机状态,D2域的总线矩阵时钟停止运行,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStop模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStop模式。. ]; I+ J' v; G$ N5 w ' q! v. T7 u5 c7 g' ? DStandby:待机状态,D2域的总线矩阵断电,CPU子系统没有在D2域分配外设,PDDS_D1位选择DStandby模式。或者CPU子系统在D2域中有分配的外设,CPU子系统运行在CStop模式,PDDS_D1位选择DStandby模式。 & R7 Z" ?+ B# O' {! p; S 系统/D3域模式4 r l8 O3 Y, V, ]/ t: a9 k, ] Run:运行状态,系统时钟和D3域总线矩阵时钟处于运行状态。CPU子系统处于CRun和CSleep模式,或者一个唤醒信号处于激活状态。& W& R3 V' H8 K: E * R$ ~: ~0 Q: I; c- v Stop:停止状态,系统时钟和D3域总线矩阵时钟处于停止状态,CPU子系统处于CStop模式。所有的唤醒信号都处于非激活状态,并且至少某个域的一个PDDS_Dn位选择了Stop模式。 Standby:待机状态,系统处于断电状态,CPU子系统处于CStop模式,所有的唤醒信号都处于非激活状态,并且所有域的所有PDDS_Dn位选择Standby模式。 ) k& [* R2 O5 O8 k* ] 14.2.4 电源去耦电容的选择! n# R9 P( B0 F4 M J5 P% t 每个电源对 (VDD/VSS, VDDA/VSSA ...)必须使用下述的滤波陶瓷电容去耦。这些电容必须尽量靠近芯片引脚,以确保器件正常工作。不建议去掉滤波电容来降低PCB 尺寸或成本,这可能导致器件工作不正常。 14.3 硬件复位 所有数字计算机系统都是由某种形式的震荡时钟电路驱动的。这种电路被称为系统的“脉搏”,是系统正确运行的关键。如果振荡器失灵,系统将完全无法运行,如果振荡器运行不规律,系统执行的所有与时间有关的计算都会有误差。% J; K& h* y6 A' v0 a 所有微控制器的启动流程都不通用。由于硬件的复杂性,必须运行一段由厂家定义的短小的“复位程序”来使硬件处于一种正确的状态,然后再开始执行用户程序。运行这个复位程序需要时间并且要求微控制器的振荡器已经运行。 ' @/ o& F) Y0 E* G/ ?0 N 当系统由可靠的电源供电时,一旦通电,电源迅速地达到额定输出电压,一旦断电,电源迅速地下降到0V,并且在接通的时候,电压不会降低。这时能够可靠地使用基于一个电容和一个电阻的低成本硬件复位。这种形式的复位电路称为阻容复位。 % K* J7 L! s- ~3 ]' m 如果电源不够可靠,而涉及安全性,这种简单的阻容解决方案就不合适了。% l v) h: Q6 o' r: i& R* t 14.3.1 上电复位和手动复位2 Q) M6 ]6 q; [2 A% |7 @/ @/ D STM32H7开发板的硬件复位原理图如下:
STM32这款CPU的复位引脚是低电平有效,即NRST为低电平时,CPU处于复位状态。 R173单的RC复位电路。当系统上电瞬间,C114电容两端电压可以认为是0,CPU处于复位状态。3.3V电源通过R173给C114充电,当C114的电压升到CPU的高电平门槛电压时,CPU退出复位状态转入运行状态。 在设计电路时,需要选择适当的R值和C值,以保证NRST低电平持续时间满足CPU复位最小脉宽的要求。 当按下S4轻触开关时,C114两端被短路接地,可实现手动复位CPU。2 v' |# d/ {3 M+ ?. v+ U 14.3.2 复位序列 前面第11章的13.3.1小节讲解了复位系列的相关知识,再结合本章节的上电复位和下电复位,大家会对其有一个较全面的认识,更多复位序列的知识直接看13.3.1小节即可。* H( O" f7 q6 ]3 e! b/ R% r0 S c. Y W" I2 w( Q$ y 14.4 软件复位 除了上电和手动复位,程序设计设置中还经常要用到软件复位,即调用一条函数就可以实现复位功能。此函数已经由CMSIS软件包中的core_cm7.h文件提供,函数如下:; U3 i2 a9 e0 z6 W
软件复位反映到实际硬件上,就是给硬件复位部分发一个复位信号:5 X& |* E2 p' Z4 ` P5 N! b% [
4 ?. `0 `) c; n: M' C( C 14.5 RCC时钟控制$ m+ ?" Q1 {" D2 e7 A# k STM32H7有如下六种时钟可供使用:) S0 [: R, u0 u1 R* G 5 ]" Q. U. W! p" y HSI (High-speed internal oscillator) : HSI是内部的高速RC振荡器,频率64MHz,可被用于系统时钟。优势是低成本,无需外部时钟,快速启动(仅需几个微秒),缺点是精度差,即使经过校准。4 H d% n4 Q/ k+ ^, [& w ; y$ i5 x) O2 E, U3 b+ u HSE (High-speed external oscillator):' Q5 z+ o) U* _2 y! }1 {4 N HSE是外部的高速振荡器,通过外接时钟源,有源或者无源晶振驱动,时钟范围4-48MHz。优势是精度高,缺点是增加成本。 |% h, \* {5 K/ j LSE (Low-speed external oscillator): r2 v$ a9 R6 {" L- Q7 Z6 Z% C6 Z LSE是外部的低速振荡器,通过外接时钟源,有源或者无源晶振驱动,一般接32.768KHz,主要用于RTC实时时钟。7 [! {5 _& b5 c LSI (Low-speed internal oscillator)% x5 I4 Q. O3 u' V% `$ e6 l$ g LSI是内部的低速RC振荡器,频率约是32KHz,主要用于独立看门狗和自动唤醒,也可以用于RTC实时时钟。 1 Z( e" E+ T7 H- Q5 D- ` CSI (Low-power internal oscillator) CSI是内部的低速振荡器,频率约是4MHz,相比64MHz的HSI,主要用于低功耗。 0 i }0 O G) n, A- w0 V1 d HSI48 (High-speed 48 MHz internal oscillator)0 a2 n3 }' s0 \. Z- \ HSI48是内部高速振荡器,频率约是48MHz,用于给特定的外设提供时钟,比如USB。 通过下面的时钟树再进一步的认识这几个时钟:7 }& H6 l* U: t7 O( p; @ 6 w/ s) p6 B" F5 L
9 z7 O1 V5 ?8 X6 z 14.5.1 HSE和LSE硬件设计+ D; C7 s' p" d& {; O, h: x; q HSE时钟& X+ l' F( t' ~7 b 当前V7开发板是用的25MHz晶振为HSE提供时钟,硬件设计如下:& g" w- s# p( q/ o5 s7 Z' H/ L
) w4 N% B& C2 D. L( } 晶振和负载电容需要尽可能近地靠近H7的晶振引脚,以减小输出失真和启动稳定时间。负载电容值必须根据选定的晶振进行调节。 * A |& x' O* x 对于C15和C17,我们推荐使用高质量陶瓷电容,这种电容是设计用于需要高频率的场合,并且可以满足晶体或谐振器的需求。C15和C17通常具有相同的值。4 h! w: k9 X* A- k 这里再额外补充一个知识点,HSE旁路时钟和外置晶振区别:当前V7板子是采用的外置晶振模式,高速外部 (HSE) 时钟可以使用一个4到48MHz 的晶振 / 陶瓷谐振振荡器产生: O h3 f. H" ^* a% f: X
+ |- X7 ?! T6 m: V2 A: `7 R 而bypass 旁路的意思就是不使用它,绕过它。具体到HSE旁路的话,用户直接提供4-50MHz的时钟源即可,可以使用有源晶振或者FPGA提供时钟等方式:
LSE时钟 当前V7开发板是用的32768Hz晶振为LSE提供时钟,硬件设计如下: ) k0 Q8 {% Q2 h. r2 w6 u
5 Q9 ~# W6 v/ e! ^ 6 @" a. P9 f2 A$ v' C. n2 ] 14.5.2 时钟配置" O- O9 N; l' r' `0 e! P STM32H7开发板使用的外部晶振频率是25MHz,下面分步说明如何让其通过这个频率工作到400MHz的主频。+ e7 e( p w0 L3 O7 H$ |; O 第1步:在stm32h7xx_hal_conf.h文件配置HSE_VALUE5 l" c( E: ]7 Y! q 配置的大小要跟板子的实际晶振大小匹配。 4 Y2 Y+ i1 S0 @/ [) k, G
第2步:系统上电后,在启动文件startup_stm32h743xx.s的复位中断服务程序里面会调用函数SystemInit。& i8 ~/ G6 i+ j* J2 Z' ~
以往STM32F1和STM32F4系列都会在函数SystemInit里面配置PLL锁相环,使用了HAL后,需要在main函数里面配置。当前SystemInit函数实现的功能如下: O6 l' D6 [# O4 Y" |
第12行:使能FPU单元。$ n( W8 n* z& X# c 第16 – 59行:复位RCC相关寄存器。4 b3 P# F# M+ \4 z" |1 m A1 U. f 第69 – 73行:设置中断向量表的位置。) k6 m( e4 Z1 Q- O r9 U8 g & f# k" t% t0 H2 p, L2 @9 f! y- B 第3步:在main函数的外设驱动初始化函数里面完成时钟初始化,主要是PLL锁相环,让芯片最终工作到400MHz。 14.6 总结8 s' `/ S9 H5 v! X: @& K 本章节就为大家讲解这么多,本章节的知识点相对比较多,比较杂,不容易一下子都掌握了。随着后面章节的进行,还会深入的讲解这些知识点。: Y$ Z4 i1 T. Y5 \9 k; s# z |
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
【福利三:逢7发帖赢大礼】成功利用STM32H743VI片内SRAM12和DTCM空间(完全胜利)
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
【福利三:逢7发帖赢大礼】使用惠勤致远STM32H743VI开发板+ST7796并口彩屏移植LVGL9.5并分享一些额外内容
【 逢7发帖赢大礼】7、TouchGFX中实现云彩流动效果
微信公众号
手机版