STMCU小助手
发布时间:2022-7-6 13:35
一、芯片简介
1.家族8 j) ]$ u O% V: s# e& G$ Y. ` STM32:32代表32位MCU,有32根地址线,可以寻找4GB的地址 STC15单片机是8位CPU,地址以16进制表示:0x_ _ ; STM32: 0x_ _ _ _ _ _ _ _ 容量为 2^32 = 4,294,967,296 ≈ 4×10^9 (其中 1GB = 10^9)+ J# B1 |% c) n( ^8 Z# a& Q2 q; Y ! C; ]# s/ O, J 2.产品类别 G: 支持DSP和FPU指令的可适用信号应用5 }$ x# W3 A+ u! F 像正点原子的F4,F:基础型,通用型6 w G) L. p/ f+ L9 S & K3 s# J. l: h 3.特点功能 103 : STM32基础型 407:高性能,带DSP和FPU 431: 未知7 q4 [- f7 V" B* B, @ 4.引脚数 R : 64位引脚' s; V: a4 x) e! @ t# }" @. j / s$ ]: n0 M, }) { ] 5.闪存容量, [5 W9 _: n: V( @, u- J B: 128K4 C$ m% G R* y 6.封装& t- C9 U F) t3 V X; ^ T:QFP封装 二、Cortex-M内核. \% M" m$ b a 整个芯片的组成) `' v0 M# o3 q) K2 {, I6 i* k. v % c: w* q, r& z; r( C
3 d( @( g6 V+ Z; |, P8 k# x5 |; d- \ 芯片由两大部分组成的:Cortex-M内核(ARM公司设计的部分) + 外设资源(芯片制造商设计的部分)
# b( F. |6 I. Z% X7 H Cortex-M家族有一系列的处理器,STM32F103内部使用的是Cortex-M3内核,STM32G431内部使用的是Cortex-M4内核,M4比M3多了DSP信号处理和FPU浮点运算单元8 Z$ c9 }' |! f + Q( z$ l$ f f. [* z: N+ ^ M3内核架构简化视图 : N( M7 E! [' C7 [9 S8 g; A) G
- |0 _ O# l1 u# ?) ?4 r# r NVIC:向量中断控制器,负责中断控制以及中断处理事务8 I7 j$ @/ z# h2 w 取指令单元:取指执行,通过总线将程序从程序存储器(128K闪存)取出,交给解码器( \+ m$ a) Q* c 解码器:指令解码 w7 Z0 j2 o$ H, y; ?8 ] Y+ z 0 Z a; z5 W3 q/ F/ T6 { ALU: 算术逻辑单元, 是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分,由"And Gate"(与门) 和"Or Gate"(或门)构成的算术逻辑单元,主要功能是进行二位元的算术运算 自带追踪接口和调试系统 存储逻辑运算的结果放在寄存器组中
; ?) p1 p. d9 F. Q3 o7 z9 J 想要深入学习寄存器组的作用,参考这一篇:M3/M4内核基础 % _& ^! r# i) q. g- j% }+ I 三、芯片内部结构* R% l7 E9 ^! e4 F" O6 I) S$ F 1.外设资源 STM32G4系列控制器参考手册:查看开发板外设的资源和资源的数量 # O+ ?( |) ?* e' d
# ?: M0 p! P: x2 x+ g. P
2.内部模块框图 STM32G431RB数据手册:查看外设所对应的时钟总线 6 ~" O' i/ H9 K
GPIO(A-G) : 挂载在AHB2时钟总线上: ]% F) U1 f) J! K* G 定时器1,8,15,16,17 : APB2 定时器2,3,4,I2C: APB1 AHB1分为 APB1和APB2时钟总线7 ]9 e. x S) Q' x
9 \1 U- E! I6 e$ J+ y$ l) m7 B0 | 3.时钟树9 d& T3 }# u4 y STM32G4系列微控制器参考手册: 查看时钟树
. u; U0 E* ~" q3 {" D! m, |# z 时钟树:
STM32的时钟源主要有: 内部时钟、外部时钟、锁相环倍频输出时钟。内部时钟、外部时钟又分为告诉高速、低速时钟 系统时钟有三种来源:高速外部时钟(4-48Mhz),高速内部时钟(16 Mhz), PLL锁相环倍频输出时钟 PLL锁相环时钟来源有两种HSE和HSI,经过倍频输出 1 S4 \- r* }2 i3 w, ^$ T! h
OSC_IN 和OSC_OUT对应PF0,PF1时钟输入引脚) s0 n0 i2 H+ I; o/ ]0 W \ 4 u! r$ ]7 F3 J 配置时钟:* T( ]) w V$ x& I 9 [- ]4 _$ P. D" |9 q# Z* Y, |5 E 1.在CubeMX中配置RCC选择外部时钟HSE,对应引脚起作用' h9 K& R7 i6 N( ]. d7 {+ u
2.倍频设置
* ~3 y( l# {5 D5 Q' @) C1 b 将外部时钟设置为24Mhz,经过三分频变为8Mhz, 经过锁相环乘20除以2,变为80Mhz, 将系统时钟来源选择PLLCLK , 系统时钟就是80Mhz, 再一分频得到AHB总线时钟,最终得到外设时钟。 对应代码 8 B6 n' T6 o' U( U1 a ~
在STM32G431内部结构中,各个模块都是通过总线相连接。Cortex-M4内核相当于心脏,最高频率可达170MHz,它通过总线AHB进行数据交换,AHB分为AHB1和AHB2,AHB1又分为APB1和APB2
6 u+ |1 q" [' X0 A" m 4.存储空间 查看内存映射地址:STM32G4系列微控制器参考手册( B+ S- |) k: ^5 A7 b* {7 ~2 a * D" M( r% s3 d5 ?
内存映射: 0 l0 R: e: a" h! o1 D, r
* i0 L9 q: ?; M) }8 [ 内存映射分左、右两侧, 左侧是各个资源地址的大致分化,右侧是对左侧的细化 (1)Flash(闪存)3 D; L' T3 P* b# P; W1 P Flash:程序存储器,存储代码的地方 起始地址:0x0800 0000+ x; X- l: C0 {4 c6 Z . g5 m8 L7 E5 X' p- a4 l% L% Y. y 从地址 0x0800 0000 到 0x0808 0000 ,( 8 0000 )16进制 = ( 524288 )10进制,Flash memory被分配到的空间有 524KB 大小,远大于它本身的 128KB (2)RAM! u( `6 T% R7 { RAM: 随机存储器,用于存储数据 ,起始地址:0x2000 0000 RAM分为:SRAM和DRAM7 F, M- {. |7 y1 f* E9 o' y& L# G # U2 ^7 v/ N7 X, | 1.SRAM:静态RAM(S指的static),静态指的不需要刷新电路,数据不会丢失,SRAM速度非常快,是目前读写最快的存储设备 + t& O4 s; [/ l5 K6 M7 q 2.DRAM:动态RAM(D指的dynamic),动态指的每隔一段时间就要刷新一次数据,才能保存数据,速度也比SRAM慢,不过它比任何的ROM都要快 (3)外设* J z9 n- M) p, M1 h# t1 o 外设:APB1、APB2、AHB1、AHB2 起始地址:0x4000 00006 h$ {+ Q# g! b7 X 小结: 外设起始地址为 0x4000 0000- Z( U& C j7 F: g1 h SRAM起始地址为 0x2000 0000 Flash起始地址为 0x0800 0000 详细的外设地址(在上一页的下一页)4 Y" F: W+ R0 H
可以依据蓝色字体查看外设对应寄存器分配地址* m3 O, a+ n' D' R4 k
9 O+ r/ E5 S: l/ H! ] 四、BOOT启动 STM32上电启动后,程序代码从最底层地址0x0000 0000 开始运行: j& }6 p" ], ?/ K. ?2 S
前面知道代码存储在 Flash地址0x0800 0000 中,如何让 0x0000 0000 运行的是 0x0800 0000 中的代码? 存储器地址重映射: 将 0x0800 0000 中的代码映射到 0x0000 0000 中 映射还可以将SRAM, System memory 等地址映射到0X0000 0000处9 G! Q& K6 d* R " v8 Q3 D. k [7 v$ p: j. X
映射方式的选择由BOOT1,BOOT0决定 " m: Y, u# V! Z/ U6 _
STM32G431由于BOOT0接地,所以采用的是从flash启动
所以,单片机程序执行顺序8 r- E6 b: U, c ) n( ]/ j" U$ R+ H; p
中断向量表: 嵌套向量中断控制器(Nested Vectored Interrupt Controller),STM32向量中断统一由NVIC管理, NVIC的核心功能:中断优先级分组、中断优先级的配置、读中断请求标志、清除中断请求标志、使能中断、清除中断等,外部中断信号从核外发出,信号最终要传递到NVIC(嵌套向量中断控制器)。NVIC跟内核紧密耦合,它控制着整个芯片中断的相关功能
" O0 G5 y7 Q$ ~( R$ ` DCD表示开辟一个字空间,后边的为函数名称,函数入口地址 1.存储堆栈指针位置:先获取堆栈指针位置,告诉CPU,中间变量存储再SRAM中, 从下图可以看到首先获取堆栈指针,然后就跳转到复位中断函数: R W4 F0 {' O2 n4 r9 w0 k7 p & Y0 z: P9 s' k4 k
注:按照目录的排列顺序进行检索,并执行目录中地址所指向的函数 2.复位中断函数入口地址:CPU执行到这里,下一步跳转到复位中断函数 中断复位服务函数; H4 I3 @/ y( K3 s- z6 I1 G : f$ l5 S p/ T6 M* v8 A' U" I% s0 Y% v 3.复位中断函数:CPU执行到这,先配置时钟,再跳转到主函数/ R! h) n6 w. w, t. K* } : R& ?. T5 [9 {( ]: \0 ^" `
在调用main函数之前先完成了时钟的初始化,再调用main的 4.主函数区域:执行主函数,进入while大循环0 h2 \& z1 e# [8 U& c# R% i9 O 5.其他中断函数入口地址:发生中断后,中断位置自动激发,告诉CPU中断入口地址,CPU去执行中断7 l) D: z4 g) @8 n1 C# a 所以,在启动文件执行的时候,内核和每个外设的中断服务函数的地址都是已经确定好的,地址就存放在中断向量表中,而且在启动文件里面已经写好了中断服务函数,只是这些中断服务函数为空,而且带[weak]弱定义
那么需要在C文件里面重新实现这个中断服务函数,用户写这个中断服务函数的时候,函数名必须跟启动文件里面写的中断函数名对应,因为函数名对应的就是中断服务函数的地址,如果中断服务函数名和启动文件的名字不一样,就默认启动文件里面预先写好的空的中断服务函数,而且是一个死循环,程序就会一直卡死在中断服务函数里面 五、库介绍( p0 d9 z. C4 ^" t# a 1.HAL库:ST官方推崇的新编程库;HAL是Hardware Abstraction Layer的缩写,中文名:硬件抽象层。HAL库是ST为STM32最新推出的抽象层嵌入式软件,可以更好的确保跨STM32产品的最大可移植性。HAL使用了比较大的Flash和SRAM。0 P1 P7 W$ _, g ! L2 r" I* }1 L, M 2.LL库(Low Layer):ST最近新增的库,与HAL捆绑发布,文档也是和HAL文档在一起的LL库更接近硬件层,对需要复杂上层协议栈的外设不适用,直接操作寄存器。其支持所有外设。使用方法:独立使用,该库完全独立实现,可以完全抛开HAL库,只用LL库编程完成。在使STM32CubeMX生成项目时,直接选LL库即可。如果使用了复杂的外设,例如USB,则会调用HAL库混合使用,和HAL库结合使用。编译后LL库只有HAL库的33%体积。 3.标准固件库:旧版本编程库;HAL库是ST未来主推的库,从前年开始ST新出的芯片已经没有STD库了 4.寄存器编程:原始底层编程。HAL库和标准库就是ST官方对寄存器编程进行人性化封装后的产物 : j, Y% A1 w+ Y; U. ^ 六、编译过程3 o% v7 I8 V( X. H5 \! t7 f 9 t1 d$ y$ \7 j# }$ [1 @
1.将 .c 文件编译和 .s 文件汇编,生成 .o 目标文件& \6 Y5 x# M" v8 @3 G3 L6 |. l 0 b( s& |& ]5 P( j- i 2.将 .o 对象文件和内存映射规范文件 通过连接器 生成可执行映像文件。MDK是生成 .axf 可执行文件( \5 N/ N, J- I; Y 6 ^( W" I* ~* H' Z" z. r9 \2 k 3.通过闪存编程器将可执行映像文件下载到芯片的Flash中4 d/ F$ K% a" N" s4 b C# \ 8 Q9 H: S. r: s 6 E( E0 d+ d; b/ [& _ y |
经验分享 | 基于STM32G4芯片TIM+SPI+DMA应用示例
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°相位同步方案
微信公众号
手机版