stm32使用dma传输串口数据时,当dma中断发送完成

2019-12-12 18:17发布

stm32使用dma传输串口数据时,当dma中断发送完成时,是串口发送完成了,还是dma到串口完成了?谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
love_ourdev
2019-12-14 19:53
jaky80000 发表于 2019-3-20 07:33
我在实际测试过程中有这个现象,初始化时并没有开启发送完成中断,在dma传输完成中断里开启发送完成中断 ...

正应了IT界那句名言,“Talk is cheap, show me the code!”,这是我用在STM32F1XX的串口发送代码,USART2用DMA1_Channel7通道发送,你看看:
  1. void Drv_Usart2TxStream(uint8_t const data[], uint32_t num)
  2. {
  3.   if(!data || !num){
  4.     return;
  5.   }

  6.   if(is_tx_busy){
  7.     return;
  8.   }

  9.   /* 设置发送忙标志,表示占用硬件 */
  10.   is_tx_busy = TRUE;
  11.   
  12.   /* 清除串口发送完成中断标志 */
  13.   USART_ITConfig(USART2, USART_IT_TC, DISABLE);
  14.   USART_ClearFlag(USART2, USART_FLAG_TC);

  15.   /* 启动DMA发送 */
  16.   DMA1->IFCR = DMA_IFCR_CGIF7;
  17.   DMA1_Channel7->CCR   = ((0<<12)|(0<<8)|DMA_CCR7_MINC|DMA_CCR7_DIR);
  18.   DMA1_Channel7->CCR  |= (DMA_CCR7_TCIE|DMA_CCR7_TEIE);
  19.   DMA1_Channel7->CPAR  = (uint32_t)&USART2->DR;
  20.   DMA1_Channel7->CMAR  = (uint32_t)data;
  21.   DMA1_Channel7->CNDTR = (uint16_t)num;
  22.   DMA1_Channel7->CCR  |= DMA_CCR7_EN;
  23. }

  24. void DMA1_Channel7_IRQHandler(void)
  25. {
  26.   uint32_t isr = DMA1->ISR;
  27.   DMA1->IFCR = DMA_IFCR_CGIF7;
  28.   if(isr & (DMA_ISR_TEIF7|DMA_ISR_TCIF7)){
  29.     DMA1_Channel7->CCR = 0;
  30.     USART_ITConfig(USART2, USART_IT_TC, ENABLE);
  31.   }
  32. }

  33. void USART2_IRQHandler(void)
  34. {
  35.   // 最后一字节发送完成中断
  36.   if((USART2->CR1 & USART_CR1_TCIE) && (USART2->SR & USART_SR_TC)){
  37.     USART_ITConfig(USART2, USART_IT_TC, DISABLE);
  38.     is_tx_busy = 0;
  39.     // 至此,最后一字节也发送完成了
  40.   }
  41. }
复制代码
代码中更新is_tx_busy变量的地方,对应某些应用种RS485切换方向的地方。

一周热门 更多>