STM32
直播中

李勇

7年用户 1298经验值
私信 关注
[问答]

如何对DMA进行初始化呢?如何去完成DMA串口中断呢

为什么要串口中断?

如何对DMA进行初始化呢?如何去完成DMA串口中断呢?

回帖(1)

杨雪

2021-11-30 10:05:05
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
则可以关闭所有打印
举报

更多回帖

发帖
×
20
完善资料,
赚取积分