STM32F103之DMA实验,内存通过DMA向串口1发送数据

发布者:码梦创想最新更新时间:2019-01-07 来源: eefocus关键字:STM32F103  DMA实验  内存  发送数据 手机看文章 扫描二维码
随时随地手机看文章


#include "dma.h"

//////////////////////////////////////////////////////////////////////////////////   

//////////////////////////////////////////////////////////////////////////////////

 

DMA_InitTypeDef DMA_InitStructure;

 

u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度     

//DMA1的各通道配置

//这里的传输形式是固定的,这点要根据不同的情况来修改

//从存储器->外设模式/8位数据宽度/存储器增量模式

//DMA_CHx:DMA通道CHx

//cpar:外设地址

//cmar:存储器地址

//cndtr:数据传输量 

void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)

{

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输

DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值,默认值

DMA1_MEM_LEN=cndtr;

DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设ADC基地址

DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向,从内存读取发送到外设

DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增数组缓存的地址

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //数据宽度为8位

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位

 

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式

DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级 

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输

 

DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器


//开启一次DMA传输

void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)

DMA_Cmd(DMA_CHx, DISABLE );  //关闭USART1 TX DMA1 所指示的通道 

 

DMA_SetCurrDataCounter(DMA1_Channel4,DMA1_MEM_LEN);//DMA通道的DMA缓存的大小

 

DMA_Cmd(DMA_CHx, ENABLE);  //使能USART1 TX DMA1 所指示的通道 

}   

#include "led.h"

#include "delay.h"

#include "sys.h"

#include "usart.h"

#include "lcd.h"

#include "key.h"

#include "dma.h"

 

const u8 TEXT_TO_SEND[]={"我要用dma做esp8266实验"};//发送的字符串,数据。

 

#define TEXT_LENTH  sizeof(TEXT_TO_SEND)-1//取值发送的文本的长度,TEXT_TO_SEND字符串长度(不包含结束符)

 

u8 SendBuff[(TEXT_LENTH+2)*100];//存储器地址及容量,定义为一个数组,TO BE USED FOR STRING  THAT IS TEXT_LENTH

 

int main(void)

u16 i;

u8 t=0; 

float pro=0; //进度 

delay_init();     //延时函数初始化   

uart_init(9600); //串口初始化为9600

LED_Init();   //初始化与LED连接的硬件接口

LCD_Init();     //初始化LCD 

KEY_Init(); //按键初始化

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

POINT_COLOR=RED;//设置字体为红色 

LCD_ShowString(60,50,200,16,16,"Mini STM32");

LCD_ShowString(60,70,200,16,16,"DMA TEST");

LCD_ShowString(60,90,200,16,16,"2018/6/22");

LCD_ShowString(60,110,200,16,16,"KEY0:Start");

//显示提示信息    

for(i=0;i<(TEXT_LENTH+2)*100;i++)//填充ASCII字符集数据,小于存储容量的范围内

{

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

{ SendBuff[i++]=0x0d; 

  SendBuff[i]=0x0a; 

  t=0;

}else SendBuff[i]=TEXT_TO_SEND[t++];//复制TEXT_TO_SEND语句 ,一位一位的发送文本里的数据,存储到内存的sendbuffer数组里   

}  

POINT_COLOR=BLUE;//设置字体为蓝色

 

i=0;

while(1)

{

////if the button is pressed,then wit excuate the usart_dma

t=KEY_Scan(0);

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

{

LCD_ShowString(60,150,200,16,16,"Start Transimit....");

LCD_ShowString(60,170,200,16,16,"   %");//显示百分号

printf("\r\nDMA DATA:\r\n ");

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //串口DMA发送使能

MYDMA_Enable(DMA1_Channel4);//使能一次DMA传输!    

//实际应用中,传输数据期间,可以执行另外的任务    //等待DMA传输完成,此时我们来做另外一些事,点灯

while(1)

{

if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)//等待通道4传输完成

{

DMA_ClearFlag(DMA1_FLAG_TC4);//清除通道4传输完成标志

break; 

}pro=DMA_GetCurrDataCounter(DMA1_Channel4);//得到当前DMA还剩余多少个数据。这个也可以作为传输完成的标志

pro=1-pro/((TEXT_LENTH+2)*100);//得到百分比,why it is TEST_LENTH+2,not theTEXT-LENTH ??  

pro*=100;      //扩大100倍

LCD_ShowNum(60,170,pro,3,16);   

}     

LCD_ShowNum(60,170,100,3,16);//显示100%   

LCD_ShowString(60,150,200,16,16,"Transimit Finished!");//提示传送完成

}

