第九单片机论坛 www.9mcu.com
0、友情提示
《零死角玩转 STM32》系列教程由初级篇、中级篇、高级篇、系统篇、
四个部分组成,根据野火 STM32 开发板旧版教程升级而来,且经过重新深入编
写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让
您零死角玩转 STM32。M3 的世界,于野火同行,乐意惬无边。
另外,野火团队历时一年精心打造的《STM32 库开发实战指南》将于今
年 10 月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利
于查阅资料。内容上会给你带来更多的惊喜。是一本学习 STM32 必备的工具
书。敬请期待!
野火淘宝店:http://firestm32.taobao.com (点我) -第 2 页-
第九单片机论坛 www.9mcu.com
1、调试必备-串口(USART1)
当我们在学习一款 CPU 的时候,最经典的实验莫过于流水灯了,会了流水
灯的话就基本等于学会会操作 I/O 口了。那么在学会操作 I/O 之后,面对那么
多的片上外设我们又应该先学什么呢?有些朋友会说用到什么就学什么,听起
来这也不无道理呀。
但对于野火来说会把学习串口的操作放在第二位。在程序运行的时候我们
可以通过点亮一个 LED 来显示代码的执行的状态,但有时候我们还想把某些中
间量或者其他程序状态信息打印出来显示在电脑上,那么这时串口的作用就可
想而知了。
1.1 异步串口通讯协议
阅读过《STM32 中文参考手册》的读者会发现,STM32 的串口非常强大,
它不仅支持最基本的通用串口同步、异步通讯,还具有 LIN 总线功能(局域互联
网)、IRDA 功能(红外通讯)、SmartCard 功能。
为实现最迫切的需求,利用串口来帮助我们调试程序,本章介绍的为串口
最基本、最常用的方法,全双工、异步通讯方式。图 1-1 为串口异步通讯协
议。
重温串口的通讯协议,我们知道要配置串口通讯,至少要设置以下几个参
图 1-1 异步串口通讯协议
数:字长(一次传送的数据长度)、波特率(每秒传输的数据位数)、奇偶校验位、
还有停止位。对 ST 库函数的使用已经上手的读者应该能猜到,在初始化串口
的时候,必然有一个串口初始化结构体,这个结构体的几个成员肯定就是有来
存储这些控制参数的。
野火淘宝店:http://firestm32.taobao.com (点我) -第 3 页-
第九单片机论坛 www.9mcu.com
1.2 直通线和交叉线
野火 STM32 开发板串口硬件原理图
见图 1-2,这是野火 STM32 开发板的接线图,使用的为 MAX3232 芯片,
图 1-2 野火开发板串口硬件图
把 STM32 的 PA10引脚(复用功能为USART1的Rx)接到了 DB9 接口的第2针
脚,把 PA9引脚(复用功能为USART的Tx)连接到了 DB9 接口的第3针脚。
Tx(发送端)接第3针脚,Rx(接收端)接第2针脚。这种接法是跟 PC
的串口接法一样的,如果要实现 PC 跟野火板子通讯,就要使用两头都是母的
交叉线。
串口线主要分两种,直通线(平行线)和交叉线。它们的区别见图 1-3。
假如 PC 与板子之间要实现全双工串口通讯,必然是 PC 的 Tx 针脚要连接到板
子的 Rx 针脚,而 PC 的 Rx 针脚则要连接至板子的 Tx 针脚了。由于板子和 pc
的串口接法是相同的,就要使用交叉线来连接了。如果有的开发板是 Tx 连接至
DB9 的第 2 针脚,而 Rx 连接至第 3 针脚,这与 PC 接法是相反的,这样的板子
与 PC 通讯就需要使用直通线了。
为什么野火板子要使用 PC 的接法?
假如使用非 PC 接法,由于板子与 PC 的接法相反,通讯就要使用直通线;
但两个板子之间想要进行串口通讯时,由于接法相同,就要使用交叉线。如果
使用 PC 接法,板子与 PC 之间接法相同,通讯使用交叉线;两个相同板子之间
接法也相同,通讯也是使用交叉线。
野火淘宝店:http://firestm32.taobao.com (点我) -第 4 页-
第九单片机论坛 www.9mcu.com
所以野火建议大家设计板子时,尽量采用与 PC 相同的标准串口接法。
介绍直通线与交叉线的区别,一来是野火发现某些读者因为线的问题而花
图 1-3 交叉线与直通线的区别
费了大量宝贵的时间。二来是介绍串口线的 DIY 方法。要实现基本的全双工异
步通讯,只要 3 条线,分别为 Rx、Tx、和GND。如果读者正在为直通线、交
叉线、公头、母头不匹配而烦恼,可以根据自己的需要,参照图 1-3,用三根
杜邦线连接即可。
野火淘宝店:http://firestm32.taobao.com (点我) -第 5 页-
第九单片机论坛 www.9mcu.com
1.3 串口工作过程分析
串口外设的架构图看起来十分复杂,实际上对于软件开发人员来说,我们
图 1-4 串口架构图
只需要大概了解串口发送的过程即可。
从下至上,我们看到串口外设主要由三个部分组成,分别是波特率的控制
部分、收发控制部分及数据存储转移部分。
野火淘宝店:http://firestm32.taobao.com (点我) -第 6 页-
第九单片机论坛 www.9mcu.com
1.3.1 波特率控制
波特率,即每秒传输的二进制位数,用 b/s (bps)表示,通过对时钟的控
制可以改变波特率。在配置波特率时,我们向波特比率寄存器USART_BRR写
入参数,修改了串口时钟的分频值USARTDIV。USART_BRR寄存器包括两部
分,分别是 DIV_Mantissa(USARTDIV 的整数部分)和 DIVFraction(USARTDIV
的小数)部分,最终,计算公式为
USARTDIV=DIV_Mantissa+(DIVFraction/16)。
USARTDIV是对串口外设的时钟源进行分频的,对于 USART1,由于它是
挂载在 APB2总线上的,所以它的时钟源为 fPCLK2;而 USART2、3挂载在
APB1上,时钟源则为 fPCLK1,串口的时钟源经过 USARTDIV分频后分别输出
作为发送器时钟及接收器时钟,控制发送和接收的时序。
1.3.2 收发控制
围绕着发送器和接收器控制部分,有好多个寄存器:CR1、CR2、CR3、
SR,即 USART 的三个控制寄存器(Control Register)及一个状态寄存器(Status
Register)。通过向寄存器写入各种控制参数,来控制发送和接收,如奇偶校验
位,停止位等,还包括对 USART 中断的控制;串口的状态在任何时候都可以从
状态寄存器中查询得到。具体的控制和状态检查,我们都是使用库函数来实现
的,在此就不具体分析这些寄存器位了。
1.3.3 数据存储转移部分
收发控制器根据我们的寄存器配置,对数据存储转移部分的移位寄存器进行控
制。
当我们需要发送数据时,内核或 DMA 外设(一种数据传输方式,在下一
章介绍)把数据从内存(变量)写入到发送数据寄存器TDR后,发送控制器将适时
地自动把数据从 TDR加载到发送移位寄存器,然后通过串口线Tx,把数据一
位一位地发送出去,在数据从 TDR转移到移位寄存器时,会产生发送寄存器
野火淘宝店:http://firestm32.taobao.com (点我) -第 7 页-
第九单片机论坛 www.9mcu.com
TDR已空事件TXE,当数据从移位寄存器全部发送出去时,会产生数据发送完
成事件TC,这些事件可以在状态寄存器中查询到。
而接收数据则是一个逆过程,数据从串口线Rx一位一位地输入到接收移
位寄存器,然后自动地转移到接收数据寄存器RDR,最后用内核指令或 DMA
读取到内存(变量)中。
1.4 串口通讯实验分析
1.4.1 实验描述及工程文件清单
实验描述
重新实现 C 库中的 printf() 函数到串口 1,这样我们就可以
像用 C 库中的 printf() 函数一样将信息通过串口打印到电
脑,非常方便我们程序的调试。
硬件连接
PA9 - USART1(Tx)
PA10 - USART1(Rx)
用到的库文件
startup/start_stm32f10x_hd.c
CMSIS/core_cm3.c
CMSIS/system_stm32f10x.c
FWlib/stm32f10x_gpio.c
FWlib/stm32f10x_rcc.c
FWlib/stm32f10x_usart.c
用户编写的文件 USER/main.c
USER/stm32f10x_it.c
USER/usart1.c
1.4.2 配置工程环境
串口实验中我们用到了 GPIO、RCC、USART这三个外设的库文件
stm32f10x_gpio.c、stm32f10x_rcc.c、stm32f10x_usart.c,所以我们先要把这
野火淘宝店:http://firestm32.taobao.com (点我) -第 8 页-
第九单片机论坛 www.9mcu.com