端口重映射
直接存储器访问控制
DMA(Direct Memory Access )可以在无需任何CPU操作的情况下快速移动数据。
DMA__CCR 位四是DIR设置:1表示从存储器到外设,0表示从外设到存储器
使用流程:
- 建立(选取)传输通道
存储器到存储器,外设到存储器 ,存储器到外设
- 确定传输对象
UART-内存 , 内存-UART
- 敲定传输细节
优先级 ,确定由谁来产生DMA请求,外设的DMA请求对应通道 、确定传输数据双方的数据格式、确定数据是否需要一直采集,是否需要传输标志|中断,
F4还多了双缓冲模式(可以分时填充两块区域)和FIFO功能|单次传输和突发传输(FIFO的数据宽度随源变化,先行进行封装)
单次传输:一次请求触发一次传输 突发传输:一个请求可触发多次传输(4\8\16)
这里很重要,不然会出现传输数据错误
Increment 增加
HAL库的初始化函数中有Instance 和Init
__HAL_LINKDMA(uartHandle, hdmarx, hdma_usart1_rx)
hdmarx是uartHandle的 成员 ,第三个参数是赋给hdmarx的值
DMA communition parameters 交流参数
设置好后调用HAL_DMA_Start(&DMA_Handle, 源数据地址,目标地址) //如果是数组的地址的话,直接放数组名就行
对于数组来说,下面两个都对。但是对一个变量来说,需要加取地址符
HAL_DMA_Start(&DMA_handle, (uint32_t)aSRC_Const_Buffer, (uint32_t)aDST_Buffer, BUFFER_SIZE);
HAL_DMA_Start(&hdma_memtomem_dma1_channel1, (uint32_t)&aSRC_Const_Buffer, (uint32_t)&aDST_Buffer, BUFFER_SIZE);
可以用DMA_status = HAL_DMA_Start(……), 然后再接一个判断判断DMA数据流参数配置是否成功的函数 。
DMA的板级支持包编写完毕后再主函数中调用其初始化函数,然后使用while( HAL_DMA_GET_FLAG(&DMA_Handle, DMA_FLAG_TC6)==DISABLE){ }来等待DMA传输完成
之后可以调用Buffercmp(源数据地址,目标数据地址, BufferLength)来比较传输的数据是否正确。 Buffer 缓冲区
DMA:从存储器到存储器
通过调试发现:多传输几个字节的数据,再调用数据对比函数就会出现数据不相符合。
当数组作为函数入口参数时,其前面括号的作用是
DMA:从存储器到外设(串口)
Debug查看变量
Cnanot evaluate
必须是当前断点处所在的函数里面有这个参数才行,或者是全局变量.
变量Not in the scope
常用存储器类型