历史上的今天
返回首页

历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2021年10月21日 | stm32专题十三:DMA(二)存储器到存储器

2021-10-21 来源:eefocus

M to M编程过程


在Flash中定义好要传输的数据,在SRAM中定义好用来接收数据的变量;

初始化DMA,主要是配置DMA结构体;

编写比较函数;

编写main函数;


1 定义数据


/* Step1 定义数据目标源和数据接收源 *********************************************/

 

/* 定义aSRC_Const_Buffer数组作为DMA传输数据源

 * const关键字将aSRC_Const_Buffer数组变量定义为常量类型

 * 表示数据存储在内部的FLASH中

 */

const uint32_t aSRC_Const_Buffer[BUFFER_SIZE]= {

                                    0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,

                                    0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,

                                    0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,

                                    0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40,

                                    0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50,

                                    0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60,

                                    0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,

                                    0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80};

 

/* 定义DMA传输目标存储器

 * 存储在内部的SRAM中

 */

uint32_t aDST_Buffer[BUFFER_SIZE];


2 初始化DMA初始化结构体


/* Step2 初始化DMA结构体 ******************************************************/

void MtM_DMA_Config(void)

{

DMA_InitTypeDef DMA_InitStruct;

// 开时钟,我经常会忘记这一步(DMA挂载在AHB总线)

RCC_AHBPeriphClockCmd(MTM_DMA_CLK, ENABLE);

// 配置初始化结构体

DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)aSRC_Const_Buffer;

DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)aDST_Buffer;

/* DMA_DIR_PeripheralSRC:外设为源,DMA_DIR_PeripheralDST:外设为目的地 */

DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;

DMA_InitStruct.DMA_BufferSize = BUFFER_SIZE;

DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Enable;

DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;

DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;

DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;

DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;

DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;

DMA_InitStruct.DMA_M2M = DMA_M2M_Enable;

DMA_Init(MTM_DMA_CHANNEL, &DMA_InitStruct);

DMA_Cmd(MTM_DMA_CHANNEL, ENABLE);

}


3 比较传输是否正确(比较两个数组是否相等)


/**

 * @brief 用于判断两个数组是否相等(1 相等 0 不等)

 */

uint8_t Buffercmp(const uint32_t *buf1, uint32_t *buf2, uint16_t buf_len)

{

uint8_t result = 1;

while (buf_len--) 

{

if (*buf1 != *buf2)

{

result = 0;

break;

}

buf1++;

buf2++;

}

return result;

}


4 在主函数中进行调用


main.c


/* main.c */

 

#include "stm32f10x.h"

#include "bsp_led.h"

#include "bsp_dma.h"

 

void delay(uint32_t count);

 

int main(void)

{

uint8_t status = 0;

LED_GPIO_Config();

LED_YELLOW;

delay(0XFFFFFF);

MtM_DMA_Config();

// 等待DMA传输完成

while (DMA_GetFlagStatus(DMA1_FLAG_TC6) != SET);

status =  Buffercmp(aSRC_Const_Buffer, aDST_Buffer, BUFFER_SIZE);

if (status == 0)

{

LED_RED;

}

else

{

LED_GREEN;

}

 

while (1)

{

}

}

 

void delay(uint32_t count)

{

for (; count != 0; count--);

}

 

bsp_dma.c


#include "bsp_dma.h"

 

/* Step1 定义数据目标源和数据接收源 *********************************************/

 

/* 定义aSRC_Const_Buffer数组作为DMA传输数据源

 * const关键字将aSRC_Const_Buffer数组变量定义为常量类型

 * 表示数据存储在内部的FLASH中

 */

const uint32_t aSRC_Const_Buffer[BUFFER_SIZE]= {

                                    0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,

                                    0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,

                                    0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,

                                    0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40,

                                    0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50,

                                    0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60,

                                    0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,

                                    0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80};

 

/* 定义DMA传输目标存储器

 * 存储在内部的SRAM中

 */

uint32_t aDST_Buffer[BUFFER_SIZE];

/* Step2 初始化DMA结构体 ******************************************************/

void MtM_DMA_Config(void)

