铁头山羊stm32 UART学习笔记 USART拥有三个USART接口,相当于人的耳朵和嘴巴能发送信息和接收信息当数据写入发送寄存器时数据的写入寄存器属于是并行写入所以移位寄存器会将并行写入的数据转换为串行然后发送出去。同样的接收数据寄存器收到的是一位一位顶过来的串行数据移位寄存器会将他们转换为并行数据写入寄存器中供我们读取。波特率波特率也表示传输速率即每秒钟最多传输多少位。波特率设置波特率寄存器中有小数部分。USART初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); USART_InitTypeDef SerialInitStruct; SerialInitStruct.USART_BaudRate 115200; SerialInitStruct.USART_Mode USART_Mode_Tx | USART_Mode_Rx; SerialInitStruct.USART_Parity USART_Parity_No; SerialInitStruct.USART_StopBits USART_StopBits_1; SerialInitStruct.USART_WordLength USART_WordLength_8b; USART_Init(USART1,SerialInitStruct);串口初始化IO将引脚配置为复用模式将引脚的控制权交由芯片中的串口模块控制。手册中GPIO推荐配置如下两个关于发送的重要标志位TxE用于判断发送数据寄存器是否为空空为1。TC标志位为发送完成标志必须发送寄存器和移位寄存器同时为空才能表示发送完成发送完成标志为1。标志位查询函数FlagStatus USART_GetFlagStatus(串口名称 USARTx要查询标志位USART_FLAG)有返回值分别为0和1。串口发送函数USART_SendData(串口名称USARTx数据0x01//注意这里手册上用的是uint16_t原因是如果是无符号八位整型的话我们要发九位的数据就发送不了了所以要用一个十六位无符号整型的数据。uint8_t ab[] {9,0,2,6,2,9}; USART_SendSerial(USART1,ab,5); void USART_SendSerial(USART_TypeDef *USARTx,uint8_t*pData,uint16_t Size) { for(uint32_t i 0; i Size; i) { //等待数据发送寄存器为空 用while卡住程序 //当TXE标志位为SET时表示数据发送寄存器为空 程序往下走开始写入数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) RESET); USART_SendData(USART1,pData[i]); } while(USART_GetFlagStatus(USART1,USART_FLAG_TC) RESET); }格式化打印字符串重写fputc函数使printf可以直接发送到串口需应用stdio.hint fputc(int ch,FILE *f) { while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET); USART_SendData(USART1,(uint8_t)ch); return ch; }打印stm32时间至串口对一千取余可求得毫秒数将变量除一千再重新赋值给变量可以将已经得到的毫秒数去掉接下来继续对时间变量对六十取余得到秒将变量除六十再重新赋值给变量可以将已经得到的秒数去掉依次取得分钟数小时数。使用printf打印两位无符号整数%02u也可以是%02d。关于接收的重要标志位RxNE标志位用于判断接收数据寄存器是否为空当接收数据寄存器不为空时RxNE为1否则则为0。串口接收函数从接收数据寄存器中读取数据通过RxNE标志位确定接收数据寄存器是否有数据然后用uint16_t USART_ReceiveData(USARTx串口名称)读取接收数据寄存器中的数据。与串口发送函数一样//注意这里手册上用的是uint16_t原因是如果是无符号八位整型的话我们要发九位的数据就发送不了了所以要用一个十六位无符号整型的数据。串口接收函数具体代码使用串口点亮板载led灯while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) RESET); uint8_t byteRcvd USART_ReceiveData(USART1); if(byteRcvd 0) { GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET); } else if(byteRcvd 1) { GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET); }几个错误标志位