感知层编程实验六
南昌航空大学实验报告
二0二1年11月17日
课程名称: 感知层编程实验 实验名称:DMA编程
班级学号: 姓名: 同组人: 无
指导教师评定: 签名:
实验六 DMA编程
实验目的:
- 加深和巩固学生对于CC2530中DMA组件的理解和掌握
- 让学生初步掌握CC2530中DMA的使用,及其编程方法
- 提高学生的上机和编程过程中处理具体问题的能力
实验要求:
- 实验要求自己独立的完成;
- 编写和调试过程中出现的问题要做好记录,并事后总结到报告中
- 实验程序调试完成后, 用给定的平台进行测试,由老师检查测试结果,并给予相应的成绩
- 实验完成后,要上交实验报告。
实验内容:
- 调通书中DMA示例代码;
- 使用串口的DMA功能,利用DMA实现2530与PC之间的串口通信。(选做)
- 在实验报告中分别给出上述两个阶段的源码。
实验环境:
集成开发环境为IAR
实验过程:
这次主要考察的是DMA功能,DMA功能的使用大体都是相同的,主要还是了解DMA是如何实现,根据实验参考书上的指导,将他的LED亮灯改为CC2530与PC之间的通信,在IAR上写好代码,连接板子烧录,在连通串口,打开串口调试助手,按下k1键,观察串口输出情况。
实验代码:
#include<ioCC2530.h>
#include<string.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
#define KEY1 P0_1
#pragma bitfields=reversed
typedef struct{
char SRCADDRH;
char SRCADDRL;
char DESTADDRH;
char DESTADDRL;
char VLEN :3;
char LENH :5;
char LENL :8;
char WORDSIZE :1;
char TMODE :2;
char TRIG :5;
char SRCINC :2;
char DESTINC :2;
char IRQMASK :1;
char M8 :1;
char PRIORITY :2;
} DMA_DESC;
void InitUART0(void){
CLKCONCMD &= ~0x40;
while(CLKCONSTA & 0x40);
CLKCONCMD &= ~0x47;
PERCFG =0x00;
P0SEL = 0x3C;
U0CSR |=0x80;
U0GCR |=11;
U0BAUD |=216;
UTX0IF =0;
}
void UartTX_Send_String(char *Data,int len){
int j;
for(j=0;j<len;j++){
U0DBUF = *Data++;
while(UTX0IF==0);
UTX0IF=0;
}
}
void main(void){
InitUART0();
DMA_DESC dmaChannel;
char sourceString[]="This is a test string used to demonstrate DMA transfer.";
char destString[sizeof(sourceString)];
char i;
char errors=0;
CLKCONCMD &= ~0x40;
while(CLKCONSTA & 0x40);
CLKCONCMD &= ~0x47;
P0DIR &= ~0x01;
memset(destString,0,sizeof(destString));
//SET_WORD(dmaChannel.SRCADDRH,dmaChannel.SRCADDRL,&sourceStrig);
dmaChannel.SRCADDRH=(char)((uint)&sourceString>>8);
dmaChannel.SRCADDRL=(char)((uint)&sourceString&0x00ff);
dmaChannel.DESTADDRH=(char)((uint)&destString>>8);
dmaChannel.DESTADDRL=(char)((uint)&destString);
dmaChannel.LENH=(char)((uint)sizeof(sourceString)>>8);
dmaChannel.LENL=(char)((uint)sizeof(sourceString));
dmaChannel.VLEN=0;
dmaChannel.PRIORITY=0x02;
dmaChannel.M8=0;
dmaChannel.IRQMASK=0;
dmaChannel.DESTINC=0x01;
dmaChannel.SRCINC=0x01;
dmaChannel.TRIG=0;
dmaChannel.TMODE=0x01;
dmaChannel.WORDSIZE=0x00;
DMA0CFGH=(char)((uint)(&dmaChannel)>>8);
DMA0CFGL=(char)((uint)(&dmaChannel));
DMAARM=0x81;
DMAARM=0x01;
while(KEY1);
DMAIRQ=0x00;
DMAREQ=0x01;
while(!(DMAIRQ & 0x01));
for(i=0;i<sizeof(sourceString);i++){
if(sourceString[i]!=destString[i])
errors++;
}
if(errors==0){
UartTX_Send_String("Success!",sizeof("Success!"));
}else{
UartTX_Send_String("Error!",sizeof("Error"));
}
}
实验结果:
按下按键key1,在串口调试助手上可以看到串口输出Success!证明PC与CC2530完成了通信。
实验总结:
这次实验主要碰到的问题还是在DMA程序的理解上面,要想搞懂还得仔细去琢磨。
通过本次实验加深和巩固对于CC2530中DMA组件的理解和掌握,让我初步掌握CC2530中DMA的使用,及其编程方法,这次的实验难度不算很大,难就难在对DMA的理解,其他的照着实验指导书写的改就行,加上串口通信即可。
附录:
(1)DMA配置数据结构
(2)DMA寄存器
(3)示例代码(以Z-Stack中flash写代码为例)
日

浙公网安备 33010602011771号