找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2919

积分

0

好友

379

主题
发表于 昨天 22:21 | 查看: 4| 回复: 0

学习STM32单片机,尤其是经典的F103系列,掌握其核心架构与配置要点是深入开发的基础。本文整理了50条关键学习笔记,涵盖时钟、GPIO、中断、定时器、PWM、FLASH操作等核心主题,旨在帮助开发者快速构建知识体系,避开常见误区。

一、 时钟与总线架构

  1. AHB系统总线分为APB1(最高36MHz)和APB2(最高72MHz)。数字2>1表示APB2连接的是高速外设。
  2. 头文件stm32f10x.h类似于51单片机中的reg52.h,包含了基本的位操作和寄存器定义;而stm32f10x_conf.h则用于集中管理外围器件的头文件包含,起到配置开关的作用。
  3. HSE Osc (High Speed External Oscillator) 指高速外部晶振,通常接8MHz。HSI RC (High Speed Internal RC) 指高速内部RC振荡器,频率约为8MHz。
  4. LSE Osc (Low Speed External Oscillator) 指低速外部晶振,通常为32.768KHz,用于RTC。LSI RC (Low Speed Internal RC) 指低速内部RC振荡器,频率约40KHz,为独立看门狗和自动唤醒单元提供时钟源。
  5. SYSCLK(系统时钟)的来源有三个:HSI RC、HSE OSC和PLL(锁相环输出)。

STM32 系统时钟源选择框图

  1. MCO[2:0] 引脚(PA8)可以输出4种不同的时钟信号,用于同步或测试。
  2. GPIO内部通常集成两个反向串联的二极管,连接到VDD和VSS,起到钳位保护作用,防止引脚电压过高或过低。

STM32 GPIO 端口内部结构框图

  1. 总线矩阵采用轮询算法,对系统总线和DMA访问进行仲裁。
  2. 主要总线包括:ICode总线(取指令)、DCode总线(取数据)、系统总线、DMA总线、总线矩阵以及AHB到APB的桥接。
  3. 关键步骤:在使用任何外设前,必须通过设置RCC_AHBENRRCC_APBxENR寄存器来开启该外设的时钟。
  4. STM32采用小端模式存储数据。
  5. 内存地址映射空间被划分为8个块,每块大小为512MB。
  6. FLASH页的大小:小容量和中容量产品为1KB,大容量产品为2KB。
  7. “系统存储区”(System Memory)由ST公司固化,用户无法修改,其中存放了Bootloader程序,用于通过串口等方式对主存储区(用户程序区)进行重新编程。因此,烧录程序时通常需设置BOOT1=0,通过内置的引导程序来更新FLASH中的中断向量表和代码。
  8. STM32F1系列内核(Cortex-M3)的工作电压(Vcore)为1.8V。

二、 复位、GPIO与中断系统

  1. STM32有三种复位:系统复位、电源复位和备份域复位。
    • 系统复位:除RCC_CSR中的复位标志和备份寄存器(BKP)外,所有寄存器均复位。可由外部复位引脚、看门狗、软件触发等引起。
    • 电源复位:由电源上电/掉电或从待机模式返回引发。除BKP外,所有寄存器复位。
    • 备份域复位:仅复位备份区域寄存器,由软件或VDD/VBAT均掉电触发。
  2. 单片机复位后,所有I/O端口默认处于浮空输入模式,这是为了降低功耗和防止意外损坏。
  3. 中断资源:STM32F103系列有60个可屏蔽中断通道,STM32F107等互联型有68个。所有型号均有16个可编程优先级和16个内核中断。
  4. 系统启动后,从地址0x00000004(存储初始堆栈指针)开始执行代码,0x00000000地址保留。
  5. NVIC (嵌套向量中断控制器) 管理中断优先级,分为抢占优先级(可嵌套)和子优先级(响应优先级,不可嵌套)。优先级由4位二进制位配置,共有5种分配方案。

中断优先级分组配置表

  1. 中断嵌套规则:高抢占优先级中断可打断低抢占优先级中断。若抢占优先级相同,则比较子优先级,子优先级高的先响应。若两者都相同,则比较硬件中断向量号,编号小的优先。
  2. 上电后,默认使用16级抢占优先级(无子优先级)。但所有外部中断的优先级控制字初始为0,因此抢占优先级相同,无法嵌套,需要手动配置分组。
  3. NVIC寄存器组包括:ISER/ICER(中断使能/除能)、ISPR/ICPR(中断挂起/解挂)、IABR(中断活动状态)、IPR(中断优先级)。写1操作使能或清除,这种设计基于硬件实现效率考量。
  4. 重要:大部分中断标志位需要在中断服务函数内手动清除,否则会导致中断持续触发。
  5. 配置外设的通用步骤:1. 使能外设时钟;2. 定义并初始化配置结构体;3. 调用初始化函数。

