• STM32F407-- DMA使用


    目录

    1. DMA结构体 

    STM32F103:

    STM32F407:

     2. F4系列实现存储器到存储器数据传输

    1)结构体配置&初始化

    2)主函数

    补充知识点:关于变量存储的位置,关于内部存储器一般存储什么内容

    3. F4系列实现存储器到串口4数据传输

    1)结构体配置 & 初始化

    2)主代码:实现串口4DMA请求,以及使能DMA


    1. DMA结构体 

    STM32F103
    1. typedef struct
    2. {
    3. uint32_t DMA_PeripheralBaseAddr; //外设地址
    4. uint32_t DMA_MemoryBaseAddr; //存储器地址
    5. uint32_t DMA_DIR; //传输方向
    6. uint32_t DMA_BufferSize; //数据传输量
    7. uint32_t DMA_PeripheralInc; //外设地址指针增量
    8. uint32_t DMA_MemoryInc; //存储器地址指针增量
    9. uint32_t DMA_PeripheralDataSize; //外设数据宽度
    10. uint32_t DMA_MemoryDataSize; //存储器数据宽度
    11. uint32_t DMA_Mode; //模式,一次/循环
    12. uint32_t DMA_Priority; //通道优先级
    13. uint32_t DMA_M2M; //存储器到存储器
    14. }DMA_InitTypeDef;
    STM32F407:
    1. typedef struct
    2. {
    3. uint32_t DMA_Channel; //通道
    4. uint32_t DMA_PeripheralBaseAddr; //外设地址
    5. uint32_t DMA_Memory0BaseAddr; //存储器地址
    6. uint32_t DMA_DIR; //方向
    7. uint32_t DMA_BufferSize; //数据量
    8. uint32_t DMA_PeripheralInc; //外设地址增量
    9. uint32_t DMA_MemoryInc; //存储器地址增量
    10. uint32_t DMA_PeripheralDataSize; //外设数据宽度
    11. uint32_t DMA_MemoryDataSize; //存储器数据宽度
    12. uint32_t DMA_Mode; //模式
    13. uint32_t DMA_Priority; //通道优先级
    14. uint32_t DMA_FIFOMode; //FIFO模式(存储器到存储器不能使用)
    15. uint32_t DMA_FIFOThreshold; //
    16. uint32_t DMA_MemoryBurst; //存储器突发长度
    17. uint32_t DMA_PeripheralBurst; //外设突发长度
    18. }DMA_InitTypeDef;

     2. F4系列实现存储器到存储器数据传输

    1)结构体配置&初始化

            STM32F47的DM1和DM2外设端口控制有所不同,DM1不连接总线矩阵,因此要实现存储器到存储器的数据传输只能使用DM2。而且,在选择存储器到存储器传输时,通道和数据流是可以随意选择的,没有硬性规定选择哪个。

            这里实现的存储器到存储器,指flash到sram。

    DMA配置:

    1. void DMA_config(void)
    2. {
    3. DMA_InitTypeDef DMA_Structure;
    4. //DMA2时钟
    5. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
    6. //DMA2复位 将CREN=0
    7. DMA_DeInit(DMA2_Stream4);
    8. while (DMA_GetCmdStatus(DMA2_Stream4) != DISABLE);
    9. //DMA结构体配置
    10. DMA_Structure.DMA_Channel=DMA_Channel_4;
    11. DMA_Structure.DMA_PeripheralBaseAddr=(uint32_t)ArrayA;
    12. DMA_Structure.DMA_Memory0BaseAddr=(uint32_t)ArrayB;
    13. DMA_Structure.DMA_DIR=DMA_DIR_MemoryToMemory;
    14. DMA_Structure.DMA_BufferSize=SENDBUFF_SIZE;
    15. DMA_Structure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
    16. DMA_Structure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
    17. DMA_Structure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;
    18. DMA_Structure.DMA_MemoryInc=DMA_MemoryInc_Enable;
    19. DMA_Structure.DMA_Mode=DMA_Mode_Normal;
    20. DMA_Structure.DMA_Priority=DMA_Priority_High;
    21. DMA_Structure.DMA_FIFOMode=DMA_FIFOMode_Disable;
    22. DMA_Structure.DMA_FIFOThreshold=DMA_FIFOThreshold_1QuarterFull;
    23. DMA_Structure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;
    24. DMA_Structure.DMA_MemoryBurst=DMA_MemoryBurst_Single;
    25. //DMA初始化
    26. DMA_Init(DMA2_Stream4, &DMA_Structure);
    27. //DMA使能 CREN=1
    28. DMA_Cmd(DMA2_Stream4, ENABLE);
    29. }
    2)主函数
    1. void main(void)
    2. {
    3. DMA_config();
    4. }
    补充知识点:关于变量存储的位置,关于内部存储器一般存储什么内容

            代码code和只读数据Ro-data存放在flash中。Ro-data为程序中定义的常量const,在程序执行完成后,内存系统自动释放。

            读写的数据Rw-data和未初始化数据Zi-data存放在RAM中。

    Rw-data表示:已初始化的全局变量 = 栈区(stack)堆区(heap)全局区(静态区)(static)

    Zi-data表示:未初始化的全局变量

     在这里插入图片描述

     如下图所示,最低内存地址到最高地址,都是存放在内部的flash或者sram中。

    1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。
    2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。
    3、全局变量、静态变量:初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程序结束后由系统自动释放。
    4、文字常量:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中,程序结束后由系统自动释放。

    5、程序代码(code):存放函数体的二进制代码。


    在这里插入图片描述

            知识点参考原文链接:https://blog.csdn.net/as480133937/article/details/87608816

    3. F4系列实现存储器到串口4数据传输

    1)结构体配置 & 初始化

    串口:

    1. void USART_Config(void)
    2. {
    3. GPIO_InitTypeDef GPIO_InitStructure;
    4. USART_InitTypeDef USART_InitStructure;
    5. //时钟
    6. DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK,ENABLE);
    7. DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK,ENABLE); //打开外设对应的RCC时钟
    8. //将PIN口配置成复用功能UART4 与F103不同
    9. GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_UART4);
    10. GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_UART4);
    11. //接口配置,初始化
    12. //TX & RX一起配置,与F103不同
    13. GPIO_InitStructure.GPIO_Pin=DEBUG_USART_TX_GPIO_PIN ;
    14. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
    15. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    16. GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
    17. GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
    18. GPIO_Init(DEBUG_USART_TX_GPIO_PORT,&GPIO_InitStructure);
    19. GPIO_InitStructure.GPIO_Pin= DEBUG_USART_RX_GPIO_PIN;
    20. GPIO_Init(DEBUG_USART_RX_GPIO_PORT,&GPIO_InitStructure);
    21. //USART配置,初始化
    22. USART_InitStructure.USART_BaudRate=DEBUG_USART_BAUDRATE;
    23. USART_InitStructure.USART_WordLength=USART_WordLength_8b;
    24. USART_InitStructure.USART_StopBits=USART_StopBits_1;
    25. USART_InitStructure.USART_Parity=USART_Parity_No;
    26. USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    27. USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    28. USART_Init(DEBUG_USARTx,& USART_InitStructure);
    29. 中断优先级配置
    30. //NVIC_Configuration();
    31. //中断源,接收产生中断
    32. USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,ENABLE);
    33. //串口使能,开启串口
    34. USART_Cmd(DEBUG_USARTx,ENABLE); //相当于开启USART工作时钟,让USART工作
    35. }

    DMA: 

    1. void DMA_config(void)
    2. {
    3. DMA_InitTypeDef DMA_Structure;
    4. //打开DMA1时钟
    5. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
    6. //复位 将CREN=0
    7. DMA_DeInit(DMA1_Stream4);
    8. while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE);
    9. //DMA结构体配置
    10. DMA_Structure.DMA_Channel=DMA_Channel_4;
    11. DMA_Structure.DMA_PeripheralBaseAddr=(u32)(&(UART4->DR)); //为串口的DR寄存器地址
    12. DMA_Structure.DMA_Memory0BaseAddr=(uint32_t)ArrayA;
    13. DMA_Structure.DMA_DIR=DMA_DIR_MemoryToPeripheral;
    14. DMA_Structure.DMA_BufferSize=SENDBUFF_SIZE;
    15. DMA_Structure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
    16. DMA_Structure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
    17. DMA_Structure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
    18. DMA_Structure.DMA_MemoryInc=DMA_MemoryInc_Enable;
    19. DMA_Structure.DMA_Mode=DMA_Mode_Normal;
    20. DMA_Structure.DMA_Priority=DMA_Priority_Medium;
    21. DMA_Structure.DMA_FIFOMode=DMA_FIFOMode_Disable;
    22. DMA_Structure.DMA_FIFOThreshold=DMA_FIFOThreshold_1QuarterFull;
    23. DMA_Structure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;
    24. DMA_Structure.DMA_MemoryBurst=DMA_MemoryBurst_Single;
    25. //DMA初始化
    26. DMA_Init(DMA1_Stream4, &DMA_Structure);
    27. //DMA使能 CREN=1
    28. DMA_Cmd(DMA1_Stream4, DISABLE);
    29. }
    2)主代码:实现串口4DMA请求,以及使能DMA
    1. int main(void)
    2. {
    3. USART_Config();
    4. DMA_config();
    5. USART_DMACmd(DEBUG_USARTx, USART_DMAReq_Tx, ENABLE);
    6. }

  • 相关阅读:
    基于Cortex-M的RTOS上下文切换详解及FreeRTOS实例
    2022一文了解科技特长生
    WEB前端网页设计 HTML网页代码 基础参数(二)
    【STM32系统】基于STM32设计的按键PWM控制舵机窗帘&柜子&门禁&家居等控制系统——文末资料下载
    关于==和equals的区别和联系,面试这么回答就可以
    元年专利解析|元数据管理系统和使用其对模型对象进行建模的方法
    《Python编程:从入门到实践》第二章练习题
    C#应用处理传入参数 - 开源研究系列文章
    JAVA经典面试题附答案(持续更新版)
    zookeeper学习笔记
  • 原文地址:https://blog.csdn.net/weixin_41155462/article/details/131716624