1.STM32Cube配置
USART1的默认端口不可用,所以需要更换为PA9,PA10
开启中断,设置传输速率等,生成代码
2.发送代码
发送比较简单,主要会使用sprintf和HAL_UART_Transmit_IT两个函数即可,有一些类型转换需要注意。
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
sprintf((char *)str,"%d:I from shan dong universer of technology and science\r\n",Num);
HAL_UART_Transmit_IT(&huart1,(unsigned char *)str,strlen((char *)str));
HAL_Delay(500);
/* USER CODE BEGIN 3 */
}
3.接收代码
这个是最麻烦的,我暂时不太会写接收多个不定长字符的;
目前接收一个的还可以,首先打开串口接收,在初始化的时候,之后编写中断回调函数,再次打开接收函数,准备下一次接收。
回调函数在一次接收完成之后才会进入,第三个参数表示需要接收这么多个字节的数据后才能进入中断。
HAL_UART_Receive_IT(&huart1,RX,1);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart==&huart1)
{
HAL_UART_Receive_IT(&huart1,RX,1);
}
}
DMA+中断的形式
STM32CubeMX 的配置
还是要配置中断,另外添加两个DMA并打开他的中断
代码
1.在初始化时打开空闲中断标志位,并清除空闲中断标志位,之后打开接收函数
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);//´ò¿ªIDLEµÄ±ê־λ
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//Çå³ý¿ÕÏбê־λ
HAL_UART_Receive_DMA(&huart1,RX,20);
2.在中断函数前添加判断语句,清除空闲中断,停止DMA,并处理接收数据
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//Çå³ýÖжÏ
HAL_UART_DMAStop(&huart1);//Í£Ö¹DMA
HAL_UART_IdleCpltCallback(&huart1);
}
3.编写处理函数
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
recount =20- __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
HAL_UART_Transmit_IT(&huart1,RX,recount);
recount = 0;
HAL_UART_Receive_DMA(&huart1,RX,20);
}