STMCU小助手
发布时间:2022-12-24 17:40
|
意法半导体ST与ARM的关系 ST公司购买ARM公司的内核,在此基础上添加各种外设,组成STM32芯片 也就是说,在内核之上,所有的外设都是ST公司添加上去的 ST内核通过总线矩阵与外设连接
嵌入式C语言中对于地址的操作# S7 |# x8 |: L# x; ]1 M) w / z& u1 Y5 c: k$ O6 s+ @3 W
3 f( n% s. W4 [3 B, [$ { 此时指针pointer是指向寄存器的地址0x4002800' e1 O. J/ n9 }% @ C 6 X* d( a1 b! C8 ^6 X2 d
$ v. k4 E9 X. y+ U 4 q/ p( W2 `" P2 Z% A. V" b 按照这样我们可以完成对地址的访问 - j& E5 m$ w: x* Y) j4 ^ 这些基于指针的地址操作是非常常见的,基于寄存器的编程就是通过指针完成的& Q# Q+ h) ~; C( c% [ 7 }0 u* @6 y- ~% ^# E 进一步地,考虑到定义变量会消耗内存,如果我们大量地定义地址变量,将会消耗大量的内存空间 因此可以使用宏定义,因为宏定义只是纯粹的文本替换. m% a7 w/ o& j$ I+ {$ n 如下图所示7 g7 z$ }9 E% o 6 B/ e: r9 G+ y7 U/ \
3 B6 s& ?. M0 L# [0 L 实际使用中,将GPIO外设的基地址,通过强制类型转换,将其转换成结构体指针的形式 8 w9 ^% N$ H+ O7 l' Q 可以简单理解为,建立了结构体与实际内存中的一种映射关系0 C7 k! b2 O! R! M; c 2 z9 O/ f, P" X. P, l 访问结构体成员(通过->),就等同于访问实际的一小块对应地址/ l/ n; z5 k" B7 l+ V HAL库中GPIO的配置 HAL库中对于GPIO的配置如下2 K/ L+ n2 D- |4 b 8 C- a8 G6 G& [ v/ `8 q5 Z: y
为了理解上述代码,我们可以先看以下代码
在上面的代码中,我们首先将1左移3位,然后将其以或运算的方式对寄存器中的内容进行操作,这样就打开了端口B时钟,对应的手册内容如下: " s: y& u) p: p0 I
. ~$ x- Z. Y' N- R- u$ @- V 这里对于寄存器地址是以基地址+偏移的形式进行定义的3 m* }: e% ^' m- K1 e u4 N3 M5 ]9 F0 R4 @ z8 ]$ F
7 @! l6 ]& r2 a2 k 这个寄存器的低4位,即0 1 2 3位对应0端口,即第0位,对应于GPIO的0 端口, I W; a ?$ G" e* \$ @% o E 1 O- f$ B& a/ D7 i1 k. } 假设我们的需求是:将最低2位配置为10 ,最低3,4位配置为00" ]/ c: w) C) W c 也就是说我们的需求是:将寄存器的最低4位配置为2 : O$ Z% N4 c' N( N 一种做法是,我们直接将寄存器或上1,且左移0位,即:2 S- v' ^4 q0 F) {3 F % Y' n" {) y# `
这样子,最低第2位就是1了 n4 c0 T5 `- Z: I; j 但是这样的操作存在如下问题:因为假设最低4位本来就有数值的话,比如最低4位是1110,那么你直接进行这样的操作,其实只改了最低2位,而最低第3,4位仍然是11,并没有清0。 因此,在此之前,我们还需要对寄存器待配置的位进行清0操作$ q4 q2 t* D& l/ v ( k) a; G$ o! Y6 T2 f7 @0 l
在这是,因为一次我们是操作4位,比如操作端口0时,我们用到的是第0,1,2,3位,操作端口1,我们用到的是4,5,6,7位,操作端口2,我们用到的是8,9,10,11位,6 d- l4 m5 K" V, g, x- X5 ^6 O 我们每次都是4位一起操作,所以左移了4*0,如果我们操作端口1,即4,5,6,7位,那么我们就可以左移4*1 0xf是4个1,这个数是整型变量,因此会占32位宽度。也就是说此时除了低4位是1,其他的全部都是0,这时候我们将其取反,则32位中除了低4位是0,其他全部是1。0 F* x2 J+ S! |) v5 v+ i& o 此时,我们再将这个数整体与到寄存器中,此时这个数的最低4位全是0,与上去之后,相对于寄存器的最低4位被清0了,而其他位保持不变 & K O3 D9 S+ @$ t: V+ o2 G 清完0之后再将我们要的数据或上去,那么我们想要改变的位就会发生改变了,而且不影响其他的位# N3 ^7 Q P) Z# k& F0 O3 U4 K
: L% J/ ~, |+ R. y; A7 b/ m0 Y
7 C9 a) I) ^& V. g# B. c# { STM32的板级支持包 板级支持包 (BSP) (Board Support Package) 是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好的运行于硬件主板! `+ Q* U+ W) T 3 z' v2 w4 d1 w, ?! t
板级支持包:对板上的资源功能给出实现,并且提供用户应用程序的接口。以LED灯为例,用户应用程序不需要知道GPIO的硬件特点,他只需要知道调用这个函数,就可以点亮LED灯 / d/ [2 D# k4 c. } x 我们可以自己定义BSP中的宏 a7 I2 V0 `* @ r! c& L 0 b- J+ Q9 i; _8 ? . B" p2 V( ~8 { 同样,我们可以在main函数中将板级支持包include进来7 R) r* @0 p2 x3 y 注意:板级支持包的include位置
% e [0 b6 t2 E D' k
ARM Cortex M3的哈佛架构 取指和数据分开% Y% }2 a# U) \) Z
' ]. w, }* n/ E' t 对于处理器而言,可以将其理解为没有感情的代码执行机器。只要处理器开始工作,就会不断地获 取指令,并且执行 Cortex M3对指令集的丰富
2 H9 _9 e- q7 s) I& p STM32的启动过程8 p$ x4 P d5 B9 f# N( ]1 @ STM32芯片上电以后会触发复位异常6 E/ T2 ~1 j) W4 Z8 M0 f+ d- I . s& o' ~( {! y 在中断向量表中,处理器根据触发的异常,跳转到中断向量表的特定位置,获取内容并执行( D, x0 f2 k0 u+ f; i8 f* D 即流程为: Z z! O/ N4 o: n) f( O8 P 触发异常->中断向量表->用户程序/ t5 D/ ~) G# X3 W- Z STM32的中断优先级如下:1 E+ o2 U% ~3 }3 {8 H3 U1 F( t1 |
STM32 Cortex M3中断向量表 W! |3 N2 K F( ]' Z, B! k3 s
STM32的启动文件startup_stm32l432xx.s$ Q6 Q4 W! m$ h p) K% _' k 以STML4为例,其启动文件为startup_stm32l432xx.s, ]! x( F7 b' Z' O% f& m 可以查看其注释里的简介
第一步 设置堆栈的指针& q$ T6 I3 p0 u$ y% ] & k. k; j4 \/ `5 B+ g8 W5 F X5 h 第二步 设置PC指针的值,PC指针指向当前指令+8的位置 ! Y8 l1 m& o; b$ J 第三步 设置中断向量表的入口2 ^0 m- @3 f# N( N, \8 z, @ 第四步 配置系统时钟 第五步 调main函数# V9 h3 \$ b7 f" p* v " q! \, D) s0 ` 首先,设置堆栈大小0 Q/ }. s0 s0 c
6 ]# B& z* E5 W- D# X) f i 然后,设置PC指针 注意:DCD指令会为指定的目标分配一块以字为单位的空间,一个字就是4个字节 首先为初始化堆栈分配1个字的空间,然后将对应的内容放进去 * q0 H9 h: x* y7 F. o/ ? + ~( ?. i: V; D8 R$ @- k) h
& n) C8 l) b- {; s9 v$ @" B$ B. F 此即复位异常
0 j( ]$ G+ M+ ~7 F( N' h
1 P0 D' }% m& } 在这个Reset_Handler即复位中断的服务函数,其中IMPORT了两个函数,即__main和SystemInit, f7 P( D; u& w+ X+ ^7 L' z+ q, b! a * \, t1 m/ f! r+ T" [; y2 }* v8 V& P 先将SystemInit函数的地址(即函数名)放到R0寄存器,然后BLX指令跳转到R0寄存器去执行 同样,将__main函数的地址(即函数名)放到R0寄存器,注意接下来使用的是BX跳转,跳过去就不会跳转回来了 6 l# Y% x& s( c
9 z, J+ b% c9 A% b* k3 ~8 N 注意,汇编语言中的[WEAK ]表示弱定义,即我们可以自己去实现的 ' i) y: v( |% H; A s& E R& H ————————————————" g$ q7 {, Z: B1 I 版权声明:CodeForCoffee 1 k6 k& t* r2 K: H; @+ q9 U |
【STM32H5 评测】ADC 电压表
【STM32H5 评测】基础硬件加密与随机数性能 - STM32H5E5实测硬件AES加解密、HASH运算、TRNG真随机数输出速率与稳定性
【STM32H5 评测】NUCLEO-H5E5ZJ 使用 TrustZone 安全分区系统实践测试
【STM32H5 评测】CPU核心性能 - STM32H5E5跑 RTOS,观察任务切换速度、中断响应快慢
【STM32H5 评测】介绍、环境搭建、工程测试
#双节活动 1.在CubeMX中引用touchGFX出现的问题与解决
如何将STM32CubeMX生成的CMake工程导入STM32CubeIDE
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
微信公众号
手机版