注意: 1,开始环境搭建,必须选择对应的软件,否则没有对应的单片机型号。 file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.jpg2,安装完驱动后,必须将附带的两个dll文件拷贝到安装程序目录下,gdi的子目录里否则,不能下载程序。 3,程序下载完成后,必须点击箭头按钮,程序才能开始运行,与51类单片机自动运行不同,或者也可以拔掉BDM模块给芯片供电也可以使程序运行。 lesson1 IO编程以及系统工作时钟设置 程序设计收获 1,写程序要注意思想,本次在写的过程中点灯时,在点亮后忘了加延时,以至于一直点不亮,幸亏朱学长帮忙,在这里再谢谢了。 2,遗留问题 a,主要是晶振的计算方法,感觉我选的晶振的频率不对,理论生成的晶振频率越高而闪烁的频率越快,可实际运行时不是这样。 b,是驱动的选择没有完成训练!因为关于寄存器的资料不太全
系统时钟设置 free scale mcu 自带时钟模块(CRG),在系统运行前必须进行时钟的初始化操作以设置系统的运行时钟从而完成精确的定时。 与此相关的寄存器有 CRG合成器寄存器(SYNR) CRG参考分频寄存器(REFDV) CRG标志寄存器(CRGFLG) CRG中断使能寄存器(CRGINT) CRG时钟选择寄存器(CLKSEL) CRGPLL控制寄存器(PLLCTL) CRG实时中断控制寄存器(RTICTL) CRG看门狗控器寄存器(COPCTL) FVCO=2*FOSC*(SYN+1)/(REF+1) BUSCLK=PLLCLK/2 § 初始化步骤: (1)禁止中断; (2)CLKSEL的第7位置0,选择系统时钟源为OSCCLK,在PLL程序执行前,内部总线频率=OSCCLK/2; (3)禁止PLL; (4)根据需要的时钟频率设置SYNR和REFDV寄存器; (5)打开PLL; (6)通过判断CRGFLG寄存器的LOCK位,确定PLL是否稳定; (7)时钟频率稳定后,允许锁相环时钟源作为系统时钟源; (8)设置是否允许IRQ中断、是否允许看门狗 注意:在没有程序的单片机里,如果不加锁相程序,则总线频率为8M fosc=8M. 程序实例: void jingzhen(unsignedint pinl) { CLKSEL=0X00; PLLCTL=0XE1; switch (pinl) { //case 11:SYNR=6911;REFDV=9999;break; case 24:SYNR=2;REFDV=1;break; case 48:SYNR=5;REFDV=1;break; case 96:SYNR=5;REFDV=0;break; default:break; } PLLCTL=0X60; asm NOP; asm NOP; asm NOP; while(!(CRGFLG_LOCK==1)); CLKSEL=0X80; } AB口IO设置 – 输入输出: (1位对应一个端口) • 方向寄存器A口- DDRA, B口- DDRB • 0输入,1输出 – 输出时的驱动能力(1位对应一组端口) • A口-RDRIV[0]; B口-RDRIV[1]; • 1全额驱动能力,0缩减(全额/3)驱动能力 – 上拉电阻控制 (1位对应一组端口) • A口-PUCR[0];B口-PUCR[1]; • 1使用,0不使用 位访问方法: 例PORTA |=0x01,//A PART PA1=1;这样写的优点是不干涉其他位的状态。 例RDRIV.BIT0=1; 例RDRJ_RDRJ7=1; 例程设计 确定使用的端口如下: PM5, PJ7, PB0~7 #include <hidef.h> /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ #include <MC9S12XS128.h> void delay(unsigned int t) //毫秒级延时 { unsigned int j; unsigned char a,b; for(j=0;j<t;j++) { for(b=2;b>0;b--) for(a=124;a>0;a--) { asm NOP; asm NOP; } } } void jingzhen(unsigned int pinl) { CLKSEL=0X00; PLLCTL=0XE1; switch (pinl) { //case 11:SYNR=6911;REFDV=9999;break; case 24:SYNR=2;REFDV=1;break; case 48:SYNR=5;REFDV=1;break; case 96:SYNR=5;REFDV=0;break; default:break; } PLLCTL=0X60; asmNOP; asmNOP; asmNOP; //while(!(CRGFLG_LOCK==1)); delay(100); CLKSEL=0X80; } void main(void) { /*put your own code here */ EnableInterrupts; //PM5, PTJ7, PB0~7 DDRA=0X00; DDRM=0XFF; DDRJ=0XFF; DDRB=0XFF; jingzhen(48); for(;;) { _FEED_COP(); /* feeds the dog */ PTM_PTM5=1; PTJ_PTJ7=1; PORTB=0X00; PTM_PTM5=0; PTJ_PTJ7=0; delay(500); PTM_PTM5=1; PTJ_PTJ7=1; PORTB=0Xff; PTM_PTM5=0; PTJ_PTJ7=0; delay(500); }/* loop forever */ /*please make sure that you never leave main */ }
|