马上注册,玩转Robomaster!
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本文已经同步发布于作者部署的私人博客 为了更好的排版和观看体验
从STM32开始的RoboMaster生活:进阶篇 IV [DMA]
1.0 什么是DMA
1.1 DMA的定义Direct Memory Access:直接存储器访问 是所有现代计算设备的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于CPU的大量中断负载。否则,CPU需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU对于其他的工作来说就无法使用。DMA传输将数据从一个地址空间复制到另外一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA传输是高效能嵌入式系统算法和网络最关键的部分。 从上图可以看出,DMA和CPU是同等地位的,CPU能进行的数据转移操作,DMA都能做,或者说,DMA就是只能做数据转移操作的迷你CPU。 如果要简单理解的话,DMA就是CPU小弟,当CPU觉得把一大串数据转移到另一个地方这种任务太麻烦,还有更重要的事情需要做的时候,就可以把这个任务丢给DMA去干,DMA干完或者出问题了跟CPU说一声就行了。 1.2 DMA的内部结构2.0 什么情况下使用DMA?
2.1 UART2.2 ADC2.3 SD3.0 DMA的使用方法
3.1 传输方向3.2 特殊选项3.3 传输模式
3.3.1 Normal Mode3.3.2 Circular Mode / Continuous Mode3.4 传输方式
3.4.1 DMA泛用方法(需要用到寄存器)
3.4.1.1 Polling需要注意的是,DMA的Polling其实根本毫无意义,因为在这个过程中,CPU还是全程参与了,并没有解放CPU,所以,虽然这种方法我还是列出来了,但是除了Debug时可能会用到,其他情况下建议不要用。
- HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
复制代码参数
hdma:指向DMA Stream配置结构体 SrcAddress:需要传输的数据的地址 DstAddress:数据传输到的目标地址 DataLength:传输的数据大小
返回值
- huart.Instance->CR3|=USART_CR3_DMAT;
复制代码- HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, HAL_DMA_LevelCompleteTypeDef CompleteLevel, uint32_t Timeout);
复制代码参数
hdma:指向DMA Stream配置结构体 CompleteLevel:指定DMA的完成程度 Timeout:传输的最大时限
返回值
- huart.Instance->CR3&=~USART_CR3_DMAT;
复制代码 3.4.1.2 Interrupt
- HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength);
复制代码参数
hdma:指向DMA Stream配置结构体 SrcAddress:需要传输的数据的地址 DstAddress:数据传输到的目标地址 DataLength:传输的数据大小
返回值
- huart.Instance->CR3|=USART_CR3_DMAT;
复制代码- void XferCpltCallback(DMA_HandleTypeDef *hdma){
- ......
- }
复制代码- huart.Instance->CR3&=~USART_CR3_DMAT;
复制代码 3.4.2 UART特化方法(全HAL库实现)
- HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
复制代码参数
huart:指向UART引脚配置结构体 pData:指向需要传输的数据 Size:传输数据的大小
返回值
[code]HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);[/code]
参数
huart:指向UART引脚配置结构体 pData:指向需要传输的数据 Size:传输数据的大小
返回值
- void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
- ......
- }
复制代码- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
- ......
- }
复制代码 4.0 练习项目
4.1 项目简介4.2 项目代码4.2.1 一键发送信息4.2.2 键盘回响 代码链接:https://github.com/AlchemicRonin/-STM32-RoboMaster-
4.3 效果展示
本文已经同步发布于作者部署的私人博客 为了更好的排版和观看体验
|