ZigBee-CC2530单片机 - DMA方式复制数据

发布者:行者无疆1978最新更新时间:2022-10-09 来源: csdn关键字:ZigBee  CC2530  单片机  DMA方式 手机看文章 扫描二维码
随时随地手机看文章

程序源码

#include "ioCC2530.h"

#include "stdio.h"


#define LED1 P1_0     // P1_0定义为P1_0

#define LED2 P1_1     // P1_0定义为P1_1

#define SW1  P1_2     //SW1端口宏定义


enum SYSCLK_SRC

{

    RC_16MHz,XOSC_32MHz

};


/**************************************************************/

#pragma bitfields = reversed     //使用大端格式

typedef struct 

{

  unsigned char SRCADDRH;          // 源地址高字节

  unsigned char SRCADDRL;          // 源地址低字节

  unsigned char DESTADDRH;         // 目标地址高字节

  unsigned char DESTADDRL;         // 目标地址低字节

  unsigned char VLEN      : 3;     // 可变长度传输模式选择

  unsigned char LENH      : 5;     // 传输长度高字节

  unsigned char LENL      : 8;     // 传输长度低字节

  unsigned char WORDSIZE  : 1;     // 字节/字传输

  unsigned char TMODE     : 2;     // 传输模式选择

  unsigned char TRIG      : 5;     // 触发事件选择

  unsigned char SRCINC    : 2;     // 源地址增量

  unsigned char DESTINC   : 2;     // 目标地址增量

  unsigned char IRQMASK   : 1;     // 中断使能

  unsigned char M8        : 1;     // 7/8 bits 字节(只用于字节传输模式)

  unsigned char PRIORITY  : 2;     // 优先级

} DMA_CONFIGURATIONPARAMETERS;


#pragma bitfields = default    //恢复成小端格式


/**************************************************************

函数名称:delay

功    能:软件延时

入口参数:time--延时循环执行次数

出口参数:无

返 回 值:无

**************************************************************/

void delay(unsigned int time)

{

    unsigned int i;

    unsigned char j;

    for(i = 0;i < time;i++)

        for(j = 0;j < 240;j++)

        {

            asm("NOP");//asm用来在C代码中嵌入汇编语言操作,汇

            asm("NOP");//编命令nop是空操作,消耗1个指令周期

            asm("NOP");

        }

}


/**************************************************************

函数名称:SystemClockSourceSelect

功能:选择系统时钟源(主时钟源)

入口参数:source

          XOSC_32MHz  32MHz晶体振荡器

          RC_16MHz    16MHz RC振荡器

出口参数:无

返回值:无

**************************************************************/

void SystemClockSourceSelect(enum SYSCLK_SRC source)

{

   unsigned char clkconcmd,clkconsta;

   if(source == RC_16MHz)

  {             

    CLKCONCMD &= 0x80;

    CLKCONCMD |= 0x49;       

  }

  else if(source == XOSC_32MHz)

  {

    CLKCONCMD &= 0x80;

  }  

    /* 等待所选择的系统时钟源(主时钟源)稳定 */

  clkconcmd = CLKCONCMD;           // 读取时钟控制寄存器CLKCONCMD

  do

  {

    clkconsta = CLKCONSTA;         // 读取时钟状态寄存器CLKCONSTA

  } while(clkconsta != clkconcmd); // 直到选择的系统时钟源(主时钟源)已经稳定 

}


/**************************************************************

函数名称:init

功能:初始化系统IO

入口参数:无

出口参数:无

返回值:无

**************************************************************/

void initIO(void)

{   P1SEL &= ~0x05;     // 设置LED1、SW1为普通IO口

    P1DIR |= 0x01 ;     // 设置LED1在P1.0为输出    

    P1DIR &= ~0X04; //sw1按键在 P1.2,设定为输入    

    LED1= 0;            // LED灭

}


/**************************************************************

函数名称:InitUART0

功能:UART0初始化

      P0.2  RX      

      P0.3  TX

      波特率:57600

      数据位:8

      停止位:1

      奇偶校验:无

入口参数:无

出口参数:无

返回值:无

**************************************************************/

void initUART0(void)

