6、串口通讯
学习目标
1.学习STM32主板串口的基本使用。
2.了解串口通讯基本知识。
STM32F1 的 USART 介绍:
串口通信(Serial Communication),是指外设和计算机间通过数据信号线、 地线等按位进行传输数据的一种通信方式,属于串行通信方式。
USART 即通用同步异步收发器,它能够灵活地与外部设备进行全双工数据交 换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求。UART 即通用异步收发器,它是在 USART 基础上裁剪掉了同步通信功能,同步和异步主要看其时钟是否需要对外提供,本章节主要使用的是USART, STM32F103C8T6 芯片含有 3 个 USART外设。 USART 支持同步单向通信和半双工单线通信;还支持 LIN(域互连网络)、 智能卡协议与 IrDA(红外线数据协会) SIR ENDEC 规范,以及调制解调器操作 (CTS/RTS)。而且,它还支持多处理器通信和 DMA 功能,使用 DMA 可实现高速数 据通信。USART 通过小数波特率发生器提供了多种波特率。 USART 在 STM32 中应用最多的是 printf 输出调试信息,当我们需要了解程 序内的一些变量数据信息时,可以通过 printf 输出函数将这些信息打印到串口到助手上显示,这样一来就给我们调试程序带来了极大的方便。
使用时,每个串口对应的引脚可以在STM32数据手册中找到对应关系。
![](/assets/img/stm32/STM32F103C8T60.96TFT/82.png)
二、硬件搭建
由于核心板上自带ch340串口电路,可直接通过usb线实现串口通信,无需外接usb转ttl模块。
![](/assets/img/stm32/STM32F103C8T60.96TFT/81.png)
三、程序分析
串口初始化代码:
![](/assets/img/stm32/STM32F103C8T60.96TFT/83.png)
在 USART1_Init()函数中,首先使能 USART1 串口及端口时钟,并初始化 GPIO 为复用功能。其次配置串口结构体 USART_InitTypeDef,使能串口并开启接收中断,为了防止串口发送状态标志位的影响,我们清除下串口状态标志位(TC), 最后配置相应的 NVIC 并使能对应中断通道,我们将 USART1 的抢占优先级设置为 3,响应优先级设置为 3。
串口中断代码:
![](/assets/img/stm32/STM32F103C8T60.96TFT/84.png)
为了确认 USART1 是否发生接收中断,调用了读取串口中断状态标志位函数 USART_GetITStatus,如果确实产生接收中断事件,那么就会执行 if 内的语句, 将串口接收到的数据保存在变量 r 内,然后有通过串口发送出去,通过 USART_GetFlagStatus 函数读取串口状态标志,如果数据发送完成,则退出 while 循环语句,且清除发送完成状态标志位 USART_FLAG_TC。
主函数代码:
![](/assets/img/stm32/STM32F103C8T60.96TFT/85.png)
主函数实现的功能很简单,首先调用之前编写好的硬件初始化函数,包括 SysTick 系统时钟,中断分组,LED 初始化等。然后调用我们前面编写的 USART1 初始化函数,这里我们设定串口通信波特率为 9600。最后进入 while 循环语句, 不断让 D1 指示间隔 200ms 闪烁。如果发生接收中断事件,即会进入中断执行, 执行完后回到主函数内继续运行。
四、实验现象
程序下载完成之后,led灯闪烁,且对串口助手进行如下图配置之后,可以在串口助手接收窗口查看到返回的发送内容。
注意:波特率一定要选9600,否则无法接收发送的内容。
![](/assets/img/stm32/STM32F103C8T60.96TFT/86.png)