cubemx_usart_dma源码分析

这个工程无非就是讲USART和DMA综合起来,此处DMA的模式不再是储存器到储存器。

我们直接看这个工程中和串口,DMA的不同之处。

在配置了串口和DMA参数初始化后,有一条语句。是一个带参数的宏。

__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart1_tx);

#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD_, __DMA_HANDLE_)           \
                        do{                                                  \
                              (__HANDLE__)->__PPP_DMA_FIELD_ = &(__DMA_HANDLE_); \
                              (__DMA_HANDLE_).Parent = (__HANDLE__);             \
                          } while(0)

这个宏有三个参数,第一个是串口句柄,第二个是串口句柄内的一个DMA句柄指针,最后一个参数是DMA句柄。

从这个宏的定义中我们可以看出,把DMA句柄的地址赋值给了串口句柄内的一个指针变量,把串口句柄的地址赋值给了DMA句柄的一个指针变量。

其实就是将DMA和串口联系起来了,方便通过参数去写函数了。


查找手册,可以得知使用DMA进行串口发送需要的步骤,激活DMAT位,在学DMA时,我们知道,DMA处理是外设发生特点事件后,像DMA发送一个请求,此处满足可以发送请求的时间是TXE被置1,即发送寄存器空。下面的参数我们还没有确定源地址,目标地址,发送字长,激活通道。接着往下看串口DMA发送函数。

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)看关键的代码。


显示指定了三个函数。下是开启DMA通道,这个函数关键代码我们也给出

DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);

  __HAL_DMA_ENABLE_IT(hdma, DMA_IT_TC);


  /* Enable the Half transfer complete interrupt */
  __HAL_DMA_ENABLE_IT(hdma, DMA_IT_HT);  


  /* Enable the transfer Error interrupt */
  __HAL_DMA_ENABLE_IT(hdma, DMA_IT_TE);


   /* Enable the Peripheral */
  __HAL_DMA_ENABLE(hdma);

第一个被调的函数我们前面分析过了,就是将参数写到寄存器中,接下来就是开启了DMA中断。最后开启了DMA通道。

回到前面往下就是清除TC位,为什么清除TC位,根据上面我贴出的手册,里面有一句话,DMA监视TC位来判断是否通信结束。所以为了防止误判有这一步,再往下就是将DMAT位置1,手册说是使能发送时的DMA,其实这句话就是当有事件发送时,可以发出请求信号。

到了这里我们就按照手册当中的步骤实现了所有需要配置的东西。

手册里还提到发送完指定的数据量后可以触发一次DMA中断,从代码中看出不知开启了传输完成中断,还开启了半传输完成中断。

我们看看中断的一部分,只看传输完成中断的代码


这里第二个if是判断是否为非循环模式,由于我们配置的工程中开启的是循环模式,所以每次中断进来都不会满足这个条件,也就不会关闭中断,此时中断一直开着。

我们来看看如果是正常模式,这个条件满足,都会执行什么。我们可以看到,主要就是失能了此种中断,清除了一些标志位。最后一个判断语句是重点,当这个不是一个空指针时执行一个一个回调函数。而这里的回调函数就是我们之前在DMA发送函数里赋值的哪些函数指针,这里通过函数指针调用了。传输完成中断也是这样的。我们不再分析。

到这里我们就分析完了DMA串口发送了。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值