无线传感网络实验三-利用定时器、DMA、看门狗、UART在CC2530上实现简单的功能

#include <ioCC2530.h>
#include <string.h>

#define D4 P1_0
#define D2 P1_1
#define D3 P1_2
#define uint unsigned int
#define uchar unsigned char
#define CLKSPD ( CLKCONCMD & 0x07 ) //getting the clock division factor

void watchdog_init(void);
void FeetDog(void);
void xtal_init(void);
void led_init(void);
void time1_init(void);
void uart0_init(unsigned char StopBits,unsigned char Parity);
void watchdog_init(void);
void sleepTimer_init(void);
void halWait(unsigned char wait);
void desplay(int num);
void uart_test(void);

char recvBuf[255]; //开辟256Byte容量的接收缓冲区
int recvCnt = 0; //接收数据量统计
uchar Recv_Dat=0;

uint counter=0; //统计溢出次数

/系统时钟初始化
-------------------------------------------------------
/
void xtal_init(void)
{
SLEEPCMD &= ~0x04; //都上电
while(!(CLKCONSTA & 0x40)); //晶体振荡器开启且稳定
CLKCONCMD &= ~0x47; //选择32MHz晶体振荡器
SLEEPCMD |= 0x04;
}

/led初始化
-------------------------------------------------------
/
void led_init(void)
{
P1SEL &= ~0x07; //P1.0 P1.1 P1.2为普通 I/O 口
P1DIR |= 0x07; //输出

D4=D2=D3=1;
}

/外部中断初始化
-------------------------------------------------------
/
void ext_init(void)
{
P0SEL &= ~0x10; //通用IO
P0DIR &= ~0x10; //作输入
P0INP &= ~0x10; //0:上拉、1:下拉
P0IEN |= 0x10; //开P0口中断
PICTL &=~ 0x01; //下降沿触发
P0IFG &= ~0x10; //P0.4中断标志清0
P0IE = 1; //P0中断使能
EA = 1; //总中断使能
}

/timer1初始化
-------------------------------------------------------
/
/*
定时溢出时间计算(定时时间为0.5s):

系统在不配置其工作频率时默认为 2分频,即 32M/2=16M

故:N(总溢出次数)=0.5s/(8/16000000)=1000,000

T1当前量程(0~65535)(合65536)

中断次数:1000000/65536=15(取整)

即:中断中的counter为15时,可得到约0.5s的时间

公式总结:counter=(t/(8/16000000))/65536

其中:t为定时时间,counter为T1中断里的计数值
*/
void time1_init(void)
{
T1CTL = 0x05; //8分频,自由模式
T1STAT= 0x21; //通道0,中断有效;自动重装模式(0x0000->0xffff)
//通道 0,中断有效(裸机状态下,该句可注掉)

IEN1|=0X02; //定时器1中断使能
EA=1; //开总中断
}

/uart0初始化
-------------------------------------------------------
/
void uart0_init(unsigned char StopBits,unsigned char Parity)
{
P0SEL |= 0x0C; //初始化UART0端口
//选择UART0为可选位置一, 清零来设置 IO 功能为 UART0,即 RXD对应 P0.2,TXD 对应 P0.3
PERCFG&= ~0x01;
//P0优先作为串口0,使用的串口为 Uart0,对应的 I/O 引脚 P0_2 与P0_3
P2DIR &= ~0xC0;

U0CSR = 0xC0; //设置为UART模式,而且使能接受器

U0GCR = 0x09;
U0BAUD = 0x3b; //设置UART0波特率为19200bps

U0UCR |= StopBits|Parity; //设置停止位为1与无奇偶校验
}

/看门狗初始化
-------------------------------------------------------
/
void watchdog_init(void)
{
WDCTL = 0x00; //看门狗模式,时间间隔一秒
WDCTL |= 0x08; //启动看门狗
}

/睡眠定时器中断初始化
-------------------------------------------------------
/
void sleepTimer_init(void)
{
STIF=0; //睡眠定时器中断标志清0
STIE=1; //开睡眠定时器中断
EA=1; //开总中断
}

/串口发送字节函数-------------------------------------------------------/
void Uart_Send_char(char ch)
{
U0DBUF = ch;
while(UTX0IF == 0);
UTX0IF = 0;
}

/串口发送字符串函数-------------------------------------------------------/
void Uart_Send_String(char *Data)
{
while (*Data != ‘\0’)
{
Uart_Send_char(*Data++);
}
}

