OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3227|回复: 1

萌新求问,STM32F103用DMA将flash数据搬到sram中

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-5-19
在线时间
9 小时
发表于 2020-6-3 15:58:03 | 显示全部楼层 |阅读模式
1金钱
DMA配置DMA2通道1,外设地址设置为flash起始地址,如下
DMA_InitStructure.DMA_PeripheralBaseAddr = ((uint32_t)(0x08000000));   //flash起始地址
内存地址设为一个接收数组(顺带问下这边通过设置接收数组是不是就是存到sram中了)
地址增加都为Enable,开启内存到内存,然后想把得到的数据打印在串口上,但一直输出30 09 2C怎么回事
主要程序如下
DMA.C
void M2M_DMA_Init(uint8_t* ReceiveData,uint32_t len)
{
        DMA_InitTypeDef DMA_InitStructure;
//        NVIC_InitTypeDef NVIC_InitStructure;
  // 开启DMA1时钟
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
       
        DMA_Cmd(DMA2_Channel1, DISABLE);                           // 关DMA通道  DMA1_Channel5   UART1_Rx_DMA_Channel
        DMA_DeInit(DMA2_Channel1);   

        // 设置串口接收数据寄存器
        DMA_InitStructure.DMA_PeripheralBaseAddr = ((uint32_t)(0x08000000));   //flash起始地址
        // 设置串口接收数据寄存器
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ReceiveData;     //接收地址,定义后默认在sram中某块
  //外设到内存       
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;   
        //长度
        DMA_InitStructure.DMA_BufferSize = len;   
  //外设地址增加       
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
  //内存地址自增       
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;   
  //外设、内存数据宽度       
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  //一次模式
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                           
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
        // 开启内存到内存的DMA模式       
        DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;         
        DMA_Init(DMA2_Channel1, &DMA_InitStructure);               // 写入配置               
        DMA_ClearFlag(DMA2_FLAG_GL1);                                 // 清除DMA所有标志               
        DMA_Cmd(DMA2_Channel1, ENABLE);                            // 开启接收DMA通道,等待接收数据
}


//main()
uint8_t receiveData[10];

int main()
{
        USART1_Init(115200);
        M2M_DMA_Init(receiveData,10);

        while(1)
        {
                for(int i=0;i<10;i++)
                {
                        printf("%d\t,",receiveData[i]);
                }
                M2M_DMA_Init(receiveData,10);
                for(int i=0;i<100000;i++);
        }
}

最佳答案

查看完整内容[请看2#楼]

欸,解决了,DMA_DIR出了问题,DST应该是SRC的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-5-19
在线时间
9 小时
 楼主| 发表于 2020-6-3 15:58:04 | 显示全部楼层
欸,解决了,DMA_DIR出了问题,DST应该是SRC的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 19:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表