{

DMA_InitTypeDef DMA_InitStruct;

// 开时钟,我经常会忘记这一步(DMA挂载在AHB总线)

RCC_AHBPeriphClockCmd(MTM_DMA_CLK, ENABLE);

// 配置初始化结构体

DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)aSRC_Const_Buffer;

DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)aDST_Buffer;

/* DMA_DIR_PeripheralSRC:外设为源,DMA_DIR_PeripheralDST:外设为目的地 */

DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;

DMA_InitStruct.DMA_BufferSize = BUFFER_SIZE;

DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Enable;

DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;

DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;

DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;

DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;

DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;

DMA_InitStruct.DMA_M2M = DMA_M2M_Enable;

DMA_Init(MTM_DMA_CHANNEL, &DMA_InitStruct);

DMA_Cmd(MTM_DMA_CHANNEL, ENABLE);

}

 

/**

 * @brief 用于判断两个数组是否相等(1 相等 0 不等)

 */

uint8_t Buffercmp(const uint32_t *buf1, uint32_t *buf2, uint16_t buf_len)

{

uint8_t result = 1;

while (buf_len--) 

{

if (*buf1 != *buf2)

{

result = 0;

break;

}

buf1++;

buf2++;

}

return result;

}

bsp_dma.h


#ifndef __BSP_DMA_H

#define __BSP_DMA_H

 

#include "stm32f10x.h"

 

// 要发送的数据大小

#define BUFFER_SIZE      32

 

#define MTM_DMA_CLK RCC_AHBPeriph_DMA1

#define MTM_DMA_CHANNEL DMA1_Channel6

 

extern const uint32_t aSRC_Const_Buffer[BUFFER_SIZE];

extern uint32_t aDST_Buffer[BUFFER_SIZE];

 

void MtM_DMA_Config(void);

uint8_t Buffercmp(const uint32_t *buf1, uint32_t *buf2, uint16_t buf_len);

 

#endif /* __BSP_DMA_H */

推荐阅读

史海拾趣

Advanced Semiconductor, Inc.公司的发展小趣事

随着科技的快速发展,ASI不断加大对研发的投入,努力突破技术瓶颈。在某一时期,公司成功研发出一款具有划时代意义的半导体芯片,这款芯片不仅性能卓越,而且功耗更低,极大地提升了电子设备的性能和使用体验。这一技术突破使得ASI在市场上获得了更多的份额,并奠定了公司在半导体行业的领先地位。

Esterline Technologies Corporation公司的发展小趣事

随着科技的快速发展,ASI不断加大对研发的投入,努力突破技术瓶颈。在某一时期,公司成功研发出一款具有划时代意义的半导体芯片,这款芯片不仅性能卓越,而且功耗更低,极大地提升了电子设备的性能和使用体验。这一技术突破使得ASI在市场上获得了更多的份额,并奠定了公司在半导体行业的领先地位。

喜美克斯(Cvilux)公司的发展小趣事

随着公司规模的逐渐扩大,喜美克斯公司开始思考如何进一步拓展市场。他们深入研究市场趋势和消费者需求,制定了针对不同市场的精准营销策略。通过与当地合作伙伴的紧密合作,喜美克斯成功地将产品打入了多个新兴市场,实现了销售额的快速增长。

Dailywell Electronics Co Ltd公司的发展小趣事

德利威电子一直注重技术创新和研发实力的提升。2001年,公司成功研发了高绝缘开关并导入生产,进一步巩固了其在电子开关领域的领先地位。此外,公司还不断投入研发资金,推出了一系列具有创新性和竞争力的新产品。例如,在2004年,公司成功研发了超迷你开关,这一产品以其小巧的体积和优良的性能迅速在市场上获得了广泛认可。

EXCELTA公司的发展小趣事

近年来,随着环保意识的提高和可持续发展的理念深入人心,Excelta也积极响应这一趋势。公司不断优化生产工艺和材料选择,降低产品对环境的影响。同时,公司还积极参与环保公益活动和社会责任项目,为社会和环境贡献自己的力量。这一转变不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

B&B Electronics Manufacturing Company公司的发展小趣事

