1. 课程导论与开发环境搭建

各位同学好,我是你们的嵌入式讲师。咱们这门课叫《STM32F103 HAL库串口通信调试与故障定位实战》,说白了就是手把手教你搞定串口——从能发能收,到出了问题能自己查、自己修。

第一节课,我不急着讲代码。先把地基打牢:串口到底是个啥?HAL库怎么管事的?开发环境怎么搭?这些搞不明白,后面写再多代码也是空中楼阁。

1.1 串口通信基础概念

串口通信,全称是串行通信接口。什么叫串行?就是数据一位一位地顺着一条线传。你想想看,8位数据如果并行走8根线,速度快但费引脚;串行走一根线,省引脚但速度慢点。在嵌入式里,引脚是金贵的,所以串口成了最常用的通信方式之一。

参数 说明 典型值
波特率 每秒传输的比特数 9600、115200
数据位 一帧数据中的有效位数 8位(最常用)
停止位 帧结束标志位 1位、2位
校验位 检错机制 无校验、奇校验、偶校验

我在项目中遇到过最坑的事:两边波特率明明都设的115200,但就是收乱码。查了半天,发现是晶振精度不够,实际波特率漂了2%。从那以后,我每次都会用示波器量一下波形宽度,确认波特率对不对。

串口通信三要素:波特率一致、数据格式一致、电平标准一致。缺一个,通信就崩。

1.2 HAL库架构简介

HAL库,全称Hardware Abstraction Layer,硬件抽象层。说白了,就是ST官方帮你封装好的一套驱动库。你不需要直接操作寄存器,调用函数就行。

但这里有个误区——很多人觉得用了HAL库就不用懂底层了。我个人习惯是:先用HAL库快速开发,出问题了再往下看寄存器。你想想看,如果连USART_DR寄存器是干啥的都不知道,HAL_StatusTypeDef返回值报错了你都看不懂。

HAL库的串口相关文件主要有这几个:

  • stm32f1xx_hal_uart.h — 串口头文件,函数声明都在这里
  • stm32f1xx_hal_uart.c — 串口驱动实现
  • stm32f1xx_hal_def.h — HAL库通用定义,比如HAL_OK、HAL_ERROR

HAL库的串口操作流程,我画了张图,你看一眼就明白了:

HAL库串口操作流程 1. 初始化UART 2. 配置GPIO引脚 3. 配置NVIC中断 4. 收发数据 HAL_UART_Init() 自动配置时钟、波特率 MX_GPIO_Init() TX推挽输出,RX浮空输入 HAL_NVIC_SetPriority() 使能USARTx_IRQn HAL_UART_Transmit() HAL_UART_Receive()

1.3 STM32CubeMX工程创建

STM32CubeMX是ST官方出的图形化配置工具。你点点鼠标,它就能生成初始化代码。我刚开始用的时候也觉得这东西有点花哨,但用顺手了真离不开——尤其是管脚冲突检查,手动配容易漏。

创建工程的步骤,我列个清单:

  1. 选芯片 — 我们用的是STM32F103C8T6,在CubeMX里搜"STM32F103C8"
  2. 配时钟 — 外部8MHz晶振,通过PLL倍频到72MHz
  3. 配串口 — 选USART1,模式选Asynchronous,波特率115200
  4. 配GPIO — CubeMX会自动分配PA9(TX)、PA10(RX),不用手动改
  5. 生成代码 — 选MDK-ARM V5,点Generate Code

小技巧:CubeMX生成的代码里,main函数中有一个MX_USART1_UART_Init()函数。我建议你在这个函数后面加个printf重定向,调试时打印信息方便得多。

1.4 Keil MDK-ARM开发环境配置

Keil MDK-ARM,说白了就是咱们写代码、编译、下载的IDE。CubeMX生成的是工程框架,Keil才是真正干活的地方。

配置要点:

  • Device — 确认芯片型号是STM32F103C8,别选成C6或C4
  • Target — 晶振填8,Xtal填8.0,别填错
  • Output — 勾选Create HEX File,方便烧录
  • Debug — 选ST-Link Debugger,然后点Settings确认连接

我记得有一次帮同事调工程,编译报错说"Undefined symbol HAL_UART_Transmit"。我一看,他CubeMX生成代码时忘了勾选USART1的外设。嗯,这种低级错误,CubeMX里点一下就行,但忘了就是忘了。

注意:Keil的工程路径不要有中文,不要有空格。我吃过这个亏——项目文件夹叫"串口调试_V2.0",编译死活报错,改成"UART_Debug_V2"就好了。

1.5 串口调试助手选择与使用

串口调试助手,就是PC端用来和单片机通信的小工具。市面上有很多,我挑几个常用的说说:

工具名称 特点 推荐场景
SSCOM 轻量、稳定、支持多串口 日常调试首选
Putty 支持SSH和串口,跨平台 Linux下调试
Serial Port Monitor 能抓包分析 排查协议问题
野火串口助手 界面友好,带波形显示 初学者上手

我个人习惯用SSCOM,因为它够轻量,打开就能用。配置的时候注意三点:波特率、数据位、停止位要和单片机一致。我曾经遇到过有人用115200的波特率,但调试助手设成了9600,结果收了一堆乱码还以为是硬件坏了。

使用步骤很简单:

  1. 插上USB转串口模块,确认PC识别到COM口
  2. 打开调试助手,选对COM口号
  3. 设置波特率115200、数据位8、停止位1、无校验
  4. 点"打开串口",然后单片机发数据就能看到了

避坑指南:我曾经在调试时发现串口助手收不到数据,折腾了半小时。最后发现是USB转串口模块的TX和RX接反了。记住:单片机的TX接模块的RX,单片机的RX接模块的TX。交叉连接,别直连。

好了,第一节课的内容就这些。环境搭好了,后面咱们就能直接上手写代码、调通信了。串口这东西,说难不难,说简单也不简单——但只要你把基础打牢,后面遇到问题心里就有底。