//if no press is buttoned,the led is lighted.

 

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

delay_ms(100);

if(i==20)

{

LED0=!LED0;//提示系统正在运行

i=0;

}    

}

}

关键字:STM32F103  DMA实验  内存  发送数据 引用地址:STM32F103之DMA实验,内存通过DMA向串口1发送数据

上一篇:STM32F103实现DMA接收串口不定长度数据
下一篇:stm32f103串口dma配置实例

推荐阅读最新更新时间:2024-03-16 16:22

STM32内存管理以及STM32中的堆栈
今天仔细读了一下内存管理的代码,然后还有看了堆栈的相关知识,把以前不太明白的一些东西想通了。 首先,先看一下stm32的存储器结构。 Flash,SRAM寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。 FLASH存储下载的程序。 SRAM是存储运行程序中的数据。 所以,只要你不外扩存储器,写完的程序中的所有东西也就会出现在这两个存储器中。 这是一个前提! 堆栈的认知 1.STM32中的堆栈。 2.编程中的堆栈。 在编程中很多时候会提到堆栈这个东西,准确的说这个就是RAM中的一个区域。我们先来了解几个说明: (1) 程序中的所有内容最终只会出现
[单片机]
STM32<font color='red'>内存</font>管理以及STM32中的堆栈
库存清理“大甩卖”,闪存价格暴跌另有“隐情”?
市场调研公司Gartner日前的报告指出,最近一段时间来,全球内存市场和闪存市场呈现出“悲喜两重天”的格局。内存价格持续上涨,闪存的价格则继续大幅下滑。 Gartner公司指出,在截至8月4日的一个星期内,NAND闪存的现货价格出现了过去两个月以来的最大跌幅。这个期间内,闪存价格平均下降了12美分。从降价幅度上看,512M和1G容量的价格分别下降了8.5%和12%. Gartner分析指出,如此大的价格跌幅源自厂商清理库存的行为,他们必须为新产品腾出市场空间。此外,闪存的需求在八月份有望进一步“明晰”。 与此同时,DRAM内存的价格则节节走高。在8月4日前的一周内,内存价格普遍上涨了1.9%,256M内存的价格大约在2.52
[焦点新闻]
三星因内存涨价被发改委约谈:或涉及行业垄断
  在持续收到手机厂商投诉之后,监管机构开始关注已经持续涨价6个季度、并且明年一季度仍会继续涨价的存储芯片。12月21日,多位知情人士告诉21世纪经济报道记者,“发改委已经就此问题约谈 三星 。”不过,目前并不确定是否会发起反垄断审查。下面就随手机便携小编一起来了解一下相关内容吧。    三星 是全球最大的存储芯片厂商,其DRAM产品市场占比约48%,NAND Flash产品市场占比约35.4%。DRAM、NAND Flash是存储芯片两大主力产品,前者主要用于 内存 ,后者用于存储数据的闪存。两类产品在手机、电脑、服务器市场广泛应用。根据分析机构中国闪存市场(CFM)提供数据,2017年,全球存储芯片市场规模950亿美元,其中
