HAL库STM32CubeMX_串口DMA发送(printf重定向)
主要转载来自stm32+cubemx+usart+dma传输实现dma重定义printf,及dma接收,提高数据传输效率(仅供学习交流,侵删)
主要是为了简单记录一下,以便后日使用。
CubeMX配置
代码修改
usart.c
- 前面添加相关定义
/* USER CODE BEGIN 0 */
volatile uint8_t usart_dma_tx_over = 1;
/* USER CODE END 0 */
- 补充函数
/* USER CODE BEGIN 1 */
int myprintf(const char *format,...)
{
va_list arg;
static char SendBuff[200] = {0};
int rv;
while(!usart_dma_tx_over);//等待前一次DMA发送完成
va_start(arg,format);
rv = vsnprintf((char*)SendBuff,sizeof(SendBuff)+1,(char*)format,arg);
va_end(arg);
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)SendBuff,rv);
usart_dma_tx_over = 0;//清0全局标志,发送完成后重新置1
return rv;
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)
{
usart_dma_tx_over = 1;
}
}
/* USER CODE END 1 */
usart.h
- 添加相关定义
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "stdarg.h"
#define printf myprintf
int myprintf(const char *format,...);
/* USER CODE END Includes */
使用例:
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask*/
uint8_t i = 0;
/* Infinite loop */
for(;;)
{
printf("num:%d\r\n",i++);
osDelay(1000);
}
/* USER CODE END StartDefaultTask*/
}
再次申明:主要转载来自stm32+cubemx+usart+dma传输实现dma重定义printf,及dma接收,提高数据传输效率(仅供学习交流,侵删)