|

楼主 |
发表于 2018-7-9 12:02:59
|
显示全部楼层
分享下usart DMA 的例程,参考ST 例程完成
接收方法:使用的是DMA 加串口空闲中断,
发送方法:使用的DMA中断检测完成
注意:
1.USART1_DMA_send 函数不能发送 长度为0 的数据 ,不然会导致 移植进入 空闲中断。 所以进入mian函数循环前请一下接收完成的标志位。如果上系统,判断一下 是否存在信号量等待。
2.发送的数据过大时 需要自己处理一下 得到接收到的数据
3.HAL_UART_Transmit_DMA 完成之后,最好HAL_UART_DMAStop 一下。重新配置一下 DMA接收 HAL_UART_Receive_DMA
uart_init(&com1); 初始化函数
测试波特率:921600 无校验,理论传输速度没毫秒 92个字节,测试毫秒100个字节收发循环测试,测试半个小时,没出现问题。
printf_dma("hello WORLD!!!\r\n");
printf_dma("I‘m a test board!!\r\n");
receive_flag = 0;
while (1)
{
if(receive_flag == 1)
{
receive_flag = 0;
if(USART1_RX_COUNT < USART_REC_LEN)
{
SCB_InvalidateDCache_by_Addr((uint32_t*)USART_RX_BUF,USART1_RX_COUNT); //接收完成后清理一下cache
USART1_DMA_send(USART_RX_BUF,USART1_RX_COUNT);
// printf_dma("%s\r\n",USART_RX_BUF);
// memset(USART_RX_BUF,0,USART1_RX_COUNT);
// SCB_CleanDCache_by_Addr((uint32_t*)USART_RX_BUF,USART_REC_LEN);
}
else //DMA出错的时候,USART1_RX_COUNT 会等于 USART_REC_LEN ,但有时候也会等于 1
{
uart_reinit(&com1);
}
}
} |
|