当前位置:首页 > 单片机 > 单片机
[导读] 实验:控制串口一以DMA方式发送(TX)数据一、初始化DMA 对STM32任何模块使用前都要对其初始化、首先就是初始化外设时钟,查看时钟数可知DMA时钟由AHB得来。初始化时钟:RCC->AHBENR"=1CNDTR=cndtr;//DMA1,传输数

实验:控制串口一以DMA方式发送(TX)数据




一、初始化DMA

对STM32任何模块使用前都要对其初始化、首先就是初始化外设时钟,查看时钟

数可知DMA时钟由AHB得来。


初始化时钟:RCC->AHBENR"=1<<0;


在读数据手册可知:直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。 两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。我们实验用的是串口一、查看外设与通道的对应关系如下:

所以我们初始化DMA1的第四通道。关于通道配置过程:

其中几个简单个人理解:

CPARx:就是串口发送数据的寄存器地址;

CMARx:就是DMA传输的数据的地址;

CMDTRx:就是传输的数据大小 ,按字节传输,传输后值递减;


voidMYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32cpar,u32cmar,u16cndtr){

RCC->AHBENR|=1<<0;//开启DMA1时钟

delay_ms(5);//等待DMA时钟稳定

DMA_CHx->CPAR=cpar;//DMA1外设地址

DMA_CHx->CMAR=(u32)cmar;//DMA1,存储器地址

DMA1_MEM_LEN=cndtr;//保存DMA传输数据量

DMA_CHx->CNDTR=cndtr;//DMA1,传输数据量

DMA_CHx->CCR=0X00000000;//复位

DMA_CHx->CCR|=1<<4;//从存储器读

DMA_CHx->CCR|=0<<5;//普通模式

DMA_CHx->CCR|=0<<6;//外设地址非增量模式

DMA_CHx->CCR|=1<<7;//存储器增量模式

DMA_CHx->CCR|=0<<8;//外设数据宽度为8位

DMA_CHx->CCR|=0<<10;//存储器数据宽度8位

DMA_CHx->CCR|=1<<12;//中等优先级

DMA_CHx->CCR|=0<<14;//非存储器到存储器模式

}


//开启一次DMA传输

voidMYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)

{

DMA_CHx->CCR&=~(1<<0);//关闭DMA传输

DMA_CHx->CNDTR=DMA1_MEM_LEN;//DMA1,传输数据量

DMA_CHx->CCR|=1<<0;//开启DMA传输

}


初始化就基本完成。


在上面标识红色字体可知,开始DMA传输必须要有外设请求:



那么问题来了,请求信号是什么样的呢?


我们查看数据手册串口找到如下内容:




请求信号:就是配置USART_CR3,在实验中配置USART1->CR3=1<<7;


主函数如下:


#defineSEND_BUF_SIZE1200

u8SendBuff[SEND_BUF_SIZE];//发送数据缓冲区

constu8TEXT_TO_SEND[]={"STM32F1DMA串口实验"};

intmain(void)

{

u16i;

u8t=0;

u8j,mask=0;

Stm32_Clock_Init(9);//系统时钟设置

uart_init(72,115200);//串口初始化为115200

delay_init(72);//延时初始化

KEY_Init();//按键初始化

MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)SendBuff,SEND_BUF_SIZE);//DMA1通道4,外设为串口1,存储器为SendBuff,长度SEND_BUF_SIZE.

j=sizeof(TEXT_TO_SEND);

for(i=0;i

{

if(t>=j)//加入换行符

{

if(mask)

{

SendBuff[i]=0x0a;

t=0;

}else

{

SendBuff[i]=0x0d;

mask++;

}

}else//复制TEXT_TO_SEND语句

{

mask=0;

SendBuff[i]=TEXT_TO_SEND[t];

t++;

}

}

i=0;

while(1)

{

t=KEY_Scan(0);

if(t==KEY0_PRES)//KEY0按下

{

USART1->CR3=1<<7;//使能串口1的DMA发送

MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输!

//等待DMA传输完成,此时我们来做另外一些事,点灯

//实际应用中,传输数据期间,可以执行另外的任务

while(1)

{

if(DMA1->ISR&(1<<13))//等待通道4传输完成

{

DMA1->IFCR|=1<<13;//清除通道4传输完成标志

break;

}

}

}

}

}

[cpp]view plaincopy

如程序红色部分 传输过程出现错误或者传送完成我们可以设置标志位来提示:



这些标志位都在中断寄存器中:

我们用的是第四通道,所以是13位完成标志位,完成后再清掉中断可以接受下一次中断,清中断寄存器DMA_IFCR与ISR的位对应,这里就不解释了


关于DMA依据数据手册的简单实验到这里就结束了


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