{

    PERCFG = 0x00; //位置 1 P0 口     

    P0SEL = 0x3c; //P0 用作串口, P0.2、P0.3、P0.4、P0.5作为片内外设I/O  

    /* UART0波特率设置,波特率:57600 */

    U0BAUD = 216;

    U0GCR = 10;

    /* USART模式选择 */

    U0CSR |= 0x80;     // UART模式

    U0UCR |= 0x80;     // 进行USART清除

    UTX0IF = 0;        // 清零UART0 TX中断标志

    EA = 1;            //使能全局中断

}


/**************************************************************

函数名称:UART0SendByte

功能:UART0发送一个字节

入口参数:无

出口参数:无

返回值:无

**************************************************************/

void UART0SendByte(unsigned char c)

{

    U0DBUF = c;       // 将要发送的1字节数据写入U0DBUF(串口 0 收发缓冲器)  

    while (!UTX0IF);  // 等待TX中断标志,即U0DBUF就绪

    UTX0IF = 0;       // 清零TX中断标志 

}


/**************************************************************

函数名称:UART0SendString

功能:UART0发送一个字符串

入口参数:无

出口参数:无

返回值:无

**************************************************************/

void UART0SendString(unsigned char *str)

{

    while(1)

    {

        if(*str == '') break;  // 遇到结束符,退出

        UART0SendByte(*str++);   // 发送一字节

    } 

}


/**************************************************************

函数名称:main

功能:程序主函数

入口参数:无

出口参数:无

返回值:无

**************************************************************/

void main(void)

