STM32 USART 简介
1. STM32的USART通用同步异步收发器是一个串行通信设备,可以灵活的与外部设备进行全双工数据交换。
1. 有别于USART,还有一个UART,它在USART基础上裁减掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。
1. 串口通信一般是以帧格式传输数据,即一帧一帧传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。
1. USART满足外部设备对工业标准NRZ异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。
1. USART支持同步单向通信和半双工发单线通信;还支持同步单向通信和半双工单线通信;还支持局域互连网络LIN、智能卡(SmartCard)协议与 IrDA(红外线数据协会) SIR ENDEC规范。
1. USART支持使用DMA,可实现高速数据通信。

TXD和RXD交叉相连,两边共地!

STM32F103ZET6有三个串口
串口12345都挂载在APB2总线上
程序编写
本次使用USART1 PA9 + PA10
GPIOA和串口1都挂载在APB2总线,开启时钟要注意不要开错了,串口属于复用功能,要开启复用时钟
TXD和RXD一个是输出一个是输入,要分别配置
PA9是TXD,输出端口,配置复用推挽输出!配置输出速率10MHz即可
PA10是RXD,输入端口,模式配置上拉输入或浮空输入,不需要配置输出速率
串口配置
设置一个形参,传入波特率
1位停止位,8位数据位,不使用奇偶校验,不使用硬件流控制,模式配置:发送和接收
NVIC配置

USART_FLAG_TXE 发送数据寄存器空标志位
USART_IT_RXNE 接收数据寄存器非空标志位
串口1初始化函数,形参是波特率
1. //BaudRate = 9600 115200
2. void USART1_Init(uint32_t BaudRate)
3. {
4. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //GPIOA在APB2总线上
5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //串口1在APB2总线上
6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //串口属于复用功能,要开启复用时钟
7.
8. GPIO_InitTypeDef GPIO_InitStructure;
9. USART_InitTypeDef USART_InitStructure;
10. NVIC_InitTypeDef NVIC_InitStructure;
11.
12. //PA9 TXD配置
13. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //配置复用推挽输出!
14. GPIO_InitStructure.GPIO_Pin = TXD; //output
15. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
16. GPIO_Init(USART_PORT, &GPIO_InitStructure);
17.
18. //PA10 RXD配置
19. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //上拉输入 或 浮空输入 都行
20. GPIO_InitStructure.GPIO_Pin = RXD; //input
21. //不需要输出速率
22. GPIO_Init(USART_PORT, &GPIO_InitStructure);
23.
24. USART_DeInit(USART1);//先初始化一下
25. USART_InitStructure.USART_BaudRate = BaudRate;//波特率设置 由形参传入
26. USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位 1位
27. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位 8位
28. USART_InitStructure.USART_Parity = USART_Parity_No;//校验位 不使用奇偶校验
29. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使用硬件流控制
30. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //模式配置:发送和接收
31. USART_Init(USART1, &USART_InitStructure);
32.
33. USART_ClearFlag(USART1, USART_FLAG_TXE);//开启中断之前,要先清空一下中断标志位
34. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//接收数据
35. USART_Cmd(USART1, ENABLE);
36.
37. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //中断优先级分组
38. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //中断入口
39. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
40. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
41. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //只有一个中断,这两个还是随便写,没有冲突
42. NVIC_Init(&NVIC_InitStructure);
43. }
串口1的中断服务函数
1. void USART1_IRQHandler (void)
2. {
3. //判断中断是否进入 (只要不等于0,就说明产生中断事件了)
4. if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET )
5. {
6. USART_SendData(USART1, USART_ReceiveData(USART1));//发送数据,发送串口1接收的数据
7.
8. //清除中断事件
9. USART_ClearITPendingBit(USART1, USART_IT_RXNE);
10.
11. //如果==0,就一直在这循环等待,直到等于1才跳出循环,这个标志位是1的时候,代表发送完成了
12. //while ( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//USART_FLAG_TC标志位 运行不稳定
13. while ( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
14. }
15. }
串口2、串口3配置也是一样的
然后插上开发板,打开串口调试助手,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,打开串口,诶嘿,打不开呢~_~
没接USB转TTL当然检测不到串口了!!!
没接USB转TTL当然检测不到串口了!!!
没接USB转TTL当然检测不到串口了!!!
硬件接线
参考江科大自化协up主的接线图

USB转串口的RXD接(ZET6)单片机的TXD(PA9),TXD接单片机的RXD(PA10)
单片机和USB转TTL模块共地连接,单片机上电,USB转串口也上电
然后就可以打开串口了!
串口配置,根据上述代码勾选,接收区以ASCII码模式接收
在下边的框里输入要发送给单片机的数据,勾选发送新行、自动发送
效果图如下:

实际波形
再用逻辑分析仪抓取一下波形
逻辑分析仪也连接单片机的TXD --- PA9 发送引脚
PA9就一个引脚
这里我用一根杜邦线引出来PA9接到下面这种板子上嘛,逻辑分析仪就可以接到PA9上了(做小车共用VCC和GND的板子~)

我连接的是通道7,然后在USBee软件里双击通道7,弹出下面的窗口,串口波形具体配置如下:

RXD不需要看波形,暂时不接线,不设置
单击Save,可以看到通道7波形变成这样了

抓取2s波形(500ms定时发送),大概能看4个波形

挑选一个波形,放大看看

后两个[D][A]是换行
去掉自动换行再抓取一次波形

这样也能看到波形对应电平状态,电平状态是根据波特率和周期计算的
学习视频链接:
STM32串口通讯USART串口中断配置