[手机便携]
用蘑菇替代 CPU 和内存,英国科学家成功研发蘑菇 PC 原型
3 月 8 日消息,根据国外科技媒体 Popular Science 报道,英国非常规计算实验室(UCL)成功打造了一款以蘑菇为材料的原型 PC。 报道中指出,这种真菌计算机主要使用菌丝体(真菌的分枝,呈现网状根结构),来替代充当计算机的导体和电子元件。该蘑菇计算机可以接收和发送电信号,并保留记忆。 传统计算机采用二进制,但在现实世界中大部分的动态并不是简单的 0 和 1 两种状态。这也是研究人员研究量子计算机和活脑细胞芯片的原因,通过利用一系列复杂的多维函数,从而更精确地计算某些问题。 蘑菇使用一种“互联网”通信与环境和周围的生物保持联系。您可能已经听说过这被称为 wood wide web 的信息。通过破译
[家用电子]
用蘑菇替代 CPU 和<font color='red'>内存</font>,英国科学家成功研发蘑菇 PC 原型
第012课 内存控制器与SDRAM
第001节辅线1硬件知识_内存接口概念 首先来分析下操作GPIO控制器和操作UART控制器两者的区别。 如图是S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚),有串口控制器 (接有TXD RXD引脚)。 配置GPIO控制器相应的寄存器,即可让引脚输出高低电平;配置UART控制器相应的寄存器,即可让引脚输出波形。前者相对简单,类似门电路,后者相对复杂,属于协议类接口。类似的协议类接口还有iic、iis、spi等。 对于CPU是不管什么接口的,它只写相应的寄存器,由控制器根据寄存器的配置去控制具体的引脚。 那么CPU是如何访问各个不同的寄存器的呢? CPU只管发出一个地址,内存控制器根据该地址选择不同
[单片机]
第012课 <font color='red'>内存</font>控制器与SDRAM
基于STM32F103和nRF24L01的近程无线数传系统设计
    近年来, 随着无线通信技术的发展, 无线通讯设备的集成化越来越高。本文介绍了一种选用高性能、低功耗的32位微处理器STM32F103和射频收发芯片nRF24L01来设计短距离无线数据传输系统的具体方法。     1 系统设计     短距离无线数传系统主要由电源管理器AMC7635、微控制器STM32F103、射频收发器nrf24l01三部分组成。下面分别介绍其关键电路。     1.1 电源电路     本设计的电源采用3.7V锂电池供电, 然后经低压降电源管理芯片AMC7635, 以产生3.0V的电压来为STM32F103和nRF24L01供电, 图1所示是本系统的供电电路。 图1 系统供电电路
[网络通信]
诺基亚X6价格曝光:骁龙636+4G内存
诺基亚首款异形全面屏X6将于5月16日发布,现在有关该机的详细信息已经揭晓。网上曝光了诺基亚X6的价格,如图所示,诺基亚X6 4GB+64GB版售价1499元。   外观方面,诺基亚X6采用了5.8英寸2280×1080刘海屏,屏幕纵横比为19:9,背部为玻璃材质,提供蓝色、黑色、银白色三种配色,机身三围尺寸为147.2×70.98×7.99mm,单手操作无压力。   配置方面,诺基亚X6搭载高通骁龙636八核处理器,这颗芯片基于14nm工艺制程打造,采用Kryo 260架构,CPU主频为1.8GHz,GPU为Adreno 509,最高配备6GB内存+64GB存储,电池容量为3060mAh,预装原生安卓系统。   拍照方面,诺基
[手机便携]
Cadence DDR5内存来了:7nm工艺、4400MHz频率!
DDR4内存目前还是绝对主流,不断被深入挖潜,频率已经突破5GHz,不过下一代DDR5也已经蠢蠢欲动了。Cadence公司今天就宣布了DDR5的全新进展,无论工艺还是频率都相当领先。 目前,JEDEC标准组织正在研究下一代DDR5内存规范,已经有了初步版本,Cadence此番拿出的就是面向新规范的第一个DDR5 IP物理层接口芯片。 该测试芯片采用台积电7nm工艺制造,数据率可达4400MT/s,也就是频率高达4400MHz,相比目前商用最快的DDR4-3200快了多达37.5%。 为了支持Cadence DDR5 PHY物理层的验证和协作,美光也向其提供了DDR5内存初步版本的工程原型。 在此之前,Rambus也曾经提到过7
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved