MC9S12XS128编程.docx
《MC9S12XS128编程.docx》由会员分享,可在线阅读,更多相关《MC9S12XS128编程.docx(49页珍藏版)》请在冰点文库上搜索。
MC9S12XS128编程
//------------------------------------------------------------------------------------------------------------------//
//功能说明:
MC9S12XS128--SCI例程
//使用说明:
实现PC→MCU→PC通信,用户可以根据需要修改程序,实现PC→MCU或者MCU→PC通信
//程序设计:
电子设计吧【】
//设计时间:
2010.01.21
#include/*commondefinesandmacros*/
#include"derivative.h"/*derivative-specificdefinitions*/
//unsignedchartxt[]={"HelloWorld!
"};
voiddelay(unsignedinttime)
{unsignedinti,j,k;
for(i=0;i<125;i++)
for(j=0;j<125;j++)
for(k=time;k>0;k--);
}
//-----------------------初始化SCI0----------------------------//
voidSciInit()
{SCI0BD=52;//9600bpsBaudRate=BusClock/(16*SCIBD)
SCI0CR1=0;//正常8位模式,无奇偶校验
SCI0CR2=0X2C;//发送允许接受中断允许
}
//----------------------读SCI数据-----------------------------//
unsignedcharSciRead()
{
if(SCI0SR1_RDRF==1)//表明数据从位移寄存器传输到SCI数据寄存器
{
SCI0SR1_RDRF=1;//读取数据寄存器会将RDRF清除重新置位
returnSCI0DRL;//返回数据寄存器的数据
}
}
//-----------------写SCI数据---------------------------------//
voidSciWrite(unsignedcharsendchar)
{
while(!
(SCI0SR1&0x80));
SCI0DRH=0;
SCI0DRL=sendchar;
}
//------------------------main----------------------------------//
voidmain(void)
{SciInit();
EnableInterrupts;
for(;;)
{
}/*waitforever*/
/*pleasemakesurethatyouneverleavethisfunction*/
}
//---------------------------接收中断函数-----------------------//
#pragmaCODE_SEGNON_BANKED
voidinterrupt20SCI0_re(void)
{unsignedcharch;
ch=SciRead();
SciWrite(ch);
}
手把手教你写S12XS128程序(26)--SCI寄存器说明1
时间:
2010-01-2222:
44来源:
电子设计吧作者:
dzsj8点击:
584次
1、波特率控制寄存器(SCIBDH、SCIBDL)
IREN:
红外调制模式使能位
1使能
0禁止
TNP[0..1]:
窄脉冲发射位
SBR[0..12]:
波特率设置位
WhenIREN=0then,
SCIbaudrate=SCIbusclock/(16xSBR[12:
0])
WhenIREN=1then,
SCIbaudrate=SCIbusclock/(32xSBR[12:
1])
【说明】波特率发生器在复位后是禁止的,在设置TE、RE(在SCICR2寄存器中)后才会工作。
当(SBR[12:
0]=0andIREN=0)或者(SBR[12:
1]=0andIREN=1),波特率发生器不工作。
【注意】在未写入SCIBDL,写SCIBDH没有反应。
一般地,设置IREN=0,SR=52(总线频率8MHz),波特率为9600。
2、数据寄存器(SCIDRH、SCIDRL)
SCI内部分别设有发送和接收两个数据寄存器,其低位都通过SCIDRL访问,读操作返回接收数据寄存器RDR的内容,写操作数据置入发送数据寄存器。
TDR。
当M=1即运行在9位数据模式时,SCIDRL和SCIDRH形成9位的SCI数据字,这时必须先写入SCIDRH,以便与低位字节(SCIDRL)一起进入发送移位器。
如果M=0即SCI只用于7位或8位的数据传送,可以只访问SCIDRL。
当PE=1即奇偶校验允许时,奇偶校验位由硬件负责,无需软件干预。
R8:
接收到的位8,该位写操作无效。
当SCI设置成9位数据运行模式时,该位是从串行数据流中接收到的第9位。
T8:
发送位8,任何时候可写。
当SCI设置成9位数据模式时,该位是送到串行数据流的第9位。
该位不必为每个数据重新设置,每次发送可重复使用。
R[0..7]T[0..7]:
收/发数据位7-0,读操作返回只读寄存器RDR的内容,写操作写入只写寄存器TDR。
手把手教你写S12XS128程序(27)--SCI寄存器说明2
时间:
2010-01-2722:
55来源:
未知作者:
dzsj8点击:
549次
3、控制寄存器(SCICR1)
LOOPS:
在LOOP模式下,RXD引脚与SCI接收部分断开,发射部分输出在内部和接收部分相连接,此时RXD可作为普通IO口,TXD输出SCI信号。
1LOOP模式使能
0正常模式
SCISWAI:
等待模式下SCI停止位
0:
在等待模式下允许SCI
1:
在等待模式下禁止SCI
RSRC:
接收器信号源选择位,当LOOPS=1时,RSRC决定接收器的内部反馈信号路径。
0:
接收器的输入在内部连接到发送器输出(并非TxD引脚)。
1:
接收器的输入连接到TxD引脚。
M:
方式选择位(选择字符帧格式)。
0:
1个起始位,8个数据位,1个停止位。
1:
1个起始位,8个数据位,第9个数据位,1个停止位。
WAKE:
唤醒选择位。
0:
介质空闲唤醒。
1:
地址标志(最后一个数据位为1)唤醒。
ILT:
空闲检测方式选择位,该位在SCI接收器可以使用的两种空闲检测方式中选择一种。
0:
快速检测,SCI在一个帧的开始位后立即开始对“1”计数,因此停止位以及停止位前面的任何“1”均被计算在内,这样可以提前检测到空闲状态。
1:
保守检测,SCI在停止位后才开始对“1”计数,因此最后一个字节的停止位以及该位以前的各个为“广的位,对检测的时间长短无影响。
PE:
奇偶校验允许位。
0:
禁止奇偶校验。
1:
允许奇偶校验。
PT:
奇/偶校验选择位,如果奇偶校验允许,该位决定收发器使用奇校验还是偶校验。
0:
选择偶校验。
1:
选择奇校验。
4、控制寄存器2(SCICR2)
TIE:
发送中断允许位,清0时禁止TDRE产生中断,若置1则允许TDRE位置1时产生SCI中断请求。
TCIE:
发送结束中断允许位,清0时禁止TC产生中断,若置1则允许TC位置1时产生SCI中断请求。
RIE:
接收中断允许位,清0时禁止RDRF和OR产生中断,若置1则允许RDRF或OR置1时产生SCI中断请求。
ILIE:
空闲中断允许位,清0时禁止IDLE产生中断,若置1则允许IDLE位置1时产生SCI中断请求。
TE:
发送允许位。
该位由0置1时可用来发送空闲报头。
0:
发送器禁止。
1:
允许SCI发送部分工作,TxD引脚(PSl/PS3)用于发送。
RE:
接收允许位。
0:
接收器禁止。
1;允许SCI接收器工作。
RWU:
接收器唤醒控制位
0:
SCI接收器正常工作。
1:
允许唤醒功能,禁止接收器中断。
通常,硬件通过自动清除该位来唤醒接收器。
SBK:
中止符发送允许位。
只要该位保持为1,发送器就不停地发出“0”;如果变为0,当前的全“0”帧发送结束后,TxD引脚将变成空闲状态。
如果SBK开关一次,发送器将只发出10(11)个“0”,然后复原,处于空闲或发送数据状态。
0:
中止符产生器关闭。
1:
产生中止符,至少10或11个连续的“0”。
【说明】该寄存器主要完成收发中断的控制、收发的允许等操作。
手把手教你写S12XS128程序(28)--SCI寄存器说明3
时间:
2010-01-2722:
59来源:
电子设计吧作者:
dzsj8点击:
601次
5、状态寄存器1(SCISR1)
TDRE:
发送保持器空标志位。
发送前必须读SCISR1,并确认TDRE=1,然后将新的数据写入发送保持器以开始发送过程。
复位后该位为1。
0:
SC0DR处于忙状态
1:
发送保持器的数据已被传送到发送移位器,这时可以向发送保持器写入新的数据
TC:
发送结束标志。
该位在发送器空闲(无发送动作)时置位。
读SCISRl,然后写SCIDR将清除该位。
0:
发送器忙,正在发送
1:
发送器空闲,无发送
RDRF:
接收数据就绪标志。
当收到的字符已经在SCIDR中就绪时,RDRF置1,顺次读取SCISRl和SCIDR将会自动清除RDRF。
该位被清除后,必须等到RxD线变为活动,然后重新变成空闲以后,IDLE位才会被再次置1。
0:
SCIDR空,数据寄存器无数据
1:
SCIDR中数据已就绪,数据寄存器数据有效
IDLE:
空闲标志。
检测到接收器RxD端空闲(收到10或者11个以上连续的“1”)。
当RWU位为1时,空闲状态不会使该位置1。
该位被清除后,必须等到RDRF置位(RxD线变为活动,然后重新变成空闲),IDLE位才会被再次置1。
0:
RxD线活动。
1:
RxD线空闲。
OR:
重叠错误标志。
如果接收数据寄存器中的数据尚未读取(RDRF=1),接受移位寄存器又准备向其传送新的数据,则称为重叠错误,该位被置1。
必须清除该位,才能使新的数据进入接收数据寄存器。
0:
无重叠。
1:
出现重叠错误。
NF:
噪声错误标志。
噪声错误出现时,该位与RDRF在同一个周器内置位,但如果同时或已经出现重叠错误,该位不置位。
0:
采样结果一致。
1:
在起始位、数据位或停止位接收期间检测到噪声。
FE:
帧格式错误。
如果在应该出现停止位的时刻,检测到0,则该位置位。
顺次读取寄存器SCISRl和SCIDR将清除FE标志。
0:
检测到停止位。
1:
在预期的停止位处检测到0。
PF:
奇偶错误标志。
指示收到数据的奇偶性与校验位是否一致。
奇偶校验允许(PE=1)时,该标志才有意义。
所要求的奇偶性由SC0CR1中的PT位决定。
0:
奇偶校验正确。
1:
奇偶校验错误。
【说明】该寄存器显示SCI运行情况,收发数据是否满、空,是否出错等
6、状态寄存器2(SCISR2)
BRK13:
中止符长度控制位。
0:
中止符长度为10或11位。
1:
中止符长度为13或14位。
TXDIR:
单线模式下发送管脚数据方向控制位。
0:
单线模式下TxD脚用于输入。
1:
单线模式下TxD脚用于输出。
RAF:
接收器活动标志位。
反映接收器是否处于活动状态。
在搜索起始位的RT1期间该位置1,当接收器器检测到空闲状态或者出现一个伪起始位(通常由于噪声或波特率匹配错误引起)时,该位清0。
手把手教你写S12XS128程序(17)--Timer模块介绍1
时间:
2009-12-2911:
51来源:
电子设计吧作者:
dzsj8点击:
1060次
1、简述
MC9S12XS128定时器模块与MC9S12DG128ECT部分功能完全类似,以下均以ECT模块介绍xs128定时器模块。
HC12增强型捕捉计时器模块在HCS12标准定时器的基础上增加了一些特点,用以扩展它的应用范围,特别是在汽车ABS方面。
基准计时器的核心仍然是一个16位的可编程计数器,其时钟源来自一个预分频器。
该计时器可以被应用于多个方面,包括在对输入波形进行测量的同时产生一个输出波形。
波形的脉宽可以在几微秒到数秒的范围内变化。
增强型定时器模块(ECT)的结构框图如下,ECT功能相当于高速的I/O口,由一个4位预分频器、一个16位自由运行计数器,8个16位IC/OC通道,2个16位脉冲累加器以及一个16位模数递减计数器组成。
ECT实际上是一个16位的可编程计数器,它的基本时钟频率可以通过预分频器设置,用于产生波形输出,测量输入波形,统计脉冲个数,可以作为定时中断功能和独立时钟基准。
2、运行模式
停止:
由于时钟停止,计时器和计数器均关闭。
冻结:
计时器和计数器均保持运行,直到TSCR($06)的TSFRZ位被置1。
等待:
计数器保持运行,直到TSCR($06)的TSWAI位被置1。
正常:
计时器和计数器均保持运行,直到TSCR($06)的TEN位和MCCTL($26)的MCEN位被分别清0。
手把手教你写S12XS128程序(25)--Timer模块应用实例2
时间:
2010-01-1523:
46来源:
电子设计吧作者:
dzsj8点击:
786次
输出比较(OC)编程步骤:
初始化函数
TIOS---选择工作方式为OC
TCx---通道x的OC寄存器赋初值,经过N秒后进入第一次中断
TCTLx---设置对应位输入捕捉的方式(x=1、2,高四位是1,低四位是2)
TSCRx---控制寄存器设置,包括工作使能、确定工作方式(x=1)、中断允许、预分频
TIE---中断使能
中断函数
清除标志位---TFLG1
重新赋初值TCx
【例程4】
//---------------------------------------------------------------------------//
//功能说明:
利用PT0的输出比较功能,定时进入中断
//利用PORTB显示定时的时间
//程序设计:
电子设计吧
//设计时间:
2010.01.15
//---------------------------------------------------------------------------//
#include/*commondefinesandmacros*/
#include/*derivativeinformation*/
#pragmaLINK_INFODERIVATIVE"mc9s12dg128b"
//利用定时器输出比较功能产生定时中断
//----------------------变量定义----------------------//
staticunsignedintwaittime=0;
//---------------------时钟初始化-------------------//
voidPLL_Init(void)//PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{//锁相环时钟=2*16*(2+1)/(1+1)=48MHz
REFDV=1;//总线时钟=48/2=24MHz
SYNR=2;
while(!
(CRGFLG&0x08));
CLKSEL=0x80;
}
//--------------------定时器初始化------------------//
voidECT0_Init(void)
{
TIOS=0x01;//定时器通道0设置为输出比较
TC0=0x00ee;//赋初值,当TCNT从0计数到此值时第一次进入中断
TCTL2=0x02;//其他七路与定时器断开执行的动作时:
0通道输出清零
TSCR2=0x86//溢出中断禁止24M/64=2.67微秒,计一个数用2.67微秒
TSCR1=0x80;//使能定时器
TIE=0x01;//通道0输出比较中断允许
}
//-----------------------主函数------------------------//
voidmain(void)
{
PLL_Init();
ECT0_Init();
DisableInterrupts;
DDRB=0xff;
PORTB=0x00;
for(;;)
{
EnableInterrupts;
}
}
//-----------------------中断函数处理-------------------//
#pragmaCODE_SEGNON_BANKED
voidinterrupt8Timer0_ISR(void)//8为定时器通道0的中断标号
{
unsignedintm;
TFLG1_C0F=1;//清中断标志位
DisableInterrupts;
m=TCNT;
TC0=m+37500;//37500*2.67us=10ms定时时间
waittime++;
if(waittime>=255)
{
waittime=0;
}
PORTB=waittime;
}
手把手教你写S12XS128程序(24)--Timer模块应用实例1
时间:
2010-01-1320:
43来源:
电子设计吧作者:
dzsj8点击:
924次
输入捕捉(IC)编程步骤:
初始化函数
TIOS---选择工作方式为IC
TCTLx---设置对应位输入捕捉的方式(x=3、4,高位是3,低位是4)
TSCRx---控制寄存器设置,包括工作使能、确定工作方式(x=1)、中断允许、预分频
TIE---中断使能
中断函数
清除标志位---TFLG1
处理函数
【例程3】
//---------------------------------------------------------------------------//
//功能说明:
利用PP3通道产生40Hz,占空比为50%的方波
//利用PT0采集方波的个数,并在PB口显示
//程序设计:
电子设计吧
//设计时间:
2010.01.13
//---------------------------------------------------------------------------//
#include/*commondefinesandmacros*/
#include/*derivativeinformation*/
#pragmaLINK_INFODERIVATIVE"mc9s12dg128b"
unsignedintInput_Num;
//----------------------时钟初始化------------------------------//
voidPLL_Init(void)//PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{//锁相环时钟=2*16*(2+1)/(1+1)=48MHz
REFDV=1;//总线时钟=48/2=24MHz
SYNR=2;
while(!
(CRGFLG&0x08));
CLKSEL=0x80;
}
//--------------------通道0输入捕捉初始化-------------------//
voidECT0_Init(void)
{
TSCR2=0x06;//禁止溢出中断,分频系数64(24/64MHz)
TIOS_IOS0=0;//通道0为输入捕捉
TCTL4=0x01;//捕捉上升沿
TIE_C0I=1;//通道0输入捕捉中断允许
TSCR1=0x80;//使能定时器
}
//---------------------PWM通道3初始化程序-------------------//
voidPWM_Init(void)
{
PWME_PWME3=0x00;//PWWisdisabled禁止
PWMPRCLK=0x33;//0b00110011A=B=24M/8=3M时钟预分频寄存器设置
PWMSCLA=150;//SA=A/2/150=10k时钟设置
PWMSCLB=150;//SB=B/2/15=10k时钟设置
PWMCTL=0x00;//noconcatenation控制寄存器设置
PWMCLK_PCLK3=1;//PWM3-----SB时钟源的选择
PWMPOL_PPOL3=1;//Duty=HighTime极性设置
PWMCAE_CAE3=0;//left-aligned对齐方式设置
PWMPER3=250;//Frequency=SB/250=40周期寄存器设置
PWMDTY3=125;//Dutycycle=50%占空比寄存器设置
PWME_PWME3=1;//enable使能
}
//----------------------主函数-------------------------//
voidmain(void)
{
PLL_Init();
PWM_Init();
ECT0_Init();
DDRB=0XFF;
PORTB=0X00;
EnableInterrupts;
for(;;)
{
}/*waitforever*/
/*pleasemakesurethatyouneverleavethisfunction*/
}
//--------------------转速计算:
-------------------------------//
//
//智能车转速子函数
//
//-------------------------------------------------------