STM32——MCU/传感器/模块相关——学习笔记

STM32——MCU/传感器/模块相关——学习笔记

H_Haozi Lv3

A. 前情提要

隔~ 补充巩固一下基础知识

B. STM32

B.1 启动流程

B1.1 MAP文件

在了解启动流程之前,先了解一下OUPUT文件里面有什么,程序通过MDK编译后会产生很多文件,比如.o .axf .hex ,.map等文件,这里主要介绍这四种:

  • .o : 可重定向对象文件,每个.c/.s文件编译后都会对应一个.o文件

  • .axf: 可执行对象文件,由很多.o文件链接生成,仿真的时候需要用到

  • .hex:INTL HEX格式文件,用于下载到MCU运行,由.axf转化而来

  • .map连接器生成的列表文件,用来分析程序存储占用情况非常有用

MAP文件中包括了各种 .c文件,函数,符号等的地址,大小,引用等信息,可以用来分析c文件占用FLASH和RAM的大小。整个文件主要由五部分组成:

  1. 程序段交叉引用关系
  2. 删除映像未使用的程序段
  3. 映像符号表
  4. 映像内存分布图
  5. 映像组件大小

下面是map文件的局部内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
Component: ARM Compiler 5.05 update 1 (build 106) Tool: armlink [4d0efa]

==============================================================================

Section Cross References

main.o(i.main) refers to delay.o(i.delay_init) for delay_init
main.o(i.main) refers to led.o(i.LED_Init) for LED_Init
main.o(i.main) refers to delay.o(i.delay_ms) for delay_ms

/*.......*/


==============================================================================

Removing Unused input sections from the image.

Removing system_stm32f10x.o(i.SystemCoreClockUpdate), (164 bytes).
Removing delay.o(i.delay_us), (76 bytes).
Removing sys.o(.emb_text), (6 bytes).

/*.......*/

91 unused section(s) (total 3322 bytes) removed from the image.

==============================================================================

Image Symbol Table

Local Symbols //局部符号

Symbol Name Value Ov Type Size Object(Section)

../clib/angel/boardlib.s 0x00000000 Number 0 boardinit1.o ABSOLUTE
../clib/angel/boardlib.s 0x00000000 Number 0 boardinit3.o ABSOLUTE

/*.......*/

Global Symbols //全局符号

Symbol Name Value Ov Type Size Object(Section)

BuildAttributes$$THM_ISAv4$P$D$K$B$S$PE$A:L22UL41UL21$X:L11$S22US41US21$IEEE1$IW$USESV6$~STKCKD$USESV7$~SHL$OSPACE$ROPI$EBA8$UX$STANDARDLIB$REQ8$PRES8$EABIv2 0x00000000 Number 0 anon$$obj.o ABSOLUTE
__ARM_use_no_argv 0x00000000 Number 0 main.o ABSOLUTE

/*.......*/

==============================================================================

Memory Map of the image

Image Entry point : 0x080001cd

Load Region LR_1 (Base: 0x08000000, Size: 0x00000784, Max: 0xffffffff, ABSOLUTE)

Execution Region ER_RO (Exec base: 0x08000000, Load base: 0x08000000, Size: 0x00000764, Max: 0xffffffff, ABSOLUTE)

Exec Addr Load Addr Size Type Attr Idx E Section Name Object

/*.......*/

0x08000398 0x08000398 0x0000004c Code RO 241 i.LED_Init led.o

/*.......*/

==============================================================================

Image component sizes


Code (inc. data) RO Data RW Data ZI Data Debug Object Name

144 22 0 4 0 1664 delay.o
76 8 0 0 0 659 led.o
64 8 0 0 0 223083 main.o

/*.......*/

----------------------------------------------------------------------
1296 112 336 32 1736 245427 Object Totals
0 0 32 0 0 0 (incl. Generated)
6 0 0 2 0 0 (incl. Padding)

----------------------------------------------------------------------

Code (inc. data) RO Data RW Data ZI Data Debug Library Member Name

8 0 0 0 0 68 __main.o
0 0 0 0 0 0 __rtentry.o

