历史上的今天
返回首页

历史上的今天

今天是:2024年09月20日(星期五)

正在发生

2018年09月20日 | STM32F4-DISCO 学习之DMA双缓冲机制

2018-09-20 来源:eefocus

DMA具备双缓冲机制,可以让数据在传输时候不断流,也就是我们所谓的PING-PONG-BUFFER,也就是说有AB两个BUFFER,DMA访问A时候,CPU访问B,DMA访问B时候,CPU访问A.这种实现导致总线矩阵相对复杂,所以,一般低端MCU也不会有这个机制.但是在做这个机制的试验时候,虽然可以做到PING-PONG BUFFER的传输,但是..却有点小意外.其实双缓冲,在配置过程并不难,比如提供一个配置参考:


DMA_DeInit(DMA1_Stream4);

    DMA_StructInit(&DMA_InitStructure);

    DMA_InitStructure.DMA_Channel = DMA_Channel_7;

    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART3->DR; //数据传输的外设首地址

    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Buffer0; //自己定义待发送数组的首地址,要强制转换为32位

    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; //数据传输方向选择为内存->外设

    DMA_InitStructure.DMA_BufferSize = 4; //传输数据大小为8,大小要配合定义的数组类型和外设数据类型,否则会丢失或补充数据

    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器自动增加禁止,因为这里只用到了 DR 数据寄存器

    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增允许,因为要读取一个数组

    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设的数据大小,因为 USART3_DR 数据寄存器为8位,故选Byte

    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //这里也选 Byte

    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA 传输模式为 DMA_Mode_Normal,如果为 DMA_Mode_Circular,将会循环传输

    DMA_InitStructure.DMA_Priority = DMA_Priority_Low; //优先级为 High

    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;

    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;

    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;

    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

    DMA_DoubleBufferModeConfig(DMA1_Stream4, (uint32_t)Buffer1, DMA_Memory_0);

    DMA_DoubleBufferModeCmd(DMA1_Stream4, ENABLE);

我们用了DMA1中STREAM4的CH7,所以这么初始化,并填入双Buffer,每个Buffer长度是4.因为用到的是Stream4,所以查询DMA_IT_TCIF4,然后再通过DMA_GetCurrentMemoryTarget,就可以知道该换那个Buffer,查到是在用1的Buffer,我们就填0号数组,否则填1号数组,就这么简单.

void DMA1_Stream4_IRQHandler(void)

{

    uint16_t i = 0;

    GPIO_ResetBits(GPIOB, GPIO_Pin_12);

    if(DMA_GetITStatus(DMA1_Stream4, DMA_IT_TCIF4) == SET)

    {

        DMA_ClearITPendingBit(DMA1_Stream4, DMA_IT_TCIF4);

 

        if(DMA_GetCurrentMemoryTarget(DMA1_Stream4))

        {

            //现在访问是Buufer1,所以写Buffer0.

            for(i = 0; i < 4; i++)

            {

                Buffer0[i]++;

            }

        }

        else

        {

            for(i = 0; i < 4; i++)

            {

 

                Buffer1[i]--;

            }

        }

 

    }

 

}


推荐阅读

史海拾趣

C&H Technology公司的发展小趣事

C&H Technology成立于2005年,由两位志同道合的电子工程师陈先生和何先生共同创立。两位创始人凭借在半导体领域的深厚技术积累,瞄准了当时正在兴起的智能手机市场,决定开发一款高性能、低功耗的手机芯片。他们租下一间小办公室,招募了几名志同道合的工程师,开始了艰苦的创业之旅。

起初,公司面临资金短缺、技术瓶颈和市场认可度低等重重困难。但陈先生和何先生凭借坚定的信念和不懈的努力,逐步攻克技术难题,与供应商建立了稳定的合作关系,并通过参加行业展会等方式,逐渐提高了品牌知名度。经过几年的努力,C&H Technology成功推出了首款手机芯片,并获得了市场的认可。

Celduc Relais公司的发展小趣事

随着公司实力的不断增强,Celduc Relais开始积极拓展国际市场。公司通过参加国际电子展会、建立海外销售渠道以及与当地合作伙伴建立战略合作关系等方式,逐步打开了欧洲、北美和亚洲等多个国家和地区的市场。这一过程中,公司不仅提升了品牌知名度,也积累了丰富的国际业务经验。

Carlisle Interconnect Components公司的发展小趣事

