铁头山羊视stm32-HAL库
目录
一、所有干货
1.CubeMX 在 System Core → SYS → Debug 里给你几个模式:
2.当没有选SWD,即选择了NO debug该怎么烧录程序
3.debug的时候,关掉代码优化
4.cubeMX自动生成的代码里面的注释
二、GPIO
1.GPIO编程接口
2.GPIO两灯交替点亮实验
3.GPIO按钮按下实现板载灯亮
三、UART
1.USART和UART
2.串口的选择
3.串口的重要参数
4.串口的编程接口
5.串口的简单发送数据实验
6.串口的简单接收数据实验
四、I2C
1.I2C的cubeMX配置
2.I2C的编程接口
3.OLED的芯片-SSD1306
(1)芯片手册
(2)芯片(OLED)的地址
(3)根据手册得到的使得OLED常亮的指令
4.I2C实验:点亮OLED屏幕
五、时钟
1.时钟树的介绍
2.时钟树属于时序逻辑电路
(1)时序逻辑电路
(2)因为都是时序电路,所以需要时钟信号
3.怎么给每个外设分配不同的时钟
4.时钟树呈上启下关键节点:SYS CLK
5.时钟树在cubeMX的配置
(1)首先开启SYS调试模式
(2)其他额外的值得注意的时钟传输的节点
6.开启默认情况下的8MHz
(1)默认情况下,内核的执行频率是8MHz
(2)测试8MHz
7.开启每个片上外设的时钟的最大频率
(1)首先配置时钟
(2)之后配置时钟参数
(3)配置最大时钟频率
六、SPI
1.SPI的波特率选取的原则
2.SPI的HAL的编程接口
3.HAL库实现寄存器的点灯实验
(1)先实现按下松开的时候实现亮灯/灭灯
(2)注意按钮的消抖
(3)在cubeMX配置SPI控制flash
》首先在cubeMX配置SPI
(4)向Falsh写数据,和读取数据(本质都是给Flash发 指令)
》1.写数据
》写使能
》扇区擦除
》页面编程
》2.读数据
(5)在程序最开始判断Flash的状态
七、中断
1.中断的注意点
2.中断的HAL编程接口
3.中断HAL实验:实现边闪灯边读取值
(1)首先使用cubeMX配置PC13实现灯的闪烁
(2)之后使用cubeMX配置USART,注意配置中断的开关,因为就一个中断所以不要配置优先级,默认的就行
(3)使用编程接口实现中断
八、定时器
1.定时器的类型
2.HAL编程接口
(1)时基单元编程接口
(2)输出比较编程接口
(3)输入捕获编程接口
(4)从模式控制器编程接口
3.定时器的cubeMX配置
4.使用定时器的时基单元实现:自制延迟函数以及获取当前时间函数
(1)首先自制延迟函数
(2)配置时基单元
(3)使用cubeMX配置TIM的时基单元和中断
(4)main方法调用中断和延迟函数
(5)验证延迟函数
5.使用定时器的输出比较实现:呼吸灯
(1)首先使用cubeMX配置时基单元
(2)使用cubeMX配置输出比较
(3)呼吸灯实现
6.使用定时器的输入捕获实现:HC-SR04传感器的超声波测距实验
(1)超声波测距原理
(2)cubeMX配置
(3)对生成的代码进行完善
(4)注意HC-SR04声波传达最长时间和分辨率选择
7.定时器的从模式控制器实现:测试输入的PWM信号参数
(1)cubeMX配置
(2)实验的原理和实现
(3)格式化输出
8.【新增】定时器实验:从模式控制器的编码器模式的输入输出
(1)AB编码器
》旋转这个编码器,AB的触点会接触 / 断触 金属片。
》也可以充当按钮
》当金属片旋转,
》三种编码器模式
(2)AB编码器的核心
(3)实验原理
(4)值得关键注意的地方:
(5)实验执行
九、ADC
1.最理想情况下,ADC每秒最多执行多少次转换
2.ADC编程接口
3.ADC标志位
4.ADC实验:使用光敏传感器实现强弱光导致的板载灯的亮灭
(1)实验思路
(2)采样时间计算
(3)cubeMX配置
(4)实现
5.ADC实验:使用光敏传感器和VOFA实现连续电压的显示
(1)使用定时器设置采样的时间间隔,然后VOFA实现将多点连起来
(2)配置cubeMX
》定时器的ccx事件来源:
》定时器的TRGO
(3)实现
一、所有干货
1.CubeMX 在 System Core → SYS → Debug
里给你几个模式:
1. No Debug
意思是:关闭调试功能,调试引脚都释放出来当普通 GPIO 用。
缺点:你就不能用 SWD/JTAG 进行调试或下载程序了,只能通过串口/ISP/Bootloader 烧录。
一般只有在 引脚紧张、产品量产 且不再调试时才会这样配置。
2. Serial Wire (SWD) ⭐常用
用 2 根信号线(SWDIO + SWCLK)+ GND + VCC 进行调试。
占用引脚少,但功能齐全(下载、调试、寄存器查看、单步运行等)。
这是 STM32 默认最推荐的调试方式,大部分开发板(比如 STM32F4/F1/F7/Nucleo/Discovery)都走 SWD。
为什么推荐?
节省引脚(只要 2 根),GPIO 更宽裕
支持全速调试
Keil、CubeIDE、ST-Link、J-Link 都支持
3. JTAG (4 pins / 5 pins)
JTAG 4 pins:TCK、TMS、TDI、TDO
JTAG 5 pins:TCK、TMS、TDI、TDO、nTRST
JTAG 协议历史更久,功能比 SWD多一些(比如支持级联多个芯片调试)。
缺点是:要占用 至少 4 个 GPIO,对小封装芯片来说太浪费。
现在一般只在需要链路调试、多核/多器件调试时才用。
4. Trace Asynchronous Sw (SWO Trace)
在 SWD 的基础上,额外开一个 单根 SWO 引脚,用来输出调试追踪信息。
主要用途:实时 printf、事件跟踪、性能分析(ITM / SWV Trace)。
如果你想在 Keil 或 CubeIDE 里看到 实时调试打印、周期性变量值,就可以选这个。
占用引脚比 SWD 多 1 根。
📌 总结对比表
选项
占用引脚
功能
使用场景
No Debug
0
不能调试
量产或引脚极度紧张
Serial Wire (SWD)
2
下载 + 调试,主流方式
默认推荐,开发调试
JTAG (4/5 pins)
4 / 5
下载 + 调试,多芯片调试
需要 JTAG 链路时
Trace Asynchronous Sw
3
SWD + Trace 实时打印
需要在线性能分析/调试时
2.当没有选SWD,即选择了NO debug该怎么烧录程序
方法:使用bootloader
地址:[STM32 HAL库]使用bootloader清除程序_哔哩哔哩_bilibili
3.debug的时候,关掉代码优化
在 Keil5 里用 debug 调试代码 时,通常建议把 代码优化关掉,主要原因是:
🔹1. 优化会改变代码结构
编译器优化(O1/O2/O3 等)会:
删除“看似无用”的代码;
把变量放到寄存器里,不再分配内存;
合并/重排代码逻辑,甚至把多行代码压缩成一条指令。
结果就是:
👉 你在 源码单步调试 时,代码执行顺序和你看到的 C 语言顺序对不上,断点可能跳来跳去。
🔹2. 变量可能“消失”或不可见
在开启优化后:
一些局部变量可能被优化掉,调试窗口里看不到;
或者同一个变量值随时在寄存器和内存间切换,导致 观察到的值不稳定。
🔹3. 单步调试不准确
当你在 逐行 F11/F10 单步时:
编译器可能把多行合并成一条汇编指令 → 你点一次却跳过几行;
或者某些 if/for 的代码块被优化展开,导致调试时 源代码与汇编不同步。
🔹4. 便于学习和排错
关掉优化后:
每一行 C 代码几乎都会对应到一条或几条汇编,源码和执行流一致;
变量会完整保留在内存里,方便 观察/修改变量值;
更容易定位问题,尤其是新手学习或者调试硬件外设时。
✅总结
在 开发和调试阶段:建议关闭优化,保证调试行为与源码一致。
在 正式发布/下载固件阶段:再开启合适的优化等级(比如 O2/O3),以减小代码体积、提高运行效率。
4.cubeMX自动生成的代码里面的注释
首先:注意在写代码的时候是要写在这些注释里面的(CubeMX 再次生成代码时,不会覆盖里面的内容),写在外面下次生成代码的时候会覆盖消失。
二、GPIO
1.GPIO编程接口
2.GPIO两灯交替点亮实验
3.GPIO按钮按下实现板载灯亮
核心:读取输入引脚的值 因为输入引脚的值表示按钮的状态(是按下还是断开的)
输入引脚设置为输入上拉,按钮没按默认山上拉的高电压,按钮按下表示低电压
三、UART
1.USART和UART
2.串口的选择
3.串口的重要参数
串口的句柄,可以由代码生成的时候自动生成的
4.串口的编程接口
5.串口的简单发送数据实验
6.串口的简单接收数据实验
四、I2C
1.I2C的cubeMX配置
注意。标准模式没有占空比
》为什么 STM32的I2C 设计了新的占空比的模式?
因为 I²C 标准并不是直接规定“占空比”,而是规定 tLOW ≥ 某值,tHIGH ≥ 某值。
在硬件里实现的时候,更方便用 低/高时间的比例去配置。所以 CubeMX 的写法只是“工程实现上的习惯”,并不是新的占空比定义。
✅ 总结一句话:
常规定义:占空比 = 高电平时间 ÷ 周期
STM32 CubeMX:用 Ratio = 低/高 表示,本质上只是另一种写法,两者可以互相转换。
这里的占空比有点特殊。是直接使用低电压/高电压来得到占空比的
2.I2C的编程接口
3.OLED的芯片-SSD1306
(1)芯片手册
(2)芯片(OLED)的地址
(3)根据手册得到的使得OLED常亮的指令
指令依次是:命令流、使能电荷泵、打开屏幕开关、屏幕全亮
4.I2C实验:点亮OLED屏幕
五、时钟
1.时钟树的介绍
》而此图主要一个功能就是让你知道各个总线的最大频率
2.时钟树属于时序逻辑电路
(1)时序逻辑电路
特性 | 组合逻辑电路 | 时序逻辑电路 |
---|---|---|
输出依赖 | 当前输入 | 当前输入 + 历史状态 |
记忆功能 | 无 | 有 |
时钟信号 | 不需要 | 需要(大多数情况) |
示例 | 加法器、解码器 | 触发器、计数器、寄存器 |
电路 | 功能 | 逻辑类别 | 原因 |
---|---|---|---|
加法器 | 二进制相加 | 组合逻辑 | 输出只依赖输入 |
解码器 | 二进制转独热码 | 组合逻辑 | 输出只依赖输入 |
触发器 | 存储1 bit | 时序逻辑 | 有记忆,需要时钟 |
寄存器 | 存储多位 | 时序逻辑 | 由触发器构成,有记忆 |
计数器 | 自动计数 | 时序逻辑 | 当前状态依赖历史 |
(2)因为都是时序电路,所以需要时钟信号
3.怎么给每个外设分配不同的时钟
时钟树来分配,左边大树为大部分外设分配时钟
4.时钟树呈上启下关键节点:SYS CLK
5.时钟树在cubeMX的配置
(1)首先开启SYS调试模式
(2)其他额外的值得注意的时钟传输的节点
最右边上面的是单片机的CoreTex内核,他直接控制单片机的频率或代码执行速度。
其频率是由AHB直接传给他的