STM32F103微控制器开发指南与实战经验
1. STM32F103微控制器概述
STM32F103系列是STMicroelectronics公司基于ARM Cortex-M3内核设计的32位微控制器,工作频率最高可达72MHz。作为STM32家族中最经典的入门级产品线,它凭借出色的性价比和丰富的片上资源,在工业控制、消费电子、物联网设备等领域占据重要地位。
我最初接触这个系列是在2015年开发一款工业传感器时,当时对比了多款同价位MCU后选择了STM32F103C8T6,至今仍记得它给我带来的惊喜——以8元人民币的价格提供了72MHz主频、64KB Flash和20KB RAM,这在当时简直是性价比奇迹。十年过去,虽然STM32家族不断壮大,但F103系列依然是许多工程师的"初恋MCU"。
2. 核心硬件特性解析
2.1 处理器架构与性能
STM32F103采用ARM Cortex-M3 v7M架构,三级流水线设计支持Thumb-2指令集。实际测试中,在72MHz主频下执行Dhrystone基准测试可达1.25 DMIPS/MHz。我曾在示波器上实测GPIO翻转速度,在最优配置下可达18MHz的方波输出(使用寄存器直接操作)。
注意:虽然标称72MHz,但实际性能受Flash等待周期影响。当主频超过48MHz时需设置2个等待周期,这会轻微降低指令执行效率。
2.2 存储资源配置
该系列提供从16KB到1MB不等的Flash存储空间,RAM容量从6KB到96KB。以常用的STM32F103C8T6为例:
- 64KB Flash(实际可用约62KB)
- 20KB SRAM(其中64字节为电池备份区)
特别值得一提的是其独特的Flash架构:
// Flash编程示例(标准库) FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASH_ErasePage(0x0801F000); FLASH_ProgramHalfWord(0x0801F000, 0xABCD); FLASH_Lock();2.3 丰富的外设接口
该系列包含多达11个定时器(包括2个高级控制定时器),3个SPI接口(其中2个支持I2S),2个I2C接口,5个USART/UART接口。我在无人机飞控项目中就曾充分利用其TIM1定时器产生8路PWM信号控制电机。
外设时钟配置是初学者的常见痛点,这里分享一个配置公式:
APB1外设时钟 = PCLK1 = HCLK / (APB1分频系数) APB2外设时钟 = PCLK2 = HCLK / (APB2分频系数) 定时器时钟 = 当APB分频=1时等于PCLK,否则为PCLK×23. 开发环境搭建指南
3.1 工具链选择对比
当前主流开发方式有三种:
- Keil MDK:商业软件,调试体验最佳
- IAR Embedded Workbench:商业软件,代码优化效率高
- GCC+OpenOCD:免费开源方案,如PlatformIO+VSCode组合
我个人的工具链演进史:
- 2015-2017:Keil MDK(公司正版授权)
- 2018-2020:SW4STM32(基于Eclipse的免费方案)
- 2021至今:VSCode+PlatformIO+CubeMX组合
3.2 CubeMX工程配置详解
STM32CubeMX是ST官方推出的图形化配置工具,能自动生成初始化代码。关键配置步骤:
时钟树配置:
- HSE频率(通常8MHz)
- PLL倍频系数(选择9倍频得到72MHz)
- 各总线分频设置(保持APB1不超过36MHz)
外设参数设置:
// 自动生成的UART初始化代码片段 huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE;生成代码时的关键选项:
- 勾选"Generate peripheral initialization as a pair of .c/.h files"
- 选择使用LL库还是HAL库(新手建议HAL)
3.3 调试工具选型
- ST-Link V2:性价比之王,支持SWD接口,淘宝均价20元
- J-Link EDU:更快的下载速度,支持J-Trace功能
- DAPLink:开源调试器,兼容性较好
避坑提示:使用J-Link时若Flash下载配置找不到STM32F103,需手动添加设备文件。具体路径在J-Link安装目录下的\Devices\ST\STM32F1xx中。
4. 典型应用场景剖析
4.1 工业控制应用
在PLC模块中,我使用STM32F103实现了:
- 通过CAN总线与上位机通信(使用内置bxCAN控制器)
- 利用ADC多通道扫描模式采集8路4-20mA信号
- 使用TIM定时器产生精确的脉冲控制步进电机
关键代码片段:
// 多通道ADC配置(HAL库) hadc.Instance = ADC1; hadc.Init.ScanConvMode = ENABLE; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.NbrOfConversion = 4; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;4.2 物联网终端设备
结合JDY-31蓝牙模块的典型应用:
硬件连接:
- TXD -> PA10(USART1_RX)
- RXD -> PA9(USART1_TX)
- VCC -> 3.3V
- GND -> GND
通信协议处理:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) { // 处理蓝牙数据 if(rx_buffer[0] == 0xAA) { parse_ble_command(rx_buffer); } HAL_UART_Receive_IT(&huart1, rx_buffer, 1); } }4.3 无人机飞控系统
在基于STM32F103的微型无人机设计中:
- 通过SBUS协议与富斯接收机通信(使用USART2)
- 利用TIM1产生8路PWM信号控制电调
- 使用SPI接口读取MPU6050传感器数据
SBUS解码关键点:
// SBUS帧结构 typedef struct { uint8_t header; // 0x0F uint16_t ch[16]; // 11bit通道数据 uint8_t flags; // 数字通道 uint8_t footer; // 0x00 } sbus_frame_t;5. 低功耗设计与优化
5.1 电源管理模式
STM32F103支持三种低功耗模式:
- 睡眠模式(Sleep):仅CPU停止,外设仍运行
- 停止模式(Stop):保留RAM内容,主时钟关闭
- 待机模式(Standby):最低功耗,仅备份域维持
实测电流消耗:
- 运行模式:20mA@72MHz
- 停止模式:50μA(RTC保持运行)
- 待机模式:2μA
5.2 看门狗配置实践
独立看门狗(IWDG)配置示例(CubeMX):
- 选择时钟源:LSI(约40kHz)
- 设置预分频:4
- 设置重载值:1000
- 计算超时时间:(4×1000)/40kHz = 100ms
窗口看门狗(WWDG)配置技巧:
// 早期触发复位调试方法 void WWDG_EarlyWakeup_Handler(void) { if(__HAL_WWDG_GET_FLAG(&hwwdg, WWDG_FLAG_EWIF)) { __HAL_WWDG_CLEAR_FLAG(&hwwdg, WWDG_FLAG_EWIF); save_debug_info(); } }6. 常见问题解决方案
6.1 程序移植问题
从STM32F407移植到F103的注意事项:
- 时钟配置差异:F407有PLL分频器,F103需要重新计算
- 外设寄存器差异:如F103的SPI没有FIFO功能
- 库函数兼容性:HAL库需切换设备支持包
6.2 Flash编程异常处理
内部Flash写操作失败常见原因:
- 未解锁Flash(需先调用FLASH_Unlock)
- 写保护使能(检查OPTCR寄存器)
- 电压不稳定(确保VDD在2.7-3.6V之间)
6.3 DMA配置技巧
SPI DMA传输配置要点:
- 内存地址需4字节对齐
- 设置正确的数据宽度(SPI通常8bit)
- 启用传输完成中断
// SPI DMA发送配置 hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;7. 开发资源获取途径
7.1 官方资料下载
ST官网关键文档:
- 参考手册(RM0008):详细描述所有外设寄存器
- 数据手册(DS5319):电气特性与封装信息
- 编程手册(PM0056):Flash编程规范
- 标准外设库(STM32F10x_StdPeriph_Lib_V3.5.0)
提示:最新HAL库已迁移至STM32CubeF1软件包,建议新手从HAL库开始学习。
7.2 开源项目参考
优质开源项目推荐:
- BetaFlight:知名无人机飞控(含F103版本)
- FreeMODBUS:工业标准协议栈
- LVGL:轻量级GUI库(适配F103)
- RT-Thread:国产实时操作系统
7.3 最小系统板设计
自制最小系统板要点:
- 电源部分:至少100nF+10μF去耦电容
- 复位电路:10kΩ上拉+100nF电容
- 晶振布局:尽量靠近芯片,外壳接地
- SWD接口:预留VCC、GND、SWDIO、SWCLK
原理图设计建议:
- 使用STM32CubeMX生成基本引脚分配
- 所有GPIO引出测试点
- 预留USART转USB芯片位置(如CH340G)
