Freescale_MC9S12XS128程序总结 下载本文

内容发布更新时间 : 2024/12/28 11:56:09星期一 下面是文章的全部内容请认真阅读。

1. 对IO口输入输出操作程序举例:A口接流水灯并实现闪烁

void main(void) { while(1) {

DDRA=0xff;

delay(500); PORTA=0xff; delay(500); PORTA=0; }

另外,B、E口的IO功能操作也是一样的,因为位数一样寄存器一样,其他口的寄存器就不太一样了!J,P,M,T,S这五个口除具有数据寄存器外,他们都另外多出另一个端口输入寄存器(该寄存器功能我未知)! 2. SPI总线接口

SPI是一种高速高效的同步串行接口,这种接口主要用于MCU与外部的接口芯片交换数据,只要有SPI口的芯片都可以与单片机相连形成主从机系统进行数据的传递,比如SPI用于移位寄存器74HC164,这是个串入并出的芯片这样可以实现扩展IO口。还有AD转换芯片AD7793,可以实现数模转换,还有飞思卡尔公司的电源管理芯片MC33389。

因设备有限此功能待以后调试!

3. SCI总线接口

MC9S12DG128单片机有两个SCI模块,可以选用其中任何一个。他的使用有8个相应寄存器共设置,其中有波特率设置寄存器SCIBDH,SCIBDL,还有控制寄存器SCICR1,SCICR2,状态寄存器SCISR1,SCISR2,数据寄存器SCIDRH,SCIDRL;

简单讲SCI的使用就是寄存器初始化,数据传送方式设置,下面举个初始化使用的简单例子:SCICR2=0x08;//发送使能设置

SCIBDH=0x00;//波特率设置为9600 SCIBDL=0x9c;

就是这样这个是简单实用时的设置,发送函数如下:

While(!(SCISR1&0x40))//检测是否发送完毕,一旦发送完毕就进入到死循

环里边

{} SCIDRL=C;//C代表需要传送的数据 4. 有关定时器TCNT

TCNT是芯片内部的16位主定时器,他不停地对内部时钟信号进行计数,从0x0000直到0xffff,计满后溢出又返回到0x0000,程序随时可以读取,但在普通模式下禁止写入。TCNT应该按字访问,分别访问高低字节将出现错误! 可以直接利用它的来实现一些延时的功能! 例如下面的程序: #include #include \ void TimerOverflow() {

unsigned char i=1,j=0x80;

while((i!=0)&&(j!=0)) {

PORTB=~(i|j);

i<<=1;//B口实现流水的移位操作 j>>=1;

while(TCNT!=0x0000);//对比定时器寄存器 while(TCNT==0x0000); } }

void main(void) {

EnableInterrupts;

TSCR1=0x80;//定时器使能

TSCR2=0x06;//设置时钟预分频为64 DDRB=0xff; PORTB=0xff; for(;;) {

TimerOverflow(); } }

5. 系统时钟锁相环

锁相环的初始化比较麻烦,与此相关的控制寄存器有: 锁相环控制寄存器PLLCTL

时钟合成寄存器SYNR,有效值为0-63 时钟分频寄存器REFDV,有效值为0-15 时钟产生模块的标志寄存器ORGFLG 时钟选择寄存器CLKSEL

锁相环初始化的步骤为:时钟选择寄存器清零(不使能锁相环,该功能有CLKSEL的最高位控制,即CLKSEL=0x00)——锁相环电路允许设置(该功能由PLLCTL的第6位控制,将其置1即可,注意该寄存器的设置必须进行位操作)——然后就是对SYNR和

REFFV进行赋值,根据公式设定总线时钟fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV

+ 1)——然后延时几个总线周期以等待时钟频率稳定——判断时钟频率是否稳定(该

功能与ORGFLG有关,当该寄存器的LOCK位,第3位为1时表明频率已经稳定,故该处用一判断语句设置)——最后就是允许锁相环时钟作为系统时钟了(该功能由CLKSEL的最高位控制,置1即选定) 举个例子: 设置总线频率为24MHz CLKSEL=0x00; PLLCTL|=0x40; SYNR=2;

