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]是换行
去掉自动换行再抓取一次波形
这样也能看到波形对应电平状态,电平状态是根据波特率和周期计算的
学习视频链接: