面向物联网的嵌入式系统开发 11-CC2530 DMA通信技术应用开发
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10:50 / 15
程序流程图
10:50 / 16
项目实现
dma传输函数程序如下:
void dma_test(void){ DMA_CFG dmaConfig; //定义配置结构体 //源字符串
char sourceString[]="{data=I'm the sourceString!}"; char i; char error=0; Uart_Send_String(sourceString); halWait(250); halWait(250); Uart_Send_String(destString);
char destString[sizeof(sourceString)]="{data=I'm the destString!}"; //目的字符串
//传输前的原字符数组
//传输前的目的字符数组
10:50 / 17
项目实现
dma传输函数程序如下:
//配置DMA结构体
dmaConfig.SRCADDRH=(unsigned char)((unsigned int)&sourceString >> 8); //源地址 dmaConfig.SRCADDRL=(unsigned char)((unsigned int)&sourceString); dmaConfig.DESTADDRH=(unsigned char)((unsigned int)&destString >> 8); //目的地址
10:50 / 13
任务目标
使用串口的DMA功能,通过DMA使
用串口向PC端串口工具打印信息,通 过这种程序设计实现数据的快速传输。
10:50两方面,一方面是配置串口驱动,另一方面配置DMA。
DMA的内部数据传输,将内部的A地址的数据通过DMA传递给B地址, 然后比较A地址和B地址的数据内容,如果A地址与B地址的数据内容相同 则串口向PC机打印数据正确信息,如果数据传输错误,这CC2530单片 机向PC机答应数据错误信息。
10:50 / 12
项目场景
工业不断发展,对工业设备的控制精度要求越来越高,精度的提高同时带来的
是数据量的变化,一个数据参数需要有多个参数来对其修正,因此工业设备与 控制台的数据流量也越来越大,为了提高数据传输效率,通常使用DMA来实现 数据传输,通过DMA实现的数据传输可以发挥通信总线的数据传输潜力提高硬 件资源的利用效率。工业控制总线如下图所示:
D M A 响 应
DMA 请求
字计数器
设备选择
+1
0 1 DMA请 求标志
数据缓冲寄存器
字传送结束信号
数据
设备
10:50 / 4
DMA基本原理
一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、
DMA结束4个步骤。
DMA请求 DMA响应
DMA传输 DMA结束
• CPU对DMA控制器初始化,并向I/O接口发出操
CC2530和STM32嵌入式接口技术开发
3.8 CC2530 DMA通信技术应用开发
目录
DMA简介
Contents
CC2530与DMA
CC2530DMA配置 项目场景说明 项目实践
Education Solutions
Internet+
DMA概念
直接存储器处理DMA是一种接口技术。它的主要功能是在没有CPU干预
10:50 / 20
//将结果通过串口传输到PC
//传输后的目的字符数组
项目思考
DMA在实际应用中有什么优势? CC2530在使用DMA时要配置哪些参数?
10:50 / 21
的情况下实现存储器与外围设备、存储器与存储器之间的数据交换,从 而可以使CPU从大量的数据交换、慢速的设备访问和分散数据收集中解 放出来,最终加快了存储器之间的大量数据的交换,同时,大大提高了 CPU的利用率。
10:50 / 3
DMA控制器结构
内 存
C P U
中断机构
内存地址计数器
+1
HLDA 控制/状态逻辑 HOLD
作命令,I/O接口提出DMA请求。 • DMA控制器对DMA请求判别优先级及屏蔽,向 总线裁决逻辑提出总线请求。 • DMA控制器获得总线控制权后,CPU即刻挂起或 只执行内部操作,由DMA控制器输出读写命令。 • 当完成规定的成批数据传送后,DMA控制器即释 放总线控制权,并向I/O接口发出结束信号。
10:50 / 9
DMA工作状态图
10:50 / 10
CC2530的DMA配置
使用DMA的基本流程是:配置DMA → 启用配置 → 启动DMA传输 →
等待DMA传输完毕。分析如下:
(1)配置DMA:首先必须配置DMA,但DMA的配置不是直接对某些
寄存器赋值,而是在外部定义一个结构体,对其赋值,然后再将此结构 体的首地址的高8位赋给 DMA0CFGH,将其低8位赋给 DMA0CFGL。
{
if(sourceString[i]!=destString[i]) error++; }
10:50 / 19
项目实现
dma传输函数程序如下:
if(error==0) { Uart_Send_String("{data=Correct!}"); halWait(250); halWait(250); Uart_Send_String(destString); } else Uart_Send_String("{data=Error!}"); halWait(250); halWait(250); } }
(2)启用配置:首先将结构体的首地址 &dmaConfig 的高/低8位分别
赋给SFR DMA0CFGH和 DMA0CFGL(其中的0表示对通道0配置, CC2530包含5个DMA通道,此处使用通道0)。然后对 DMAARM.0 赋 值1,启用通道0的配置,使通道0处于工作模式。
10:50 / 11
CC2530的DMA配置
使用DMA的基本流程是:配置DMA → 启用配置 → 启动DMA传输 →
等待DMA传输完毕。分析如下:
(3)开启DMA传输:对 DMAREQ.0 赋值1,启动通道0的DMA传输。 (4)等待DMA传输完毕:通道0的DMA传输完毕后,就会触发中断,
通道0的中断标志DMAIRQ.0 会被自动置1。然后对两个字符串的每一个 字符进行比较,将校验结果发送至PC。
10:50 / 5
DMA的传输方式
停止CPU访问内存
10:50 / 6
DMA的传输方式
周期挪用
10:50 / 7
DMA的传输方式
DMA与CPU交替访问内存
10:50 / 8
DMA 控制器的主要功能
5个独立的DMA通道 3个可以配置的DMA通道优先级 32个可以配置的传送触发事件 源地址和目标地址的独立控制 单独传送、数据块传送和重复传送模式 支持传输数据的长域域,设置可变传输长度 既可以工作在字模式,又可以工作在字节模式。
dmaConfig.DESTADDRL=(unsigned char)((unsigned int)&destString);
dmaConfig.VLEN=0x00; //选择LEN作为传送长度 dmaConfig.LENH=(unsigned char)((unsigned int)sizeof(sourceString) >> 8); //传输长度 dmaConfig.LENL=(unsigned char)((unsigned int)sizeof(sourceString)); dmaConfig.WORDSIZE=0x00; dmaConfig.TMODE=0x01; dmaConfig.TRIG=0; dmaConfig.SRCINC=0x01; dmaConfig.DESTINC=0x01; //选择字节(byte)传送 //选择块传送(block)模式 //无触发(可以理解为手动触发) //源地址增量为1 //目的地址增量为1
dmaConfig.IRQMASK=0;
dmaConfig.M8=0x00; dmaConfig.PRIORITY=0x02;
//DMA中断屏蔽
//选择8位长的字节来传送数据 //传输优先级为高
10:50 / 18
项目实现
dma传输函数程序如下:
/将配置结构体的首地址赋予相关SFR DMA0CFGH=(unsigned char)((unsigned int)&dmaConfig >> 8); DMA0CFGL=(unsigned char)((unsigned int)&dmaConfig); DMAARM=0x01; DMAIRQ=0x00; DMAREQ=0x01; while(!(DMAIRQ&0x01)); halWait(250); halWait(250); for(i=0;i<sizeof(sourceString);i++) //校验传输的正确性 //启用配置 //清中断标志 //启动DMA传输 //等待传输结束