- 简述:STM32芯片具有多个USART外设用于串口通讯,它是Universal SynchronousAsynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换,还有种UART外设Universal Asynchronous
Receiver and Transmitter,没有同步功能,只有异步通信; USART支持使用DMA;- 串行通信的分类:
- 全双工:同一时刻,两个设备可以同时收发数据(双向车道)
- 半双工:两个设备可以收发数据,但不能在同一时刻进行(比如一次只能过一辆车的双向车道)
- 单工:单方向通信,一个为发,另个为收(单向车道)
- 数据同步方式分类:
- 同步数据
- 异步数据:
- 区别:有没有时钟线; 有:同步; 无:异步;
- 传输速率:
- 通讯性能的重要参数
- 比特率(Bitrate),即每秒钟传输的二进制位数,单位:比特每秒(bit/s);
- 波特率(Baudrate),表示 每秒钟传输了多少个码元; 码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元;
- 注意:比特率=波特率 * 单个调制状态对应的二进制位数; 因为UART是按一个个二进制位发送数据的,所以在此情况下:比特率=波特率;
- 切记:数值相同,意义不同;
- 字长:(最低有效位在前)
- 7位(个别USART支持7位模式)
- 8位
- 9位
- 奇偶校验位:
- 可配置的停止位
- 1个停止位(默认值)
- 2位停止位(正常USART模式、单线模式、调制解调器模式)
- 1.5个停止位(智能卡模式)
- 0.5个停止位(智能卡模式下接收数据时使用)
- 串行通信的分类:
- 串口结构框图:
- 软件初始化流程:
- 功能初始化(波特率、字长、校验、硬件流、模式)
- 重写HAL_UART_MspInit()函数,引脚初始化
- 打开GPIO、串口时钟
- 选择串口时钟源;默认为PCLK2(RCC 专用时钟配置寄存器 (DCKCFGR))
- 默认的PCLK2时钟源,频率:108Mhz;(串口1,不同串口最大时钟频率不同,如无特殊要求按默认时钟源选择即可)
- SYSCLK时钟源,频率:216Mhz;
- 例程:
- 功能初始化
u8 aRxBuffer[RXBUFFERSIZE];//HAL库使用的串口接收缓冲 UART_HandleTypeDef UART1_Handler; //UART句柄 //初始化IO 串口1 //bound:波特率 void uart_init(u32 bound) { //UART 初始化设置 UART1_Handler.Instance=USART1; //USART1 UART1_Handler.Init.BaudRate=bound; //波特率 UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式 UART1_Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位 UART1_Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位 UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控 UART1_Handler.Init.Mode=UART_MODE_TX_RX; //收发模式 HAL_UART_Init(&UART1_Handler); //HAL_UART_Init()会使能UART1 HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE); //该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 }
- 引脚初始化
//UART底层初始化,时钟使能,引脚配置,中断配置 //此函数会被HAL_UART_Init()调用 //huart:串口句柄 void HAL_UART_MspInit(UART_HandleTypeDef *huart) { //GPIO端口设置 GPIO_InitTypeDef GPIO_Initure; if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化 { __HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟 __HAL_RCC_USART1_CLK_ENABLE(); //使能USART1时钟 GPIO_Initure.Pin=GPIO_PIN_9; //PA9 GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速 GPIO_Initure.Alternate=GPIO_AF7_USART1; //复用为USART1 HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9 GPIO_Initure.Pin=GPIO_PIN_10; //PA10 HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10 #if EN_USART1_RX HAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中断通道 HAL_NVIC_SetPriority(USART1_IRQn,3,3); //抢占优先级3,子优先级3 #endif } }
- 中断服务函数
//串口1中断服务程序 void USART1_IRQHandler(void) { u8 Res; if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET)) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { HAL_UART_Receive(&UART1_Handler,&Res,1,1000); if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } HAL_UART_IRQHandler(&UART1_Handler); }
- 功能初始化
- 总结
- 串口时钟源的选择
- HAL库中断程序较繁琐
- 串口波特率不用计算,需要多少波特率直接写多少;
【9】、STM32F767——————>串口通信
最新推荐文章于 2022-04-26 15:40:27 发布