这次我们利用cubemx生成的DMA工程师从内存到内存的模式。
这个工程的配置很简单。
这个初始化函数只是开启了DMA外设时钟,并且配置了时钟参数后将参数写到寄存器中。
我们可以看出这个模式是DMA1通道1。这个不是凭空的,可以从手册中DMA请求映像得知。而且当外设发送一个事件后,通过自己DMA通道像DMA控制器发出请求信号,如果多个同时发出,DMA控制器根据通道优先级处理,在软件优先级相同时,根据硬件优先级决定,外设收到DMA控制器的应答信号后,释放自己的请求信号,控制器撤销应答信号,此时可以处理下一个请求。
我们接下来看DMA通道的参数。这些参数都是一些宏定义,只要追踪定义就可以查到,前面几篇文章都说过方法,这时我们不再列出。
再往后在判断中调用了参数初始化的函数,我们把主要代码部分列出。
先是用temp变量接受了DMA1通道1的寄存器中的内容。
往下是把除了通道选择的上下几个配置通道的参数在寄存器对应位置先清0,然后在按参数写入刚才被清除的寄存器的位上。最后把配置后的数据写到寄存器当中,因为刚才是写在一个临时变量中。
这就完成了配置。之后我们需要在需要的地方开启DMA传输,调用HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
我们看到此处先是失能了DMA通道,我们往下看就知道此处为什么失能。下面是将此函数的几个形参配置到寄存器中,通过setconfig函数。
我们把这里用到的寄存器列一下。
函数先是对DNDTR配置,根据手册得知这个寄存器再写入时必须是通道不工作时,所以前面首先失能了通道。由于我们前面配置的传输模式是正常模式,所以在一次传送完成后变为0,不论通道是否开启都不再传送。
下面就是选择两个储存器分别作为源和目标。函数结束后回到之前stat那个函数,再往下就是使能DMA通达了。使能了DMA通道后,DMA通道就根据通道参数进行传输数据。