感知层编程实验六

南昌航空大学实验报告

011117

 

课程名称:  感知层编程实验  实验名称:DMA编程

班级学号:      姓名:          同组人:                           

指导教师评定:                                      签名:              

实验 DMA编程

实验目的:

  1. 加深和巩固学生对于CC2530DMA组件的理解和掌握
  2. 让学生初步掌握CC2530DMA的使用,及其编程方法
  3. 高学生的上机和编程过程中处理具体问题的能力

实验要求:

  1. 实验要求自己独立的完成
  2. 编写和调试过程中出现的问题记录,并事后总结到报告中
  3. 实验程序调试完成后, 用给定的平台进行测试,由老师检查测试结果,并给予相应的成绩
  4. 实验完成后,要上交实验报告

实验内容:

  1. 调通书中DMA示例代码
  2. 使用串口的DMA功能,利用DMA实现2530PC之间的串口通信。(选做)
  3. 在实验报告中分别给出上述两个阶段的源码

实验环境:

集成开发环境为IAR

实验过程

这次主要考察的是DMA功能,DMA功能的使用大体都是相同的,主要还是了解DMA是如何实现,根据实验参考书上的指导,将他的LED亮灯改为CC2530PC之间的通信,在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!证明PCCC2530完成了通信。

 

实验总结

这次实验主要碰到的问题还是在DMA程序的理解上面,要想搞懂还得仔细去琢磨。

通过本次实验加深和巩固对于CC2530DMA组件的理解和掌握让我初步掌握CC2530DMA的使用,及其编程方法这次的实验难度不算很大,难就难在对DMA的理解,其他的照着实验指导书写的改就行,加上串口通信即可。

 

 

附录:

 

(1)DMA配置数据结构

 

 

(2)DMA寄存器

 

 

 

 

(3)示例代码(以Z-Stackflash写代码为例)

 

 


posted @ 2022-03-14 23:41  安良  阅读(897)  评论(0)    收藏  举报