REFDV=1; Delay();

While(!(CRGFLG_LOCK==1)) ; 或while(!(CRGFLG&0x08==0x08)) ; CLKSEL|=0x80;

这样一个锁相环程序就完成了,设置的总线频率为24M; 6. 定时器溢出中断的使用

下面简单介绍一下使用中学到的,首先锁相环程序的首次使用成功 例如:

void clock_init()//24M锁相环时钟 {

uchar m=0;

CLKSEL=0x00;//时钟选择寄存器清零,不使能锁相环时钟

PLLCTL|=0x40;//锁相环控制寄存器第6位置1,允许使用锁相环 SYNR=2; REFDV=1;

m++;//延时以使锁相环时钟稳定 m++; m++;

while(CRGFLG&0x08==0x08)

CLKSEL|=0x80;//当判断时钟稳定时,时钟选择器第7位置1,使能锁相环时钟 }

下面介绍定时器溢出使用的初始化程序 例如:

void timerout_init()//定时器初始化 {

TSCR1|=0x80;//定时器允许工作 TSCR2|=0x80;//定时器溢出中断允许 TSCR2|=0X07;//时钟128分频 EnableInterrupts;//使能中断 }

还有相应的中断服务程序 例如:

#pragma CODE_SEG NON_BANKED

void interrupt 16 timeout_int() {

t++;

TFLG2|=0x80;//定时器器溢出标志位置位 if(t==5) {

t=0;

PORTB=~PORTB;

EnableInterrupts; } }

这个程序让我知道了定时器溢出中断的使用方法,为我今后进行别的模块的学习打下了好的基础,也使我更加有信心!! 7. 所谓输入捕捉功能

在输入捕捉模式下,相应的输入捕捉通道通过捕捉该管教上的电平变化发出锁存信号 ,将该时刻计数器的值锁存到捕捉寄存器中,通过连续的测量,记录下每次锁存的值就可以计算出脉冲的宽度或者周期信息。

如果配合输出比较功能,还可以产生一段时间的延迟,例如:当需要在一个外部事件发生一定时刻后,单片机产生一个输出信号来控制某个操作。这既可以利用输入捕捉来记录外部事件发生的时刻,把这个时间加上一定的延时值送到输出比较寄存器,并允许输出比较功能就可以达到延迟目的!!

首先介绍不带缓冲的输入捕捉通道:

HCS2增强型定时器中共有8个输入捕捉通道,其中4个(PT4~PT7)和普通的输入捕捉通道一样,带有一个捕捉寄存器用来记录管教上的电平变化时自由计数器的锁存值。当ICOVW寄存器的NOVWx位清零时,每发生一次输入捕捉,新的计数器的值就会覆盖原来的输入捕捉寄存器的内容;当该位置1时,除非输入捕捉寄存器为空,否则新的值不能写入(使输入捕捉寄存器为空的方法就是读取该寄存器)。这样就避免了新的计数值覆盖旧的计数值。

带缓冲的输入捕捉通道:

另外4个带缓冲的输入捕捉通道(PT0~PT3),除了带有捕捉寄存器之外,还有一个保持寄存器,可以在不产生中断的条件下连续记录两次自由计数器的值。他有两种工作方式,锁存方式:当模数计数器减为0,向模数计数器写入“$0000”或写强制锁存位ICLAT时,输入捕捉计数器 值将锁存到相应的通道的保持寄存器中,并将输入捕捉计数器清零。当ICOVW寄存器的NOVWx位清零时,每次发生输入捕捉事件时,新的计数值将覆盖旧的输入捕捉寄存器值,如果是锁存方式,则保持寄存器中的内容将被更新。 当该位置1时,除非输入捕捉寄存器或是保持寄存器为空,否则新的计数器的值将不能写入。队列方式:当ICOVW寄存器的NOCWx位清零时,每发生输入捕捉事件,输入捕捉寄存器的值将被写入保持寄存器中,新的计数器的值将记录在输入捕捉寄存器中。当该位置1时,除非输入捕捉寄存器或是保持寄存器为空,否则新的计数值竟不能写入。