/串口接收字节函数-------------------------------------------------------/
int Uart_Recv_char(void)
{
int ch;
while (URX0IF == 0);
ch = U0DBUF;
URX0IF = 0;
return ch;
}
/ms延时函数
-------------------------------------------------------
/
void halWait(unsigned char wait)
{
unsigned long largeWait;

if(wait == 0)
{return;}
largeWait = ((unsigned short) (wait << 7));
largeWait += 114*wait;

largeWait = (largeWait >> CLKSPD);
while(largeWait–);

return;
}
/喂狗-------------------------------------------------------/
void FeetDog(void)
{
WDCTL = 0xa0;
WDCTL = 0x50;
}

/用于配置DMA的结构体-------------------------------------------------------/

//启用位域模式
#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;

unsigned char PRIORITY :2;
}DMA_CFG;
#pragma bitfields=default

void dma_test(void);

/主函数-------------------------------------------------------/
void main(void)
{
led_init(); //LED初始化
time1_init();
uart0_init(0x00, 0x00); //初始化串口:无奇偶校验,停止位为1位
while(1);

}
/中断服务子程序-------------------------------------------------------/
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{
EA=0; //关总中断
counter++;
if(counter>150) //0.5s时间
{
counter=0;
dma_test();
D4 = !D4;
D2 = !D2;
D3 = !D3;
}
if(counter>1500){
FeetDog();
}
T1IF=0; //清中断标志
EA=1; //开总中断
}
/dma传输函数-------------------------------------------------------/
void dma_test(void)
{
DMA_CFG dmaConfig; //定义配置结构体

char sourceString[]=“我是源字符串我是源字符串我是源字符串我是源字串我是源字符串我是源字符串我是源字符串我是源字符串我是源字符串我是源字符串我是源字符串我是源字符串我是源字符串我是源字符串我是源字符串!\r\n\r\n”; //源字符串

char destString[sizeof(sourceString)]=“我是目的字符串!\r\n”; //目的字符串

char i;
char error=0;

//传输前
Uart_Send_String(sourceString); //传输前的原字符数组
Uart_Send_String(destString); //传输前的目的字符数组

Uart_Send_String(“\r\n”);

//配置DMA结构体

//确立传输对象(从哪传到哪)
dmaConfig.SRCADDRH=(unsigned char)((unsigned int)&sourceString >> 8); //源地址(源数组地址)
dmaConfig.SRCADDRL=(unsigned char)((unsigned int)&sourceString);

dmaConfig.DESTADDRH=(unsigned char)((unsigned int)&destString >> 8); //目的地址(目的数组地址)
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; //字节方式(byte)传送

dmaConfig.TMODE=0x01; //选择块传送(block)模式(有单独传送,块传送和重复传送)

dmaConfig.TRIG=0; //无触发(可以理解为手动触发)

dmaConfig.SRCINC=0x01; //源地址增量为1

dmaConfig.DESTINC=0x01; //目的地址增量为1

dmaConfig.IRQMASK=0; //DMA中断屏蔽

dmaConfig.M8=0x00; //选择8位长的字节来传送数据

dmaConfig.PRIORITY=0x02; //传输优先级为高

//正式写入DMA配置
DMA0CFGH=(unsigned char)((unsigned int)&dmaConfig >> 8); //将配置结构体的首地址赋予相关SFR
DMA0CFGL=(unsigned char)((unsigned int)&dmaConfig);

DMAARM=0x01; //启用配置
DMAIRQ=0x00; //清中断标志

Uart_Send_String(“开始传输”);
Uart_Send_String(“\r\n”);

DMAREQ=0x01; //启动DMA传输
while(!(DMAIRQ&0x01)); //等待传输结束

Uart_Send_String(“传输完成开始校验”);
Uart_Send_String(“\r\n”);
Uart_Send_String(“\r\n”);

//传输结束后
for(i=0;i<sizeof(sourceString);i++) //校验传输的正确性
{
if(sourceString[i]!=destString[i])
error++;
}

if(error==0) //将结果通过串口传输到PC
{
Uart_Send_String(“Correct校验成功,输出传输后的字符串”);
Uart_Send_String(“\r\n”);
Uart_Send_String(destString); //传输成功后的目的字符数组
Uart_Send_String(“\r\n”);
Uart_Send_String(“\r\n”);
Uart_Send_String(“\r\n”);
Uart_Send_String(“\r\n”);
}
else
Uart_Send_String(“Error!”);

halWait(250);
halWait(250);
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CC2530是一款低功耗的无线通信芯片,UART0是其内置的串口模块,DMA是直接存取存储器(Direct Memory Access)技术。DMA技术可以实现两个外设之间的数据输,无需CPU参与,提高了数据输的效率。 CC2530的UART0模块支持DMA功能,可以通过配置相关寄存器和DMA通道,实现串口数据的直接输,减少CPU的占用率。在使用UART0进行数据输时,可以通过DMA控制器直接访问内存,将数据从内存送到UART0的发送缓冲区,或者将接收到的数据直接存储到内存中,而无需CPU的干预。 使用UART0 DMA的好处是可以大大提高数据输的效率和性能。对于大量的数据输或者对实时性要求较高的应用场景,使用DMA可以避免CPU在数据输中的繁琐操作,提高系统的并发处理能力。特别是在无线通信领域,提高数据输效率对于保证通信的稳定和快速非常重要。 在使用CC2530的UART0 DMA功能时,需要合理配置DMA通道和相关寄存器,还需要注意数据的输方向、数据长度、输触发条件等参数的设置。同时,为了保证数据的正确输,需要合理设计中断机制或者其他同步控制方式,以确保数据在输过程中的正确性和完整性。 总之,CC2530的UART0 DMA功能是一项重要的技术,可以提高数据输的效率和性能,适用于需要高效、快速数据输的应用场景,特别是在无线通信领域具有广泛的应用前景。通过合理的配置和使用,可以发挥出DMA技术的最佳性能,提升整个系统的稳定性和可靠性。 ### 回答2: CC2530是一款低功耗的无线通信芯片,具有UART0和DMA功能UART0是一种通用异步收发输接口,可用于与其他设备进行数据交换。它支持全双工输,可以通过串口将数据发送给其他设备,也可以从其他设备接收数据。 DMA是直接内存访问技术,它可以在芯片内部的存储器和外部设备之间直接进行数据输,而无需CPU的干预。通过使用DMA,可以实现高速的数据输和处理。 在CC2530芯片中,UART0和DMA可以结合使用来进行高效的数据输。通过配置DMA通道,可以实现UART0的数据发送和接收的自动化操作。例如,可以使用DMA通道将待发送的数据直接从内存中输到UART0的发送缓冲区,而无需CPU的干预。同样地,可以使用DMA通道将接收到的数据直接存储到内存中,以便后续的处理。 通过利用UART0和DMA的结合使用,可以提高数据输的效率和性能。这对于实现无线通信应用非常重要,因为它可以减轻CPU的负担,提高系统的响应速度和稳定性。 总而言之,CC2530的UART0和DMA功能可以配合使用,实现高效的无线数据输。这对于需要大量数据输或对输速度有要求的应用非常有益。 ### 回答3: CC2530是一款深受欢迎的无线微控制器,具有强大的通信功能。其中UART0是CC2530上的一个串口模块,而DMA是直接内存访问(Direct Memory Access)的缩写。 UART0是CC2530提供的一个通信接口,用于实现串口通信。它可以与外部设备进行数据的发送和接收。UART0具有可编程的波特率发生器,可以根据需要设置不同的通信速率。在使用UART0时,我们需要设置相关的寄存器,以配置波特率、数据位数、停止位数、奇偶校验位等参数。通过设置好这些参数,我们可以使用UART0进行数据的发送和接收,实现与其他设备的通信。 而DMA是一种数据输方式,它可以提高数据输的效率。在统的数据输方式中,数据需要经过CPU的中转,由CPU进行数据的读取和写入。而在DMA模式下,数据的输过程不需要CPU的干预,DMA可以直接从内存读取数据并输到目的地,或者直接将外设的数据写入到内存中。这样可以极大地节省了CPU的时间和资源,提高了数据输的速率。 CC2530支持DMA输方式,可以通过配置DMA模块,将UART0的数据输交给DMA来完成。在使用DMAUART0的数据时,我们需要配置相关的寄存器,指定输的起始地址和输的字节数等参数。通过将UART0的数据输交给DMA来处理,可以降低CPU的负担,提高数据输的效率。同时,由于DMA输过程不需要CPU的干预,可以减少数据输的中断次数,进一步提高系统的性能。 综上所述,CC2530 UART0 DMA用于实现串口通信,并通过DMA输方式来提高数据输的效率,减轻CPU的负担,提高系统性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值