#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);
}