博客
关于我
STM32F4外设配置速查【DMA部分】
阅读量:604 次
发布时间:2019-03-12

本文共 2941 字,大约阅读时间需要 9 分钟。

STM32F4 DMA(直接内存存取)技术文档

DMA原理

DMA(Direct Memory Access,直接存储器访问)是一种高效的数据传输机制。通过DMA控制器,系统能够在CPU不参与的情况下,将数据从一个存储位置复制到另一个存储位置,显著减少CPU的负担。DMA的操作由内部的DMA控制器完成,减少了传统的CPU干预带来的延迟和资源消耗。

优势

  • 无需CPU控制:数据传输由DMA控制器独立完成,不依赖CPU处理中断。
  • 减少中断开销:减少CPU处理中断、压栈和出栈的开销。
  • 高效数据传输:RAM与外设之间实现快速数据复制,适用于高吞吐量的数据传输任务。

STM32F4 DMA资源

STM32F4系列微控制器提供了丰富的DMA资源,支持复杂的数据传输任务:

基本特性

  • 双AHB总线结构

    • AHB总线1用于存储器访问(CPU 和 系统存储器)。
    • AHB总线2用于外设访问(外设和外设连线)。
  • DMA控制器

    • 最多支持2个DMA控制器,总计16个数据流。
    • 每个数据流包含8个通道,每个通道有独立的仲裁器,用于管理DMA优先级。
  • DMA传输模式

    • FIFO模式:支持动态数据包装和解包。
    • 直接模式:立即启动数据传输,适合小数据块操作。
  • 数据传输特性

    • 数据宽度可设置为8位、16位或32位。
    • 支持单次传输和循环传输模式。
    • 双缓冲模式下,支持同时操作两个存储器区域。
  • DMA硬件配置

    主要配置项

  • 外设与存储器访问

    • 存储器通过外设端口进行访问,可以实现存储器与外设(如串口、ADC、DAC等)的高效数据交互。
  • 双缓冲区模式

    • 双缓冲区允许在传输过程中,自动切换到另一个存储器区域。
    • 确保同时传输多个数据流,即存储器既可以作为源,也可以作为目标。
  • 传输数据量控制

    • 传输数据量由DMA控制器或外设控制,可以灵活配置。
    • 支持4、8、16节拍增量突发传输模式。
  • DMA中断机制

    DMA控制器在以下情况下会触发中断:

    • 数据传输完成(TC)。
    • 数据传输达到半传输状态。
    • 发生传输错误。
    • FIFO操作错误(溢出、空闲)。
    • 直接模式操作错误。

    中断优先级

    通过 DMA_FIFOMode_Disable 或 DMA_FIFOMode_ENABLE设置,可以在不同的中断条件下灵活配置中断响应。

    配置流程

    系统开发流程

  • 初始化DMA模块:确保数据流达到预期的初始状态。
  • 存储器和外设地址配置:将外设和存储器的物理地址分配到DMA控制器的相关寄存器。
  • 数据传输配置:包括数据传输方向、数据块大小、传输模式(FIFO/Direct)等。
  • 优先级配置:为每个数据流分配独特的通道和仲裁级别。
  • 双缓冲模式设置:配置双缓冲模式下的存储器交换机制。
  • 外设功能启用:确保外设模块配合DMA完成数据传输任务。
  • 库函数配置流程

    // DMA配置示例DMA_config(DMA2_Stream7, DMA_Channel_4, (uint32_t)&USART1->DR, (uint32_t)sender_buff, SEND_BUF_SIZE);// 使能DMA传输DMA_enable(DMA2_Stream7, SEND_BUF_SIZE);

    系统应用

    // 串口DMA示例#include "dma.h"#include "uart.h"#define SEND_BUF_SIZE 8200uint8_t send_buff[SEND_BUF_SIZE];void main(void) {    uint16_t i;    uint8_t t;    // UART配置    UART_InitTypeDef UART_InitStructure;    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART1, ENABLE);    UART_InitStructure.UART_Mode = UART_Mode_Tx;    UART_Init(UART1, &UART_InitStructure);    // DMA配置示例    DMA_config(DMA2_Stream7, DMA_Channel_4, (uint32_t)&UART1->DR, (uint32_t)send_buff, SEND_BUF_SIZE);    snprintf(send_buff, SEND_BUF_SIZE, "DMA test!");    while (1) {        t = KEY_scan(0);  // 检查键盘状态        if (t == KEY0_PRES) {  // 按下按钮            printf("\r\nDMA DATA:\r\n");            LCD_ShowString(20, 150, 200, 16, 16, "Start Transimit...");            LCD_ShowString(30, 170, 200, 16, 16, "%");            // 启用DMA传输            USART_DMACmd(UART1, USART_DMAReq_Tx, ENABLE);            while (1) {                if (DMA_GetCmdStatus(DMA2_Stream7, DMA_FLAG_TCIF7) != RESET) {  // 传输完成检查                    DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);                    break;                }                uint8_t process = DMA_GetCurrDataCounter(DMA2_Stream7);  // 获取剩余数据量                process = (100 * (1 - process / SEND_BUF_SIZE));  // 计算进度百分比                LCD_ShowNum(30, 170, 100, 3, 16);  // 显示百分比                LCD_ShowString(20, 150, 200, 16, 16, "Transimit Finished!");  // 显示完成提示            }        }        delay_ms(10);        i++;        if (i == 20) {            LED0 ^= LED0;  // 切换 LED 状态            i = 0;        }    }}

    总结

    STM32F4系列微控制器的DMA模块通过高效的硬件控制和灵活的配置方式,为系统实现快速数据传输提供了强大支持。合理配置DMA资源、优化中断处理和双缓冲模式,能够显著提升系统性能,适用于多种数据传输场景。

    转载地址:http://gygxz.baihongyu.com/

    你可能感兴趣的文章
    pl/sql developer乱码,日期格式等问题解决
    查看>>
    PL/SQL 中的if elsif 练习
    查看>>
    PL/SQL 存储函数和过程
    查看>>
    query简单入门到精通细节 - (六)Jquery效果之“淡入与淡出”
    查看>>
    PL/SQL提示“ORA-01722:无效数字,将无效数字查找出来
    查看>>
    PL/sql语法单元
    查看>>
    PL/SQL连接远程服务器数据库,出现ORA-12154: TNS: 无法解析指定的连接标识符。
    查看>>
    pl/sql锁
    查看>>
    PL2303 Windows 10 驱动项目常见问题解决方案
    查看>>