Carlisle Interconnect Components公司自创立之初,便以创新和突破为核心竞争力。在电子连接器领域,公司凭借其深厚的技术积累和敏锐的市场洞察力,成功研发出一系列具有高性能和稳定性的连接器产品。这些产品不仅满足了市场对高效、可靠连接的需求,更在多个关键领域实现了技术突破,为公司赢得了市场的广泛认可。

Dae Ryung Electronic Co Ltd公司的发展小趣事

在快速发展的过程中,Dae Ryung Electronic Co Ltd公司始终注重产品质量和品牌建设。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测等各个环节都进行严格把关。同时,公司还注重品牌形象的塑造和宣传,通过广告宣传、公关活动等方式提升品牌知名度和美誉度。这些努力使得公司的产品在市场上获得了良好的口碑和认可。

ATO SOLUTION公司的发展小趣事

面对日益激烈的市场竞争,ATO SOLUTION公司不断创新营销策略,提升品牌知名度和影响力。公司利用互联网和社交媒体等新媒体平台,开展线上宣传和推广活动;同时,还积极参加各类行业展会和论坛,与业界同行和潜在客户进行深入交流和合作。这些创新的营销策略有效地提升了公司的市场影响力,为公司的业务拓展提供了有力支持。

Collins Electronics Corp公司的发展小趣事

随着科技的飞速发展,Collins Electronics Corp意识到技术创新是企业持续发展的关键。他们投入大量资源进行研发,推出了一系列具有创新技术的电子产品。其中,他们开发的一款新型高频无线电收发器,因其传输速度快、信号稳定而广受好评。这项技术不仅为公司带来了可观的利润,还推动了整个电子行业的技术进步。

问答坊 | AI 解惑

VHDL实用教程

VHDL实用教程(潘松编著)PDF格式…

查看全部问答>

给51 DIY超轻量级多任务操作系统

来源:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1398508&bbs_page_no=1&bbs_id=9999 前言 想了很久,要不要写这篇文章?最后觉得对操作系统感兴趣的人还是很多,写吧.我不一定能造出玉,但我可以抛出砖. 包括我在内的很多人都对51使用 ...…

查看全部问答>

AVR初学者提问

  我在做AVR的ADC实验时为什么第一次转换的电压值是正确的,而连续转换的电压不正确…

查看全部问答>

KEIL

编译通不过,提示TOOL。INI does not contain a tool path…

查看全部问答>

请问~~wince5.0的基于s3c2440的BSP在哪里可以下载

缺省安装时 只带了2410的BSP,急求2440版本的~~…

查看全部问答>

红外接收头的相关疑问,牛人请指教!

遥控是TC9012,它采用的38kHz的载波(一个载波周期35us),载波占空比1/3,经过调制后发送波形是9ms的引导码(前4.5ms由载波构成,后4.5ms是载波关断)和33bit的数据构成。比特1是0.56ms的载波和1.69ms的载波关断构成,比特0是0.56ms的载波和0.565ms的 ...…

查看全部问答>

短信猫在低压配电监控应用

短信猫在低压配电监控应用 随着电网改造的逐步深入,电力配网技术的高速发展,科学、经济、有效的控制电网运行,必须逐步实现、提高配网自动化水平。城市配电网自动化系统是电力部门改善供电质量,合理配置供电设备,有效实现电力需求侧管理的重要 ...…

查看全部问答>

有了解嵌入式eXtremeDB内存数据库的吗

有了解嵌入式eXtremeDB内存数据库的吗,有兴趣者,可以加入QQ群:51347012 可以访问:http://www.leadingtek.com.cn/ 邮箱:niexuebin@163.com…

查看全部问答>

参加活动免费赠送Stellaris3S5956开发板

 继TI Stellaris Cortex-M3 的Sandstorm(沙暴)、Fury Class(狂暴)、Dustdevil Class(旋风)之后,Tempest Class(飓风)系列已开始全球批量供应。Stellaris基于实现了革命性突破的ARM Cortex-M3技术之上,是业界领先的高可靠性实时微处理 ...…

查看全部问答>

有人需要这种3.5寸的触摸屏吗

全新3.5寸tft 触摸液晶屏51,avr,pic,stm,430可以直接驱动接口:16,18位接口可选39pinic: r61505u  ili9320 26万色提供51测试代码,初始化代码,接口资料,ic资料     如果有人需要的 我可以负责联系商家,估计价格会在3 ...…

查看全部问答>