使用STM32CubeMX实现中断模式下的串口收发山西大学电子信息工程系王晓峰Wangxiaofeng@sxu.edu.cn1、在PinOut窗口左边栏配置串口,选中Asynchronous模式。右侧窗口会自动显示串口占用的相关引脚为绿色。2、在clockconfiguration窗口内配置各部分时钟。其中USART1、6是挂在APB2(90MHz)下,UART2~8是挂在APB1(45MHz)下。显然1、6是做高速同步串行总线用的,低速通信用4、5、6、8就好。但是APB总线只是代表了串口能达到的最大速率,具体波特率在Configuration中设置。3、configuration窗口单击UART按钮弹出设置窗口。BaudRate:波特率:此后生成的初始化程序会对波特率和APB总线频率进行自动换算。WordLength:字长Parity:校验位StopBits:停止位DataDirection:设置发送接收模式OverSampling:对接收信号的采样倍率。如果软件模拟串口一般3次采样/位就够了,这里默认即可。中断设置,勾上就好。引脚配置,默认就好。4、如何使用MX生成的程序A)先添加全局变量:__IOITStatusUart5Ready_T=SET;//此处必须赋值SET__IOITStatusUart5Ready_R=RESET;uint8_taTxBuffer[100];//发送缓冲区uint8_taRxBuffer[1];uint8_tRxbuff[100];uint8_tRx_count_UART5=0;//UART5接收计数器uint8_tRx_Num_UART5=0;//UART5一条指令全部接收后的接收字节数B)串口发送的实现方法if(Uart5Ready_T==SET){Uart5Ready_T=RESET;if(HAL_UART_Transmit_IT(&huart4,(uint8_t*)aTxBuffer,82)!=HAL_OK)Error_Handler();}每次发送结束,Uart5Ready_T会在回调函数中被赋值RESET。上次未发送完,下次发送直接跳过忽略。当然,只要时基控制好,这样处理不过是以防万一了。C)串口接收的实现方法在main.c的while(1)前执行if(HAL_UART_Receive_IT(&huart5,aRxBuffer,1)!=HAL_OK)Error_Handler();开启接收中断,准备接收。在main.c中重写串口接收回调函数如下:voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle){uint8_ti=0;if(UartHandle-Instance==UART5){Rxbuff[Rx_count_UART5]=aRxBuffer[0];if((Rxbuff[Rx_count_UART5-1]==0x0D)&&(Rxbuff[Rx_count_UART5]==0x0A)){Uart5Ready_R=SET;Rx_Num_UART5=++Rx_count_UART5;Rx_count_UART5=0;}elseRx_count_UART5++;HAL_UART_Receive_IT(&huart5,aRxBuffer,1);//开启下一次接收中断}}在此回调函数中,每次接收到的字节aRxBuffer[0]都会存入Rxbuff[],Rx_count_UART5自动加1。结束字节为0x0D0x0A。一组字节接收结束后,Uart5Ready_R将赋值为SET,接收字节数保存在Rx_Num_UART5。因为在调用HAL_UART_IRQHandler(&huart5);时,调用了UART_Receive_IT(),其中执行了__HAL_UART_DISABLE_IT(huart,UART_IT_RXNE),所以接收中断必须在回调函数中重新开启,最简单的就是重复调用HAL_UART_Receive_IT(&huart5,aRxBuffer,1)了。5、EnjoyyourApplication!^_^