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

本文共 2986 字,大约阅读时间需要 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 8200
    uint8_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/

    你可能感兴趣的文章
    Objective-C实现selection sort选择排序算法(附完整源码)
    查看>>
    Objective-C实现sha1算法(附完整源码)
    查看>>
    Objective-C实现sha256算法(附完整源码)
    查看>>
    Objective-C实现shell sort希尔排序算法(附完整源码)
    查看>>
    Objective-C实现sherman morrison公式算法(附完整源码)
    查看>>
    Objective-C实现shortest job first短作业优先算法(附完整源码)
    查看>>
    Objective-C实现sieve of Eratosthenes埃拉托色尼筛法算法(附完整源码)
    查看>>
    Objective-C实现SieveOfEratosthenes埃拉托色尼筛法打印所有素数算法(附完整源码)
    查看>>
    Objective-C实现sieveOfEratosthenes埃拉托色尼筛法求素数算法 (附完整源码)
    查看>>
    Objective-C实现sieveOfEratosthenes埃拉托色尼筛选法算法(附完整源码)
    查看>>
    Objective-C实现sigmoid函数功能(附完整源码)
    查看>>
    Objective-C实现Sigmoid函数算法(附完整源码)
    查看>>
    Objective-C实现similarity search相似性搜索算法(附完整源码)
    查看>>
    Objective-C实现simple binary search简单的二分查找算法(附完整源码)
    查看>>
    Objective-C实现simpson approx辛普森算法(附完整源码)
    查看>>
    Objective-C实现simpson rule辛普森法则算法(附完整源码)
    查看>>
    Objective-C实现simulated annealing模拟退火算法(附完整源码)
    查看>>
    Objective-C实现SinglyLinkedList单链表算法(附完整源码)
    查看>>
    Objective-C实现SizeBalancedTree大小平衡树(附完整源码)
    查看>>
    Objective-C实现skew heap倾斜堆算法(附完整源码)
    查看>>