stm32单片机知识点笔记(个人总结版)
1. 核心基础知识
1.1 开发准备与规范
# 1.1.1 启动模式配置(BOOT)
芯片上电时的启动区域由BOOT0和BOOT1引脚的电平组合决定。这是一个关键且易错的操作。
BOOT设置
|
Boot1 |
Boot2 |
启动区域设置 |
主要用途 | |
|
ICP |
0 |
x |
用户闪存(默认flash) |
最常用模式,从用户程序Flash启动。 |
|
ISP |
1 |
0 |
系统存储器/ISP |
ISP下载模式,芯片内置Bootloader,可通过串口等下载程序。 |
|
IAP |
1 |
1 |
内嵌SRAM |
调试模式,将程序代码下载到RAM中执行,适用于临时调试,断电后程序丢失。 |
# 1.1.2 工程结构与命名规范
良好的规范是团队协作和项目维护的基石。
文件命名:
项目名称_模块名称_功能.c (例如:ProjectA_TIM_PWM.c)
项目名称_模块名称_功能.h
变量命名:
全局变量:g_变量名 (如 g_system_tick)
静态变量:s_变量名
局部变量:使用小写字母和下划线
目录结构建议规范
文件存放:
Core : 内核、启动文件
Drivers : HAL/LL库、板级支持包
Bootloader :中间件库
Middlewares :第三方中间件 (如FreeRTOS, FatFS)
User :用户应用代码
Software :存放APP代码
README文件
# 1.1.3 库的选择与工程创建
标准库 (StdPeriph):已停止维护,仅用于维护老项目,不推荐新项目使用。
HAL/LL库:ST主推。
HAL库:抽象层次高,代码可移植性强,适合快速开发和初学者。在STM32CubeMX中图形化配置即可生成初始化代码。
LL库:更接近寄存器层的轻量级封装,效率高,适合对性能和时间控制有严格要求的模块(如高速PWM、精确ADC采样、中断服务函数)。
# 1.1.4 启动文件命名规则
启动文件后缀指明了芯片的系列和Flash容量,选对文件至关重要。
cl:互联型产品,stm32f105/107系列。
vl:超值型产品,stm32f100系列。
xl:超高密度(容量)产品,stm32f101/103系列。
ld:低密度产品,Flash小于64KB。
md:中等密度产品,Flash等于64KB或128KB。
hd:高密度产品,Flash大于128KB。
# 1.1.5 程序烧录方式
ISP:在系统编程,通过内置Bootloader(如UART、USB)更新用户Flash。
ICP:在电路编程,通过SWD/JTAG接口直接访问芯片内核,更新整个Flash(含选项字节)。
IAP:在应用编程,用户程序的一部分(IAP引导程序)通过通信接口(如UART、以太网)更新另一部分用户程序,实现产品固件远程升级。
1.2 外设核心模块详解
# 1.2.1 GPIO (通用输入输出)
核心概念:引脚必须配置为正确的模式才能正常工作。下表是理解和使用GPIO的关键。
|
模式名称 |
特点与典型应用场景 |
|
推挽输出 |
最常用输出模式,能主动输出高/低电平,驱动能力较强,用于驱动LED、蜂鸣器等 |
|
开漏输出 |
只能主动拉低,高电平靠外部上拉电阻,适用于I2C等总线、电平转换 |
|
上拉/下拉输入 |
内部连接上拉/下拉电阻,确定默认电平,用于按键检测等数字输入 |
|
浮空输入 |
引脚完全悬空,电平不确定,需外部电路确定,用于通信信号接收等 |
|
模拟输入 |
关闭数字功能,引脚直接接入ADC,用于采集模拟电压信号 |
|
复用推挽/开漏 |
引脚用于片内外设(如串口、SPI)功能,根据外设要求选择推挽或开漏 |
关键技巧:单片机通常低电平驱动能力更强(灌电流 > 拉电流),在驱动大电流负载(如LED)时,常采用“低电平点亮”的连接方式以获得更好的驱动效果和稳定性。口诀:单片机通常是高电平弱驱动,低电平强驱动
# 1.2.2 中断系统
流程链:外设事件 —> 中断控制器(EXTI/NVIC) —> CPU响应 —> 跳转到中断向量表 —> 执行中断服务函数(ISR)。
关键组件:RCC,GPIO,AFIO,EXTI,NVIC
EXTI:嵌套向量中断控制器,管理GPIO的外部中断/事件线,可配置为上升沿、下降沿或双边沿触发。
NVIC:外部中断/事件控制器,统一管理所有中断源的优先级(可嵌套)和开关。配置时需设置抢占优先级和子优先级。
中断向量表:存储在Flash起始位置的一段地址表,每一项指向一个中断服务函数的入口。启动文件startup_.s中已预定义,用户需在stm32fxxx_it.c中编写对应的服务函数。
# 1.2.3 定时器 (TIM)
STM32定时器功能极为丰富,是学习的重点和难点。
类型与分工:
|
类型 |
主要特性 |
典型型号 |
|
基本定时器 |
仅向上计数,纯定时,用于产生时基。 |
TIM6, TIM7 |
|
通用定时器 |
支持向上/向下/中央对齐计数,具备输入捕获、输出比较、PWM生成、单脉冲输出等功能。 |
TIM2, TIM3, TIM4, TIM5 |
|
高级定时器 |
在通用定时器基础上,增加带死区插入的互补PWM输出,用于电机控制、电源数字转换。 |
TIM1, TIM8 |
核心功能:
输出比较:当计数器CNT与比较寄存器CCR的值匹配时,根据模式翻转引脚电平,用于生成精确的脉冲或PWM。
输入捕获:当引脚发生特定边沿时,锁存当前计数器CNT值到捕获寄存器CCR,用于测量脉冲宽度或频率。
频率=1/周期时长 占空比=高电平时长/周期时长 分辨率=占空比变化步距
PWM:脉冲宽度调试(方波模拟正弦波)
PWM生成:通过自动重载寄存器ARR决定周期,比较寄存器CCR决定占空比。分辨率 = ARR + 1。
编码器接口:可直接读取正交编码器的两相输出,硬件自动处理方向和计数。
# 1.2.4 模拟数字转换 (ADC/DAC)
ADC:
分辨率:如12位,表示将参考电压(如3.3V)分为2^12=4096级。
采样时间:必须足够长,让采样电容电压稳定到输入电压。对于高阻抗信号源尤其重要。
多通道与扫描:可配置为连续扫描多个通道,结合DMA实现自动批量数据搬运。
参考电压:精度取决于参考电压的稳定性。建议使用独立的、高精度的外部基准源。
DAC:将数字值转换为模拟电压输出。可结合DMA和定时器生成任意波形。
# 1.2.5 DMA (直接存储器访问)
核心价值:解放CPU。在数据传输(如UART收发、ADC多通道采样、SPI/I2C通信)期间,CPU可以执行其他任务,大幅提升系统效率。
数据流与通道:不同DMA控制器有多个数据流/通道,每个通道与特定外设的请求相连。
传输模式:单次、循环传输。
数据宽度与对齐:需注意源地址、目标地址的数据宽度(字节、半字、字)要匹配。
1.3 通信接口
USART/UART:同/异步串行通信,最基本、最常用的调试和通信接口。
SPI:高速全双工同步串行接口,主从结构,需要4根线,常用于连接Flash、屏幕等。
I2C:两线制同步串行接口,支持多主多从,节省引脚,用于连接EEPROM、传感器等。
USB、CAN、Ethernet:用于更复杂的设备连接、汽车网络和网络通信。
1.4 编程技巧与建议
状态写入与取反:通常用于切换一个状态(如LED、使能信号),这是一种防止意外多次操作的有效方法。
// 示例:安全地切换GPIO引脚状态
void Toggle_LED_Safely(void) {
static uint8_t led_state = 0; // 记录当前状态
led_state = !led_state; // 先取反逻辑状态
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, (GPIO_PinState)led_state); // 再写入物理引脚
}
字符与十六进制:在C语言中,用单引号括起的字符常量是其ASCII码值,本质是一个整数。
char c = 'A'; // 等价于 c = 0x41 或 c = 65
if (uart_received_char == '\r') { // 判断是否收到回车符
// ...
}
头文件保护:防止头文件被重复包含的标准做法。
// 在头文件中
#ifndef __MY_MODULE_H
#define __MY_MODULE_H
// ... 头文件内容 ...
#endif / __MY_MODULE_H /
1.5 操作系统书籍与单片机
推荐《操作系统概念》和《现代操作系统》。虽然单片机通常运行轻量级RTOS(如FreeRTOS、RT-Thread),而非Linux/Windows这类宏内核系统,但操作系统的核心概念(任务调度、同步互斥、内存管理、中断处理、IO系统)是相通的。深入学习这些理论,能更好地理解和使用RTOS,甚至为未来开发更复杂的嵌入式系统(如基于Cortex-A系列的应用处理器)打下坚实基础。
在进行具体模块学习或项目开发时,深入查阅相应的官方文档(数据手册DS、参考手册RM、编程手册PM、HAL库用户手册UM),这是最权威的学习资料。
更多推荐



所有评论(0)