DMA介绍:
DMA 控制器 STM32F103有2个:
DMA 控制器,DMA1有7个通道,DMA2有5个通道。 一个通道每次只能搬运一个外设的数据!! 如果同时有多个外设的 DMA 请求,则按照优先级进行响应。
DMA1有7个通道:
DMA2有5个通道:
优先级和传输方式:优先级设置一般用软件设置
指针递增模式:
外设和存储器指针在每次传输后可以自动向后递增或保持常量。当设置为增量模式时,下一个要传输的地址 将是前一个地址加上增量值。
1.DMA实验,内存到内存搬运:
要求:使用DMA的方式将数组A的内容复制到数组B中,搬运完之后将数组B的内容打印到屏幕。
CubeMX配置 ,DMA 配置:
用到的库函数
1. HAL_DMA_Start
2. __HAL_DMA_GET_FLAG
代码实现:
变量定义:
main函数:
需要注意HAL_DMA_Start函数第四个参数要乘以sizeof(uint32_t),单位为字节。
而且使用printf函数需要以下这段代码,并且打开MicroLIB库。
int fputc(int ch, FILE *f)
{
unsigned char temp[1]={ch};
HAL_UART_Transmit(&huart1,temp,1,0xffff);
return ch;
2.内存到外设搬运:
实验要求:使用DMA的方式将内存数据搬运到串口1发送寄存器,同时闪烁LED1。
CubeMX配置:第二个红框选择Circular模式
用到的库函数:
代码实现:
HAL_UART_Transmit_DMA函数中,第三个参数单位为字节,sendBuf里面一个元素是一个字节,所以这里直接用BUF_SIZE
3.外设到内存搬运:
实验要求:使用DMA的方式将串口接收缓存寄存器的值搬运到内存中,同时闪烁LED1。
cubeMX配置:
用到的库函数:
1. __HAL_UART_ENABLE_IT
2. HAL_UART_Receive_DMA
3. __HAL_UART_GET_FLAG
4. __HAL_UART_CLEAR_IDLEFLAG
5. HAL_UART_DMAStop
6. __HAL_DMA_GET_COUNTER
代码实现:
DMA实验说明,DMA的数据处理独立于MCU之外,在执行主函数同时,也能进行数据搬运。