/*.......*/

----------------------------------------------------------------------
260 12 0 0 96 576 Library Totals
4 0 0 0 0 0 (incl. Padding)

----------------------------------------------------------------------

Code (inc. data) RO Data RW Data ZI Data Debug Library Name

256 12 0 0 96 576 c_w.l

----------------------------------------------------------------------
260 12 0 0 96 576 Library Totals

----------------------------------------------------------------------

==============================================================================


Code (inc. data) RO Data RW Data ZI Data Debug

1556 124 336 32 1832 244855 Grand Totals
1556 124 336 32 1832 244855 ELF Image Totals
1556 124 336 32 0 0 ROM Totals

==============================================================================

Total RO Size (Code + RO Data) 1892 ( 1.85kB)
Total RW Size (RW Data + ZI Data) 1864 ( 1.82kB)
Total ROM Size (Code + RO Data + RW Data) 1924 ( 1.88kB)

==============================================================================


B1.2 启动模式

M3/M4/M7内核按下复位键之后:

  1. 从地址 0x0000 0000 取出堆栈指针 MSP 的初始值,该值就是栈顶地址
  2. 从地址 0x0000 0004 取出 程序计数器指针 PC 的值,该值是复位向量

不同厂商会把 这两个地址映射到不同的位置,比如对于stm32F1,在系统复位后,STSCLK的第四个上升沿,BOOT引脚的值会被锁存

BOOT1 BOOT0 启动模式 0x00000000 映射地址 0x00000004 映射地址
x 0 主闪存(Main Flash) 0x08000000 0x08000004
0 1 系统存储器(System Memory / Bootloader) 0x1FFFF000 0x1FFFF004
1 1 内置 SRAM(SRAM) 0x20000000 0x20000004

第一种最常用,第二种是bootloader下载使用,第三种不常用,这里也主要介绍F1,其它系列大家可以网上查询

B1.3 启动过程 (内部Flash启动为例)

Reset -> 获取MSP值(0x08000000)->获取PC值(0x08000004)->Reset_Handler(复位中断函数)->启动文件.s->main函数

所以下面主要介绍启动文件.S

B1.3 启动文件

初始化MSP->初始化PC->设置堆栈大小->初始化中断向量表(__Vercors)->调用初始化函数(比如Systeminit(可选))->调用__main(标准C库,执行一系列设置后调用main函数)

flowchart TD
  StartAsm["startup.s 开始 (汇编入口)"]
  Init_MSP["设置初始堆栈指针 MSP\n(来自 Vector[0])"]
  Option_Vec["(可选) 设置或拷贝向量表到固定地址"]
  DisableIRQ["(可选) 禁用中断"]
  CopyData["拷贝 .data 段到 RAM"]
  ClearBSS["清零 .bss 段"]
  CallSystemInit["(可选) 调用 SystemInit() 配置时钟等"]
  Call___main["调用运行时起始函数(如 __main/_start)"]
  JumpMain["跳转到 main()"]

  StartAsm --> Init_MSP
  Init_MSP --> Option_Vec
  Option_Vec --> DisableIRQ
  DisableIRQ --> CopyData
  CopyData --> ClearBSS
  ClearBSS --> InitCtors
  InitCtors --> CallSystemInit
  CallSystemInit --> Call___main
  Call___main --> JumpMain

B.2 低功耗

B.2.1 电源分布

stm32f1的电源主要由3.3V供电,分为模拟供电区(VDDA),数字供电区(VDD),还有存储用的区域(这里通常为1.8V),最后还有一个VBAT的供电区(主要给RTC使用)

B.2.2 低功耗模式

主要有四种模式: 运行模式,睡眠模式,停止模式,待机模式,通常一上电默认的是运行模式

对于stm32整体可以理解成 电压调节器+时钟系统 分别对外设(SPI,IIC等),CM3内核,存储器三部分输入

  • 运行模式

所有外设都正常工作
供应电流(典型值):51mA

  • 睡眠模式时钟系统停止对内核的输入,但其它都正常,即外设可以正常使用(比如DMA)

