历史上的今天
返回首页

历史上的今天

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

2018年09月08日 | STM8L 在USART中使用DMA来发送与接收数据

2018-09-08 来源:eefocus

以USART为例子来使用DMA

分两部分,第一为,DMA这个外设自身的配置;第二为,USART的DMA部分配置,

DMA与USART的DMA配置

void SYS_DMA_Init(void)

{

CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE); //打开时钟,很重要

/* Deinitialize DMA channels */

DMA_GlobalDeInit();

 

DMA_DeInit(DMA1_Channel1);

DMA_DeInit(DMA1_Channel2);

/* DMA channel Rx of USART Configuration */

    //该函数主要要配置好接受的数组,以及USART的数据寄存器地址,数组大小,以及DMA模式

DMA_Init(DMA1_Channel2, (uint16_t)RxBuffer, (uint16_t)0x5231, \

        10, DMA_DIR_PeripheralToMemory, DMA_Mode_Normal, \

        DMA_MemoryIncMode_Inc, DMA_Priority_Low, DMA_MemoryDataSize_Byte);

 

/* DMA channel Tx of USART Configuration */

    //该函数主要配置发送数组,以及USART的数据寄存器地址,数组大小,以及DMA模式

DMA_Init(DMA1_Channel1, (uint16_t)TxBuffer, (uint16_t)0x5231, \

60, DMA_DIR_MemoryToPeripheral, DMA_Mode_Normal, \

DMA_MemoryIncMode_Inc, DMA_Priority_High, DMA_MemoryDataSize_Byte);

/* Enable the USART Tx/Rx DMA requests */

USART_DMACmd(USART1, USART_DMAReq_TX, ENABLE);

USART_DMACmd(USART1, USART_DMAReq_RX, ENABLE);

 

/* Global DMA Enable */

DMA_GlobalCmd(ENABLE);

 

/* Enable the USART Tx DMA channel */

DMA_Cmd(DMA1_Channel1, ENABLE);

/* Enable the USART Rx DMA channel */

DMA_Cmd(DMA1_Channel2, ENABLE);         

}



下面主要对void DMA_Init(DMA_Channel_TypeDef* DMA_Channelx,

              uint32_t DMA_Memory0BaseAddr,

              uint16_t DMA_PeripheralMemory1BaseAddr,

              uint8_t DMA_BufferSize,

              DMA_DIR_TypeDef DMA_DIR,

              DMA_Mode_TypeDef DMA_Mode,

              DMA_MemoryIncMode_TypeDef DMA_MemoryIncMode,

              DMA_Priority_TypeDef DMA_Priority,

              DMA_MemoryDataSize_TypeDef DMA_MemoryDataSize )

函数的主要参数做一下说明,DMA_Channelx:针对不同的外设,这个有可能是通道0123,主要根据下表来进行选择:


本例子中,USART_TX 对应的是通道1,USART_RX对应的是通道2。

DMA_Memory0BaseAddr:该参数为存储器地址,在本例中为接收数组RXBuffer或发送数组TxBuffer的指针地址。

DMA_PeripheralMemory1BaseAddr:该参数为外设的数据地址,在本例中为USART的数据寄存器的地址

DMA_BufferSize:该参数为接收数组或发送数组的缓存区大小。

DMA_DIR_TypeDef DMA_DIR:该参数为DMA数据传输的方向,在USART_TX中为存储器到外设,在USART_RX 中就为外设到存储器。

DMA_Mode_TypeDef DMA_Mode:该参数为DMA的模式,分正常模式和循环模式两种。正常模式下响应了DMA请求后不再响应请求。

下面再讲讲如何在DMA正常模式下,响应了一次DMA请求后,再次启动DMA请求,分别以USART_TX、USART_RX为例子讲解

USART_TX:在上面例子中,TxBuffer[]存放着待发送的数组,当调用DMA_Cmd(DMA1_Channel1, ENABLE);

启动DMA通道后,DMA响应了该次请求,如需再次响应请求则需先关闭DMA通道DMA_Cmd(DMA1_Channel1, DISABLE); 并调用DMA_SetCurrDataCounter(DMA1_Channel1, 60)函数重新设置待发送的数据大小,之后再使能DMA通道DMA_Cmd(DMA1_Channel1, ENABLE); 即可重新发送数据。

USART_RX:USART DMA接收中,与上面USART_TX的流程相同,当调用了DMA_Cmd(DMA1_Channel1, ENABLE)之后,DMA可响应首次接收请求,如需再次响应请求则需要关闭DMA通道DMA_Cmd(DMA1_Channel1, DISABLE); 并调用DMA_SetCurrDataCounter(DMA1_Channel2, 10)函数重新设置待接收的数据大小,之后再使能DMA通道DMA_Cmd(DMA1_Channel1, ENABLE); 即可再次响应USART接收DMA请求。



推荐阅读

史海拾趣

Corsair Memory Inc公司的发展小趣事

Corsair Memory Inc公司,由Don Lieberman、John Beekley与Andy Paul于1994年在美国加州佛利蒙创立。起初,公司专注于为英特尔系统生产Cache-On-A-Stick (COAST)模组。然而,随着英特尔将快取内存由主板移至处理器晶体中,Corsair迅速调整战略,将注意力转向电脑内存市场。这一转变不仅使Corsair避开了潜在的市场风险,更为其后续的内存业务奠定了坚实的基础。