三、 常用外设要点

  1. 串口奇偶校验:若启用奇偶校验,则 USART_InitStructure.USART_WordLength 必须设置为 USART_WordLength_9b(9位数据长度),因为校验位会占用1位。
  2. ADC的规则组可自定义转换顺序和通道数。注入组具有更高优先级,可在规则组转换时强行插入,适用于需要紧急采样的信号。
  3. 定时器输出比较模式:
    • Timing:冻结,输出不变。
    • Active:匹配时输出有效电平(高)。
    • Inactive:匹配时输出无效电平(低)。
    • Toggle:匹配时电平翻转。
  4. STM32的定时器从0开始向上计数,到达设定条件(如匹配、溢出)后产生标志位,然后从0重新开始计数。这与51单片机不同。
  5. 最终输出信号 OCx = OCxREF + 极性控制。极性控制决定了有效电平是高还是低。
  6. 自动重装载寄存器 (ARR) 和影子寄存器:程序员操作的是ARR。影子寄存器是真正控制计数的“幕后”寄存器。当ARPE(自动重装载预装载使能)位为1时,写入ARR的新值要到下一次更新事件时才更新到影子寄存器,否则立即更新。

ARPE=1时定时器更新事件时序图

  1. RCC_PCLK1Config(RCC_HCLK_Div4) 表示将APB1时钟(PCLK1)进行4分频,作为其下挂载的定时器基准时钟源之一。
  2. 配置定时器(如PWM输出)的一般流程:配置RCC时钟、NVIC中断(如需)、GPIO(复用为输出)、TIMx定时器本身。
  3. PWM输出能力:一个通用定时器可输出4路PWM;一个高级定时器可输出4路普通PWM外加3路带死区互补的PWM(用于驱动三相电机),共7路。理论上,一个芯片的定时器资源可产生多达30路PWM。
  4. 定时器PWM生成原理框图:

定时器PWM模式工作原理框图

  1. 时钟路径:高级定时器时钟在APB2上,通用定时器在APB1上。APB1默认2分频(36MHz),但给定时器时会有一个x2的倍频器,因此通用定时器时钟可达72MHz。若APB1未分频,则定时器时钟直接等于APB1时钟。TIM_SetAutoreload() 用于改变PWM频率,TIM_SetCompare1() 用于改变通道1的占空比。
  2. 电机驱动对比:有刷电机启动力矩大;无刷电机运行力矩大,通过霍尔传感器检测转子位置进行电子换向。
  3. 死区时间在驱动桥式电路(如三相逆变)中必不可少,用于防止上下桥臂直通短路,确保开关管有足够时间彻底关断。
  4. 高级定时器的刹车功能可在故障时硬件自动强制PWM输出为安全状态(固定占空比或固定电平),实现紧急制动。
  5. 生成精确、稳定的PWM信号,推荐使用专门的 PWM模式,其他比较输出模式可能存在相位偏移。
  6. 对内部FLASH进行编程(写)操作前,必须先解锁,操作完成后需再加锁。FLASH特性是“写0易,写1难”,只能将1写成0,擦除操作是将整页恢复为1。
  7. 程序下载方式:
    • ICP (在线编程):通过JTAG/SWD接口直接烧写,用于开发阶段。
    • IAP (在应用编程):通过芯片上的接口(如USART、USB、CAN)接收数据并更新自身FLASH,用于产品固件升级。
  8. FLASH构成:主存储器(存放用户代码)、信息块(包含启动配置)、系统存储器(存放出厂Bootloader,不可修改)。
  9. 注意:在对FLASH执行写或擦除操作时,不能同时进行读操作,否则会锁住总线导致操作失败或系统挂起。
  10. 对FLASH进行操作时,必须保证 HIS(高速内部RC振荡器) 或HSE已经开启并稳定。
  11. 看门狗类型:
    • IWDG (独立看门狗):基于独立的LSI时钟,即使主时钟失效也能工作。
    • WWDG (窗口看门狗):时钟来源于APB1,需要在特定时间窗口内刷新。
  12. SPI接口的最高理论通信频率为 fpclk/2,当APB1时钟为36MHz时,SPI最高速率为18MHz;APB2时钟为72MHz时,挂载其上的SPI可达36MHz。
  13. 高级定时器(TIM1/TIM8)输出PWM时,需额外使能 主输出 (TIM_CtrlPWMOutputs(ENABLE)),通用定时器无此要求。TIM6和TIM7是基本定时器,无PWM输出功能。

四、 内存管理与总结

  1. 程序编译后的内存分布:
    • Code:程序代码。
    • RO-data:只读常量(const变量)。
    • RW-data:已初始化的全局变量和静态变量。
    • ZI-data:未初始化的或初始化为0的全局/静态变量。
    • Code和RO-data、RW-data的初始值存放在FLASH中。
    • RW-data(运行时)和ZI-data存放在RAM中。
    • 启动时,RW-data的初始值从FLASH拷贝到RAM。
  2. 以STM32F103ZET6为例,“Z”代表144引脚封装,其中可用GPIO引脚为112个(即PA、PB、PC、PD、PE、PF、PG口,每组16个,共7组)。

掌握以上50个要点,能帮助开发者更深入地理解STM32的计算机基础操作系统底层机制,为编写高效、稳定的嵌入式系统程序打下坚实基础。这些笔记整理自实践与官方资料,欢迎在云栈社区交流探讨更多技术细节。




上一篇:Kubernetes网络平面规划:宿主机、虚拟机与Pod的隔离互通策略与避坑指南
下一篇:Kota:用Rust构建的轻量级AI代码代理,支持多模型与交互式CLI
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-27 05:57 , Processed in 0.309650 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表