1、初始化的时候初始化DMA和DMA发送完成中断,串口中断
我用的是STM32G031G8U6,所以用的是串口2,为什么要串口中断。是因为DMA发送完成中断的回调函数UART_DMATransmitCplt,已经在底层定义好。并不是定义为弱函数给用户重新定义。在DMA发送完成中断中,会触发串口发送完成中断TC, 串口发送完成中断的回调函数是给用户用的
2、定义一个全局变量用来指示DMA发送完成,初值为1表示发送完成
并且包含stdarg.h 文件
3、定义myprintf
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(&huart2,(uint8_t *)SendBuff,rv);
usart_dma_tx_over = 0;//清0全局标志,发送完成后重新置1
return rv;
}
rv;}
4、串口中断回调函数
DMA发送完成后,触发串口发送完成中断,在它的回调函数中置1全局变量,表示释放DMA
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART2)
{
usart_dma_tx_over = 1;
}
}
5、重定义printf
可以使用
#define printf myprintf
定义printf为自己的DMA打印
定义为空的时候
#define printf
则可以关闭所有打印
1、初始化的时候初始化DMA和DMA发送完成中断,串口中断
我用的是STM32G031G8U6,所以用的是串口2,为什么要串口中断。是因为DMA发送完成中断的回调函数UART_DMATransmitCplt,已经在底层定义好。并不是定义为弱函数给用户重新定义。在DMA发送完成中断中,会触发串口发送完成中断TC, 串口发送完成中断的回调函数是给用户用的
2、定义一个全局变量用来指示DMA发送完成,初值为1表示发送完成
并且包含stdarg.h 文件
3、定义myprintf
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(&huart2,(uint8_t *)SendBuff,rv);
usart_dma_tx_over = 0;//清0全局标志,发送完成后重新置1
return rv;
}
rv;}
4、串口中断回调函数
DMA发送完成后,触发串口发送完成中断,在它的回调函数中置1全局变量,表示释放DMA
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART2)
{
usart_dma_tx_over = 1;
}
}
5、重定义printf
可以使用
#define printf myprintf
定义printf为自己的DMA打印
定义为空的时候
#define printf
则可以关闭所有打印
举报