{

    SystemClockSourceSelect(XOSC_32MHz);

    initIO();  // IO端口初始化

    initUART0();  //初始化端口 

    /* 定义DMA源地址空间并初始化为将被DMA传输的字符串数据 */

    unsigned char srcStr[]="块传送数据:DMA transfer.";  

    /* 定义DMA目标地址空间 */

    unsigned char destStr[sizeof(srcStr)];

    

    /* 定义DMA配置数据结构体变量 */

    DMA_CONFIGURATIONPARAMETERS dmaCH;

    

    /* 设置DMA配置参数 */

    /* 源地址 */

    dmaCH.SRCADDRH = (unsigned char)(((unsigned short)(&srcStr)) >> 8);

    dmaCH.SRCADDRL = (unsigned char)(((unsigned short)(&srcStr)) & 0x00FF);

    /* 目标地址 */

    dmaCH.DESTADDRH = (unsigned char)(((unsigned short)(&destStr)) >> 8);

    dmaCH.DESTADDRL = (unsigned char)(((unsigned short)(&destStr)) & 0x00FF);  

    /* 可变长度模式选择 */

    dmaCH.VLEN = 0x00;      // 使用DMA传输长度

    /* 传输长度 */

    dmaCH.LENH = (unsigned char)(((unsigned short)(sizeof(srcStr))) >> 8);

    dmaCH.LENL = (unsigned char)(((unsigned short)(sizeof(srcStr))) & 0x00FF);  

    /* 字节/字模式选择 */

    dmaCH.WORDSIZE = 0x00;  // 字节传输

    /* 传输模式选择 */

    dmaCH.TMODE = 0x01;     // 块传输模式  

    /* 触发源选择 */

    dmaCH.TRIG = 0x00;      // 通过写DMAREQ来触发

    /* 源地址增量 */

    dmaCH.SRCINC = 0x01;    // 每次传输完成后源地址加1字节/字 

    /* 目标地址增量 */

    dmaCH.DESTINC = 0x01;   // 每次传输完成后目标地址加1字节/字  

    /* 中断使能 */

    dmaCH.IRQMASK = 0x00;   // 禁止DMA产生中断

    /* M8 */

    dmaCH.M8 = 0x00;        // 1个字节为8比特  

    /* 优先级设置 */

    dmaCH.PRIORITY = 0x02;  // 高级

    

    /* 使用DMA通道0 */

    DMA0CFGH = (unsigned char)(((unsigned short)(&dmaCH)) >> 8);

    DMA0CFGL = (unsigned char)(((unsigned short)(&dmaCH)) & 0x00FF); 

   while(1)

  {

    /***************给srcStr赋值**************/

    sprintf(srcStr,"块传送数据:DMA transfer.");  

    

    /* 在PC串口助手上显示DMA传输的源地址和目标地址 */

    unsigned char s[31];

    sprintf(s,"数据源地址: 0x%04X, ",(unsigned short)(&srcStr));  //格式化字符串   

    UART0SendString(s);   

   

    sprintf(s,"目标地址: 0x%04X;",(unsigned short)(&destStr));

    UART0SendString(s);

    memset(destStr, 0, sizeof(destStr));  // 清除DMA目标地址空间的内容

   

    UART0SendString("按SW1开始DMA传送...rnrn");  // 从UART0发送字符串

    

    /* 清除DMA中断标志 */

    DMAIRQ = 0x00;    

    

    /* 使DMA通道0进入工作状态 */

    DMAARM |= 0x01;  

    

    LED1=0;

    

    /* 等待用户按下任意键(除复位键外)*/

    while(SW1 == 1);

    

    if(SW1 == 0) //低电平有效

        {     while(SW1 == 0); //等待用户松开按键              

               /* 触发DMA传输 */

               DMAREQ |= 0x01;

               LED1=1;

  

               /* 等待DMA传输完成 */

               while((DMAIRQ & 0x01) == 0);

  

              /* 验证DMA传输数据的正确性 */

              unsigned char i,errors = 0;

              for(i=0;i                {

                    if(srcStr[i] != destStr[i]) errors++;     

                }

[1] [2]
关键字:ZigBee  CC2530  单片机  DMA方式 引用地址:ZigBee-CC2530单片机 - DMA方式复制数据

上一篇:ZigBee-CC2530单片机 - 低功耗运行
下一篇:ZigBee-CC2530单片机 - 按键控制LED

推荐阅读最新更新时间:2024-11-20 16:58

资深工程师:选择汽车MCU的十大考虑因素
微控制器( MCU )在从电机控制,到信息娱乐系统和车身控制等越来越宽泛的汽车应用中提供至关重要的性能。随着价格的下降和整固的增加,微控制器正变得越来越普及,这意味着MCU被越来越多地视为商品。尽管存在这种商品化趋势,汽车系统设计工程师仍然认为不同的控制器会有很大的差异,包括各种级别的集成度和功率要求。选择MCU通常可以缩减材料成本(BOM),从而有效地降低电子控制单元(ECU)本身的价格。   选择汽车MCU时,设计工程师可以考虑以下10个重要因素,实现成本压力与应用所需的特定性能特色之间的平衡。   1.低压检测   MCU工作时的故障风险之一是在临界点时电源电压或MCU内部电压可能降至所需电平以下。显然,如果工作电压无法保证
[嵌入式]
玩转单片机之二--USB转串口
什么是USB口? 一般电脑都有,也是主流的接口。它有4线,2根电源线,2根数据线。传输速度480MB/s 什么是串口(COM)? 它是9针的,编号1~9,我们常用2,3,5脚,主要用于PC与单片机的通信,台式机上一般有2个串口,在机箱后面。一般的笔记本没有串口,这样给开发带来了不便。 所有我们需要USB转串口,使笔记本具有程序烧录,及通信功能。 --------------------------详细步骤-------------------------------------------- 步骤1,需要USB2COM转接头,这里感谢小白帅哥给予的硬件支持。 步骤2,安装驱动程序。 步骤
[单片机]
玩转<font color='red'>单片机</font>之二--USB转串口
8051单片机的指令系统有什么特点?
8051的指令系统由111条指令组成。如果按字节数分类,有49条单字节指令46条双字节指令和16条三字节指令,以单字节指令为主;如果按照指令执行时间分类,有64条单周期指令、45条双周期指令和2条四周期指令,以单周期指令为主。 8051的指令系统具有以下特点: (1)存储效率高、执行速度快,可以进行直接地址到直接地址的数据传送,能把一个并行I/O口中的内容传送到内部RAM单元中而不必经过累加器A或工作寄存器Rn。这样可以大大提高传送速度和缓解累加器A的瓶颈效应。 (2)用变址寻址方式访问程序存储器中的表格,将程序存储器单元中的固定常数或表格字节内容传送到累加器A中。这为编成翻译算法提供了方便。 (3)在算术运算指令中设有乘法和除法
[单片机]
PIC单片机的IO控制
I/O控制对于单片机而言是最基础最核心的东西,其实单片机除了AD DA 转换之外的事情。其他大部分的事情I/O口都能做的到。I/O控制简单却能千变万化。 单片机在大部分应用中做的事情,莫过于 输入高低电平 ,输出高低电平。就是通过这简单的控制电平来实现大多数的应用控制。 什么是I/O口? 什么是I/O 就是 IN/OUT 就是 输入/输出。 I/O具体能做什么呢? 如果你是刚刚步入电子的新手,那你最好要知道一下I/O口具体能做什么。感性的认识对你的学习是很有帮助的。I/O口输出一个高(低)电平可以用来点亮一个LED灯,可以接通过一个继电器,来开启电机,来开启音响。开启许多的东西,也可以用于通信等等。输入一个高(低)电
[单片机]
PIC<font color='red'>单片机</font>的IO控制
液晶显示模块与8031单片机的接口电路及编程
  液晶显示器(LCD)具有功耗低、体积小、重量轻、超薄等许多其他显示器无法比拟的优点,近年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。LCD可分为段式LCD、字符式LCD和点阵式LCD。其中,段式LCD和字符式LCD只能用于字符和数字的简单显示,不能满足图形曲线和汉字显示的要求;而点阵式LCD不仅可以显示字符、数字,还可以显示各种图形、曲线以及汉字、动画,并且可以实现屏幕滚动、反转、闪烁等功能,用途十分广泛。本文主要阐述点阵式液晶显示模块QPYD-03与单片机8031的接口及编程方法。   QPYD-03液晶显示控制器是北京精电蓬远显示技术有限公司开发的液晶显示控制IC。其特点为:   控制彩色320*3*24
[嵌入式]
ARM宣布ARM MCU认证工程师计划
ARM正式推出全新的ARM MCU 认证工程师(ARM Accredited MCU Engineer, AAME)计划。该计划为现有的ARM认证工程师(ARM Accredited Engineer, AAE)计划中的一部分,专门针对ARMv6-M及 ARMv7-M (Cortex®-M)架构的软件技术能力进行认证,主要面向熟悉ARM Cortex-M系列嵌入式微控制器(MCU)并试图展现其ARM MCU技术知识的软件工程师。 在物联网(Internet of Things, IoT)快速发展的今天,凭借对性能、成本、功耗、尺寸以及易用性等方面的完美结合,基于Cortex-M架构的各类设备应用层面正日益广泛,从而推动了产业对高水平
[单片机]
密码访问器件X76F100在单片机系统中的应用
X76F100是一种密码访问安全监控器件,内部含有1个112 8位的保密数据阵列,对该阵列的访问由2个64位的读写密码来控制,密码与数据通过I2C总线接口完成输入输出。正常情况下,X76F1000提供最少为10万次的擦写期限和最少100年的数据保存使用。 1 器件的特点 *可编程64位读写密码保护; *重试计数寄存器允许8次密码试验,然后阵列清零; *32位对复位的响应(RST输入); *8字节页写方式; *最大1 MHz时钟速率; *I2C总线接口; *宽电压(3.0~5.5V)低功耗CMOS; *10万次擦写和100年数据保存; *多种(8脚PDIP、SOIC、MSOP、智能卡)外形封装。 2 封装与引脚说明
[单片机]
密码访问器件X76F100在<font color='red'>单片机</font>系统中的应用
PIC单片机与PC机实现串行通信的设计
1.实例目的: 本实例完全建立在计算机软件的基础上,利用PROTEUS软件构建一个单片机系统,利用VB编写一个计算机控制软件和单片机系统串行通信,计算机上的控制软件可以发送一个值在0——999之间的数,在单片机系统上显示出来,单片机系统上也可输入一个相同值域的数并在计算机控制软件上显示出来。本实例主要是为了展示虚拟串行通信的仿真。 2.系统配置 本实例虽然简单,但是要想看到想要的仿真结果,建立虚拟的串口连接是必不可少的。要想仿真串行通信,必须要把单片机系统上的串行口与计算机上的串行口连接,这样他们之间才能传输数据,但由于是仿真,实际没有相连接,所以需要创建一对虚拟串行口并使他们相连,这里我使用的是这个软件Virtual Ser
[单片机]
PIC<font color='red'>单片机</font>与PC机实现串行通信的设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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