首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

SR12采用32.768K的晶振,用C语言怎样产生8M的频率,用CW怎么编写??

SR12采用32.768K的晶振,用C语言怎样产生8M的频率,用CW怎么编写??

各位大侠:
  小弟,是刚接触MOTUO的C语言编程者。遇到这个问题后试了多种方法,都没有解决掉。请各位大侠帮帮小弟。
可以用PE生成代码,我生成了一段,供你参考
/* Common initialization of the write once registers */
/* CONFIG1:
COPRS=0,LVISTOP=0,LVIRSTD=0,LVIPWRD=0,LVI5OR3=0,SSREC=0,STOP=0,COPD=1 */
setReg8(CONFIG1, 0x01);

/* CONFIG2: STOPICLKEN=0,STOPRCLKEN=0,STOPXCLKEN=0,OSCCLK1=0,OSCCLK0=0,??=0,CDOEN=0,SCIBDSRC=0 */
setReg8(CONFIG2, 0x00);

/* Common initialization of the write once registers */
/* PCTL: BCS=0 */
clrReg8Bits(PCTL, 0x10); /* Select clock source from XTAL */
/* PCTL: PLLON=0 */
clrReg8Bits(PCTL, 0x20); /* Disable the PLL */
/* PCTL: PLLIE=0,PLLF=0,PLLON=0,BCS=0,PRE1=0,PRE0=0,VPR1=1,VPR0=0 */

setReg8(PCTL, 0x02); /* Set VCO output Power-of-Two devider P=0 the VCO Power-of-Two multiplier E=2 */

/* PMS: ??=0,??=0,??=0,??=0,MUL11=0,MUL10=0,MUL9=1,MUL8=1,MUL7=1,MUL6=1,MUL5=0,MUL4=1,MUL3=0,MUL2=0,MUL1=0,MUL0=1 */
setReg16(PMS, 0x03D1); /* Set the Feedback divider N=977 */
/* PMRS: VRS7=1,VRS6=1,VRS5=0,VRS4=1,VRS3=0,VRS2=0,VRS1=0,VRS0=0 */
setReg8(PMRS, 0xD0); /* Set the VCO Linear multiplier L=208 */
/* PMDS: ??=0,??=0,??=0,??=0,RDS3=0,RDS2=0,RDS1=0,RDS0=1 */
setReg8(PMDS, 0x01); /* Set the Reference clock devider R=1 */
/* PBWC: AUTO=1,LOCK=0,ACQ=0,??=0,??=0,??=0,??=0,??=0 */
setReg8(PBWC, 0x80); /* Select the operating modes */
/* PCTL: PLLON=1 */
setReg8Bits(PCTL, 0x20); /* Enable the PLL */
while(!PBWC_LOCK) { /* Wait */
}
/* PCTL: BCS=1 */
setReg8Bits(PCTL, 0x10); /* Select clock source from PLL */
__asm("nop");
__asm("nop");
/*** End of PE initialization code after reset ***/

把setReg8Bits()函数可以直接设定成PCTL=0x10;这种形式

谢谢拉!!
  不过,可以用PE生成代码??怎么生成啊??
  还有这些代码是放在什么地方??
  是“main.c”里,还是其它地方,还是建一子函数??
谢谢拉!!
  我编写了一段代码,但不能产生0.5ms的中断,请问:“错在那里???”

uchar led_data;
void main(void)
{
EnableInterrupts; /* enable interrupts */
/* include your code here */
CONFIG1=0x09; //关闭看门狗, 5V模式
CONFIG2=0x01;
PCTL=0x00;
PBWC = 0X80;
PMSH = 0x03;
PMSL = 0xD1;
PMRS = 0xD0;
PCTL = 0x28; //E=2
while(PBWC_LOCK==0);
PCTL_BCS = 1;
T1SC_TSTOP=1;
T1SC_TRST=1;
T1SC=0x43;
T1MODH=0x01;
T1MODL=0xF4;


DDRD=0xFF; //PTD设置为输出
PTD=0;
led_data=0xFF;//初始化变量
while(1); /* loop forever */ ?????
}
interrupt void T1_OverFlow_ISR(void)
{
T1SC_TOIE=0;
//T1SC&=~0x80;
T1SC_TOF=0;
if(led_data<0x10)
{
led_data=0x80;
}
PTD=led_data;
led_data=(led_data>>1);
T1SC_TOIE=1;
}
你的中断程序的中断号不对,正确的写法应该是:
interrupt 7 void T1_OverFlow_ISR(void)
7是定时器1溢出中断的中断号。


做自己想做的事,并力争做好每一件事。
不一定在中断服务子程序中写中断号,可以用中断服务程序配合prm文件的方式
返回列表