优点: 对系统影响小
缺点: 节能效果最差
唤醒: 如果立即休眠,使用任意中断唤醒
唤醒时间: 1.8us
供应电流(典型值): 29.5mA

  • 停止模式时钟系统直接关闭,但是电压调节器开着,即存储器还有内容,程序不会复位

优点: 节能效果好,且程序不会复位
缺点:恢复时间长,时钟系统需要重新启振
唤醒: 使用任意外部中断唤醒,唤醒后的时钟会变成HSI RC震荡器(8MHz),所以需要唤醒后重新设置时钟
唤醒时间: 5.4us
供应电流(典型值): 35uA

  • 待机模式 : 关闭时钟系统和电压调节器

优点: 节能效果最好
缺点:程序会复位,少数条件唤醒
唤醒: WKUP引脚的上升沿,RTC闹钟(事件),NRST引脚的外部复位,IWDG复位
唤醒时间: 50us
供应电流(典型值): 3.8uA

B.2.3 例程代码

下面主要给出三种,模式如何进入,以及相关注意特征

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* 进入 Sleep(CPU 低功耗等待中断) */
void Enter_Sleep_Mode(void)
{
/* 可在此关闭/降频外设以节省更多功耗 */
/* 使用 CMSIS 或 StdPeriph: __WFI() */
__WFI();
}

/* 进入 Stop:使用标准库 PWR_EnterSTOPMode(StdPeriph) */
void Enter_Stop_Mode(void)
{
/* 使能 PWR 外设时钟(确保已经使能) */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

/* 如果使用低功耗寄存器需要设置 */
/* 进入 STOP (内部稳压器保持) 并使用 WFI 进入 */
PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);

/* 代码在此处会被唤醒后继续执行(唤醒后时钟需重建) */
//这里可以重新初始化时钟
}

/* 进入 Standby:StdPeriph 提供 PWR_EnterSTANDBYMode() */
void Enter_Standby_Mode(void)
{
/* 清 WU 标志,确保下一次能唤醒 */
PWR_ClearFlag(PWR_FLAG_WU);

/* 进入待机(不会返回,唤醒通常触发复位) */
PWR_EnterSTANDBYMode();

//这里的代码不会执行,会直接复位
}

C 传感器常用

这里主要根据我的具体项目/比赛来介绍:


C.1 电赛相关(2025-省)

  • 常见七路循迹模块

协议: GPIO 直接读取

探测距离:10~50mm

使用方式: 通过调节模块上的电位器更改基准电压,通过电压比较器判断基准电压和检测到的电压(接收管,根据光照灰度等),然后输出固定的数字量IO值,通过stm32读取之后作为循迹算法的输入

  • 九轴陀螺仪 JY901

协议: 串口/IIC,通常使用串口

精度: 静态情况: 0.05°(x,y) 1°(z) 动态情况: 0.1°(x,y) 1°(z)

回传速率: 0.2~200Hz回传速率,需要通过上位机来配置陀螺仪的回传速率,以及设置回传什么东西

速率: 串口–最小 4800bps 最大230400bps(默认9600bps) IIC分两种情况,软件(100K)硬件(400k)

  • K230

  • 520电机

  • 步进电机

  • 舵机

C.2 电赛备赛相关

  • 激光测距模块

  • openmv

  • 角度传感器(不是陀螺仪)

C.3 无人机

  • 陀螺仪同上

  • 气压计

  • 光流传感器

C.4 IMX6ULL相关

  • 陀螺仪同上

  • 气压计

  • 光流传感器

  • 温湿度传感器

  • GPS模块

留言

有问题请指出,你可以选择以下方式:

  1. 在下方评论区留言
  2. 邮箱留言
  • Title: STM32——MCU/传感器/模块相关——学习笔记
  • Author: H_Haozi
  • Created at : 2024-11-01 12:11:21
  • Updated at : 2025-10-30 15:33:31
  • Link: https://redefine.ohevan.com/2024/11/01/embedded_mcu/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments