高级会员
- 积分
- 929
- 威望
- 505
- 贡献
- 254
- 兑换币
- 245
- 注册时间
- 2012-9-18
- 在线时间
- 85 小时
|
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define uint unsigned int
#define uchar unsigned char
/*void delay(uint time) //延时函数
{
uint i,j,k;
for(i=0; i<125; i++)
{
for(j=0; j<125; j++)
{
for(k=time; k>0; k--);
}
}
} */
void clock_init(void) //超频64Mhz
{ /*Fvco=2*fosc*(syrn+1)/(refdv+1)*/
/*Fpll=fvoc/(2*postdiv),通常设postdiv为0*/
/*Fbus=fpll/2总线时钟为锁相环时钟源的一半*/
DisableInterrupts; //关总中断
CLKSEL=0x00; //CLKSEL_PLLSEL置0,选择系统时钟源为外部晶振OSCCLK
PLLCTL=0x80; //PLLCTL_PLLON置0,关闭PLL时钟源
SYNR = 0xc7;
REFDV = 0x81; //根据所需时钟频率设置SYNP和REFDV寄存器
POSTDIV=0x00; //可以不管,默认为0
PLLCTL=0xc0; //打开PLLON?开PLL时钟源
while(!(CRGFLG & 0x08)); //判断PLL时钟源是否稳定,CRGFLG_LOCK=1时稳定
CLKSEL_PLLSEL=1; //选择PLL时钟源作为系统时钟源
EnableInterrupts;
}
void sci_init() //串口初始化
{
SCI0BDH=0x01;
SCI0BDL=0xa1; //设置波特率为9600,SCI0BD=fbus/16/9600=417,总线位64MHZ
SCI0CR1=0x00; //设置工作方式为8位数据模式,无奇偶校验位
SCI0CR2=0x2c; //允许sci发送数据与接受收据,允许接收中断,收据有效,可以读取数据
}
uchar sci_receive(void) //读数据
{
if(SCI0SR1_RDRF==1)
{
SCI0SR1_RDRF=1; //rdrf=1时,开始顺序读取scisr1和scidr,并自动清除rdrf
return SCI0DRL;
}
return 0;
}
void sci_transmit(uchar sendchar) //向发送保持器中写入数据
{
while(!(0x80 & SCI0SR1)); //若TDRE=0,则一直执行
SCI0DRH=0; //先写发送数据寄存器高位
SCI0DRL=sendchar; //将低位赋予写入的字符
}
void main(void)
{
/* put your own code here */
clock_init();
sci_init();
EnableInterrupts;
for(; ; )
{}
// while(1);
}
void interrupt 20 sci_re(void) //接收中断?sci的中断向量号为20
{
uchar ch;
DisableInterrupts; //关总中断
ch=sci_receive(); //读数据寄存器准备好,开始读数据
// asm nop;
// asm nop;
sci_transmit(ch); //写数据寄存器空闲,写数据
EnableInterrupts; //开总中断
}
|
|