千志电子(CCO)公司的发展小趣事

随着技术的不断进步和市场的日益成熟,千志电子开始注重电阻产业的深耕。公司不仅专注于电阻的生产,还逐渐向电阻专用设备、原材料等领域延伸。2006年,千志电子成立了深圳市鑫兴志实业有限公司,主要生产电阻相关的生产机器如切割机、焊接机、成型机、涂装机等。同时,千志电子还成立了千志电子科技(湖北)有限公司,生产各类型电阻器、设备及电阻所需原材料如碳棒、线材等。这一战略调整使千志电子形成了从原材料到设备的完整产业链,提高了生产效率和产品质量,进一步巩固了其在电阻行业的领先地位。

DAICO公司的发展小趣事

DAICO公司成立于XXXX年,最初是一家位于加利福尼亚的小型私营公司。在公司成立的初期,DAICO专注于研发和生产中频/射频和微波控制产品,以及放大器。这些产品主要用于国防电子和航空航天领域,为DAICO在电子行业中打下了坚实的基础。

Analog Microelectronics GmbH公司的发展小趣事

随着技术的不断进步,DAICO公司成功研发出一系列高可靠性的定制产品。这些产品以其卓越的性能和稳定性,赢得了客户的广泛认可。DAICO开始将业务扩展到商用飞机和其他高端商业行业,为卫星、雷达、导航、通信、电子战和导弹系统提供复杂操作不可或缺的一部分。

顺芯(Everest-semi)公司的发展小趣事

在技术创新的同时,顺芯公司也注重市场拓展和品牌建立。公司积极参加国内外各类展会和论坛,与潜在客户和合作伙伴建立了广泛的联系。同时,顺芯公司还加强了与渠道商的合作,提高了产品的市场覆盖率。通过一系列的市场推广活动,顺芯公司的品牌知名度和美誉度逐渐提升。

EMI Filter Company公司的发展小趣事

Panasonic作为电子行业的巨头,对EMI滤波器市场也早有布局。他们采取的是多元化的产品战略,针对不同行业和应用场景,推出了多种类型的EMI滤波器。无论是用于消费电子产品的片式滤波器,还是用于工业设备的大功率滤波器,Panasonic都能提供高质量的产品。这种多元化的产品战略,使得Panasonic在EMI滤波器市场上占据了重要的地位。他们的产品广泛应用于家电、汽车电子、工业自动化等领域,为全球电子行业的发展做出了重要贡献。

问答坊 | AI 解惑

创建Windows CE操作系统(二)

之前介绍过如何创建一个基本的Windows CE的平台,现在咱就上一次没有提到的部分进行一下补充定制并build OS。 首先,在VS2005 IDE中的View -> Other Windows -> Catalog Items中,添加或者删除相应的模块来完成OS定制,选项如下: 然后配置buil ...…

查看全部问答>

模拟乘法器(checked)

本帖最后由 辛昕 于 2018-4-8 22:59 编辑 关于这个东西,我后来其实从来没捡起过。 但是,也就没有必要惦记着了。 当然了,每次说到这个东西,都会想起,故人已去~ 在做运放的过程中,知道了一个叫做模拟乘法器的东西。 但是想上网看看这个东 ...…

查看全部问答>

dsPIC30F 在无传感器BLDC 控制中的应用

dsPIC30F 在无传感器BLDC 控制中的应用…

查看全部问答>

STC单片机PWM的实现方法与原理

昨晚给师弟讲课的内容,利用stc的一款单片机提供的pwm实现变频输出。程序将变频pwm输出到led上作测试。 #include sfr   CCON   = 0xD8; sfr   CMOD   = 0xD9; sfr   CL   &nb ...…

查看全部问答>

S3c2410 LCD nand flash 裸机 程序怎么写?

大家好 我也是刚接触Arm9 这几天在学S3c2410裸机程序 现在遇到一个问题:    从ADS1.2下借鉴过来的代码,通过arm-linux- 工具编译,然后通过Jflash-s3c2410 下载到nand flash ,但运行起来 LCD 始终不是希望的效果。 我把我的 ...…

查看全部问答>

谁要能整理下中九的BIN供大家下载,真是感激不尽啊!

谁要能整理下中九的BIN供大家下载,真是感激不尽啊!…

查看全部问答>

有人用过IXP2350做开发吗?帮忙看看呀~~~~

小弟最近要在ixp2350上做开发,板子是个叫ADI Engineering的公司的,无奈我按照说明书上将串口线和网线连号,接上电源,然后用minicom和hyper terminal 都试过,就是没反应…… 说明书上也没有说要别的什么设置啊~~ 有朋友做过这方面的东东没?? ...…

查看全部问答>

calibrate_delay 的头文件是什么

嵌入式开发,Linux系统,是可以在驱动里面调用calibrate_delay 这个函数的吧 不知道需要包含什么头文件…

查看全部问答>

我的移动硬盘使用时,怎么显示:"本地磁盘"啊?

求救:     我的移动硬盘使用时,怎么显示:\"本地磁盘\"啊?     而且打不开! 谁知道 怎么解决? 谢谢!!!…

查看全部问答>