STM32F104的一些知识点

发布时间:2026/9/6 2:23:33
STM32F104的一些知识点 一、CPU 如何控制外设GPIO、RCC 和 TIM 等外设内部都有一组寄存器。CPU 通过读写映射到内存地址空间的寄存器完成外设配置和数据交换这就是内存映射外设。以 GPIO 为例常见寄存器包括设备头文件通常把这些寄存器按照偏移顺序封装成结构体再把外设基地址转换成结构体指针。因此GPIOA-MODER最终仍然是一次对硬件寄存器地址的访问。寄存器成员通常带有volatile有些库写作__IO修饰。它告诉编译器这个值可能被硬件随时改变每次使用时都必须真正访问该地址不能只使用之前缓存的结果。使用__IO是因为GPIO的值可以被外界改变所以想要直到最新的值必须得从内存中重新读取二、串口下载程序和jlink烧录程序内部流程1. 串口下载使用的是系统寄存器启动方式用串口下载实际上是芯片内部固化的一个“小程序”Bootloader在帮你干活。内部发生的过程芯片进入“预装程序”上电复位后芯片检测到 BOOT0 为高电平CPU 指针PC就跳转到了系统存储器System Memory的起始地址。这里有一串出厂前就写好的 ROM 代码Bootloader。这段代码是死的不可擦除专门用来接收固件。Bootloader 打开串口这个预装程序会自行初始化 USART1或 USART2设置好波特率通常是 115200然后像一个小监听器一样等待上位机发送指令。上位机你的电脑发命令FlyMcu等软件通过 USB 转 TTL 线发送0x7F同步字节接着发送擦除 Flash 的指令。Bootloader 调用“Flash 擦写驱动”这一步是核心。Bootloader 本身没有权限直接改写 Flash它必须调用芯片内部硬件提供的Flash 编程接口FMC 外设。FMC 会先执行“擦除”操作把 Flash 里的 1 变成 0然后把上位机发来的数据你的二进制代码按字节写入 Flash。跳转执行下载完成后Bootloader 会把 BOOT0 拉回低电平或被上位机控制复位芯片再次复位这次 PC 指针就会跳到 0x08000000Flash 起始地址开始执行你刚写入的程序。一般板子上有usb转串口模块不需要手动将boot0的跳线帽拉高这个电路会通过串口信号自动帮你控制 BOOT0 和复位引脚2 J-Link下载SWD/JTAGJ-Link 下载本质上是外部硬件调试器直接“接管”了芯片的内核。内部发生的过程J-Link 建立调试连接J-Link 通过 SWDIO 和 SWCLK 两根线连接到芯片的调试接口。J-Link 会发送一串特定的调试握手信号激活芯片内部的SWDSerial Wire Debug调试硬件。J-Link 接管 CPU 内核连接成功后J-Link 通过调试接口向 CPU 内核发送Halt停机指令。CPU 会立刻暂停当前正在执行的程序把寄存器状态保存下来然后进入“被控制”状态。此时CPU 不再执行任何 Flash 里的代码它完全听命于 J-Link 的调试端口。J-Link 直接操作 Flash 外设接下来J-Link 不再通过任何软件而是直接向芯片的Flash 控制器FMC写入寄存器。它先写入擦除指令擦除目标扇区然后通过调试接口把上位机的二进制数据直接写入 FMC 的写入缓冲区。FMC 硬件会自己把这些数据写入 Flash 阵列。恢复运行写入完成后J-Link 向 CPU 内核发送Run运行指令CPU 从停机状态恢复PC 指针自动指向 0x08000000开始执行刚才写进去的程序。三、RCCReset and Clock Control复位和时钟控制STM32F407 常见时钟源包括时钟类型常见用途HSI高速内部 RC典型 16 MHz启动、普通系统时钟HSE高速外部晶振或外部时钟精度更高的系统时钟源LSI低速内部 RC独立看门狗也可供 RTCLSE32.768 kHz 外部晶振RTCPLL 不是独立振荡源而是对 HSI 或 HSE 分频、倍频生成系统所需的高频时钟。主 PLL 的典型计算关系是4.1 从时钟源到外设的完整走向STM32F407 的主干可以简化为下面这张时钟树HSI 16 MHz ----------- -- 系统时钟选择器 -- SYSCLK HSE 4~26 MHz -- PLL -- | v AHB 预分频器 | ----------------------------------------- | | | v v v HCLK / AHB Cortex-M4 Flash、SRAM、DMA | ---------------------- | | v v APB1 预分频器 APB2 预分频器 | | PCLK1 PCLK2 | | APB1 外设 / TIMxCLK1 APB2 外设 / TIMxCLK2 ​ LSE 32.768 kHz ---- RTC 时钟选择器 -- RTC LSI 约 32 kHz --- \- 独立看门狗 HSE 分频 --------这里最容易混淆的是AHB1、AHB2 是 AHB 总线矩阵中的不同外设域不是从 HCLK 再做一次不同频率的预分频。在 STM32F407 的常见描述中它们都工作在 AHB/HCLK 时钟域但有各自的外设时钟使能和复位寄存器。APB1、APB2 则从 HCLK 分别经过各自的预分频器得到PCLK1、PCLK2。4.2 SYSCLK、HCLK、PCLK1 和 PCLK2这几个名字可以按层级理解名称从哪里来主要供给对象STM32F407 常见最高值SYSCLKHSI、HSE 或 PLLCLK系统时钟入口168 MHzHCLKSYSCLK 经 AHB 预分频Cortex-M4、AHB、存储器、DMA168 MHzPCLK1HCLK 经 APB1 预分频APB1 低速外设42 MHzPCLK2HCLK 经 APB2 预分频APB2 高速外设84 MHz4.3 AHB、AHB1 与 AHB2AHBAdvanced High-performance Bus承担高带宽、低延迟的数据传输。CPU 取指、访问 SRAM、DMA 搬运数据以及高速外设通信都依赖 AHB 总线矩阵。从外设使用者角度可以重点记住AHB1典型外设包括 GPIOA~GPIOI、DMA1、DMA2、CRC、以太网、USB OTG HS 等。AHB2典型外设包括 USB OTG FS、DCMI、随机数发生器 RNG 等。AHB3主要连接 FSMC用于外部 SRAM、NOR Flash、LCD 控制器等外部存储设备。四、中断发生时的流程1. 中断源发出中断请求外设检测到触发条件 向中断控制器 NVIC 发送一个请求信号 比如 定时器计数值达到ARR 发送更新中断请求 串口收到一个字节 发送接收中断请求2. NVIC判断是否响应硬件中断NVIC 嵌套向量中断控制器 收到请求后 会做三件事1 检查中断是否使能 该中断在NVIC里是否被打开 NVIC_EnableIRQ2 检查优先级 如果当前正在执行更高优先级的中断 这个请求会被挂起 等待3 判断抢占 如果新中断优先级更高 当前程序会被强制打断 如果更低 则等当前中断执行完再处理如果所有条件都满足 NVIC会向CPU内核发送一个中断请求信号3. CPU保存现场硬件自动完成CPU收到中断请求后硬件自动不需要软件干预 完成以下操作压栈 入栈 把当前程序的寄存器自动压入栈中 保护现场获取中断向量 CPU从中断向量表 存放在Flash起始地址0x08000000处 读取该中断对应的入口地址跳转到中断服务函数 将PC指针设置为中断入口地址 开始执行中断服务函数 ISR注意这个压栈和跳转过程全部由硬件完成 不需要你写任何代码 速度极快 通常几个时钟周期4. 执行中断服务函数软件CPU开始执行你写的XXX_IRQHandler函数 如TIM2_IRQHandler USART1_IRQHandler提醒 中断服务函数要尽量短小精悍 不要写耗时的操作 如延时 复杂计算 否则会阻塞其他中断5.中断返回硬件自动完成ISR执行完毕恢复现场硬件自动完成被中断打断的代码继续执行 PC回到中断发生时的下一条指令五、PWMPulse Width Modulation脉冲宽度调制PWM脉冲宽度调制使用固定或可变频率的数字脉冲通过改变高电平在一个周期中所占的比例控制负载获得的平均能量。它常用于 LED 调光、电机调速、蜂鸣器和舵机控制。定时器 PWM 本质上使用输出比较计数器CNT与比较寄存器CCR比较在指定计数区间输出有效或无效电平。在常见的边沿对齐、向上计数 PWM 模式下PWM 频率 TIMxCLK / ((PSC 1) * (ARR 1)) 占空比约为 CCR / (ARR 1) 分辨率 1 / (ARR 1)具体有效电平区间还受 PWM1/PWM2 模式和输出极性影响不能只看CCR判断最终引脚电平。5.1 频率、占空比与分辨率的取舍在定时器时钟不变时提高 PWM 频率通常需要减小ARR但这会减少可用的占空比档位。反过来增大ARR能提高分辨率却会降低频率。因此参数选择应从负载需求出发LED 调光需要避开肉眼可见闪烁并兼顾调光级数直流电机通常选择驱动器建议的频率范围同时考虑噪声、开关损耗和控制分辨率舵机关注的通常是脉宽范围和重复周期而不只是百分比占空比。5.2、用 PWM 控制直流电机GPIO 不能直接驱动直流电机。电机需要的电流通常远超 MCU 引脚能力而且电机是感性负载启停和换向会产生反向电动势。正确做法是使用 TB6612FNG 一类电机驱动器MCU 只输出逻辑方向信号和 PWM驱动器负责功率放大、换向及部分保护。以 TB6612FNG 的一路为例AIN1/AIN2控制方向或刹车状态PWMA接定时器 PWM 通道控制平均驱动功率STBY必须处于有效状态驱动器才工作VM为电机电源VCC为逻辑电源两者不要混淆MCU、驱动器逻辑侧和电机电源必须共地电源电压、电流、散热与电机堵转电流必须满足驱动器规格。H 桥通过改变流经电机的电流方向实现正反转。绝不能让同一桥臂上下管同时导通否则会形成从电源到地的直通电流。使用集成驱动器可以降低误操作风险但切换方向前先降占空比或停止输出通常能减小电流冲击和机械冲击。