在发展过程中,B&B公司注重与上下游企业的合作与共赢。公司与多家知名的芯片制造商、原材料供应商建立了长期稳定的合作关系,确保了产品的质量和供应链的稳定性。同时,公司也积极与集成商、解决方案提供商等合作伙伴开展深度合作,共同为客户提供更加完善的服务。

问答坊 | AI 解惑

专辑类——电子基础类专辑

21 世纪大学新型参考教材系列 集成电路A、B 荒井 https://bbs.eeworld.com.cn/thread-96367-1-8.html 21 世纪电子电气工程师系列 数字电路 173 页 3.0M https://bbs.eeworld.com.cn/thread-96370-1-8.html @@ 电子技术数字逻辑基础第5 版 533 ...…

查看全部问答>

请前辈帮忙介绍入门学习电子工程的基础书

如题   本人脱产大专会计毕业,但对电子工程感兴趣,准备跨专业自学。报的自考本科。无奈看不懂。想从基础的学起。不知入门方向。请前辈们帮忙介绍下电子工程专业的入门书籍。   万分感谢!  …

查看全部问答>

NK.bin与NK.nb0的区别

[转自] http://www.itxxh.cn  /Article/view.asp?id=102 [引] 在config.bib文件中,有如下三个设置: ROMSTART=xxxx ROMWIDTH=xxxx ROMSIZE=xxxxxx 这3个变量必须被赋值. [/引] nk.bin和nk.nb0都是CE的镜像。然而,我们在下 ...…

查看全部问答>

uclinux jedce_probe探测ID,变成flash的内容

Flash:两片SST39VF3201 ,一片挂CS0:地址0x80000000 一片挂CS1:地址0x81000000 使用jecdec探测 static struct map_info lpc24xx_map[2] = { {     .name =        \"LPC24XX\",     .bankw ...…

查看全部问答>

wince5.0+2440 文件系统加载问题

我按照mini2240的eboot先进行分区。。前面25个block是NBOOT.eboot.TOc,后面就是分区MBR,我将根据NK的大小分出那么大的BINFS的分区,后面的都是分成FAT的分区。从打印的信息来看我的分区是正确的,但是我没有去读分区表的信息来确认。下面我给出我的 ...…

查看全部问答>

从windows下复制一个文件到Linux系统

本人初学Linux .请问这样的一个问题。从windows下如何复制一个文件到Linux系统? 这个可以实现的吗?要是可以实现的话.请赐教.谢谢. …

查看全部问答>

没有修改工程,再次编译PB5.0时候会出现错误,怎么回事?

由于我修改了BSP导致液晶屏不亮了,所以我把原来光盘的BSP覆盖被修改的BSP,结果出现了如下错误,真是悬了。怎么回事?PB5.0也太不稳定了吧。 cannot open program database \'c:\\wince500\\public\\shell\\oak\\lib\\armv4i\\retail…

查看全部问答>

发开发板啦!数十块开发板等你拿!

发开发板啦!数十块开发板等你拿! Qemu 仿mini2440开发板v2.pdf qemu仿integratorcp开发板(arm) .pdf   当然这里只有两块,你要有兴趣,可以仿真更多开发板   我在这里回答下下面提的问题 一、qemu是什么? qemu是Linux下一个开 ...…

查看全部问答>

关于DSPbuilder仿真的问题

请问在matlab的simulink中进行DSPbuilder设计时,仿真的时候要调用modelsim仿真,但出现这个错误:# could not read \"d:\\softsetup\\quartusii\\quartus/libraries/vhdl/altera//alt_cusp80_package.vhd\": no such file or directory,请问大家 ...…

查看全部问答>

【玩转C2000 Launchpad】成功实现C2000LAUNCH和我的“家庭物联网”无线数据传输

这个实验前几天就已经完成,现在发个帖子做一个记录。 老规矩上完整工程: 这个实验是在前一个实验的基础上加入的,无线数据接收和多通道数据AD转换通过板子上的按键切换。 这次就不录视频了太麻烦了上几张图片给大家瞧瞧。 说明已经的第一行显 ...…

查看全部问答>