MC9S12XS128例程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SCI程序
串行通信时MCU与外部设备之间进行通信的一种简单而有效的硬件方法。
无论用查询方式还是中断方式进行串行通信编程,在程序初始化时均必须对SCI进行初始化。初始化主要包括波特率设置、通信格式的设置、发送接收数据方式的设置等。
对SCI进行初始化,需要设置如下几部分:
(1)定义波特率
一般选内部总线时钟为串行通信的时钟源。通过设置SCI波特率寄存器SCI0BD的波特率选择位SBR[12:0],来选择合适的分频系数。
(2)写控制字到SCI控制寄存器1(SCI0CR1)
设置是否允许SCI、数据长度、输出格式、选择唤醒方法、是否校验等。
(3)写控制字到SCI控制寄存器2(SCI0CR2)
设置是否允许发送与接收、是中断接收还是查询接收等。
串行通信程序如下:
/** write in “Init.h” **/
#include
#include "derivative.h" /* derivative-specific definitions */
//void InitBusClk(void); //可以不使用锁相环
void InitSci(void);
/** write in “Init.c” **/
//初始化程序
#include "Init.h"
/*
//------------初始化Bus Clock------------//
void InitBusClk(void) {
DisableInterrupts;
CLKSEL=0X00; //PLLSEL 1 : Bus Clock=PLLCLK/2
// 0 : Bus Clock=OSCCLK/2
PLLCTL_PLLON=1; //开启PLL
SYNR=0; //OSCCLK=16MHz
REFDV=0X0F; //PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/16=2MHz while(!(CRGFLG_LOCK==1)); //直到LOCK=1,when PLL is ready,退出循环
CLKSEL_PLLSEL=1; //PLLSEL 1 : Bus Clock=PLLCLK/2=2MHz/2=1MHz
// 0 : Bus Clock=OSCCLK/2=16M/2=8MHz
}
*/
//---------------初始化SCI---------------//
void InitSci(void){
SCI0BD=4545; //设波特率为110
//SCI baud rate = SCI module clock/(16*SCIBD)=Bus Clock/(16*SCIBD)
// = 8MHz/(16*4545)=500kHz/4545=110bps
//SCIBD : SBR12-SBR0,Value from 1 to 8191
SCI0CR1=0;
SCI0CR2=0X2C; // 0010 1100 RIE=1,TE=1,RE=1
// RIE=1 RDRF and OR interrupt requests enabled
// TE=1 Transmitter enabled
// RE=1 Receiver enabled
}
/** write in “SCI.h” **/
//函数声明
unsigned char SciRead();
void SciWrite(byte);
/** write in “SCI.c” **/
//串行通信程序
#include "Init.h"
#include "SCI.h"
//---------------读SCI数据---------------//
unsigned char SciRead(){
if(SCI0SR1_RDRF==1){
//数据从移位寄存器传送到SCI数据寄存器SCIDRL
//SCI0SR1_RDRF==1表明数据寄存器SCI0DRL为满,可以接收新的数据SCI0SR1_RDRF=1; //读取SCI数据寄存器会将RDRF清除,重新置位
return SCI0DRL; //返回数据寄存器的数值
}
}
//---------------写SCI数据---------------//
void SciWrite(byte sci_value){
while(!(SCI0SR1&0X80));
//SCI0SR1_TDRE==1表明数据寄存器SCI0DRL为空,可以发送新的数据SCI0DRH=0;
SCI0DRL=sci_value; //发送新的数据至数据寄存器SCI0DR
}
//---------------中断程序-----------------//
#pragma CODE_SEG NON_BANKED
interrupt 20 void Sci_Intrrupt(void){ //SCI的中断向量号为20
byte text;
DisableInterrupts; //关中断
text=SciRead(); //接收数据寄存器SCI0DRL中的数据
asm nop;
asm nop;
SciWrite(text); //发送数据至数据寄存器SCI0DRL
DDRA=0XFF; //设A口为输出,用来显示是否执行中断,可以不用
PORTA_PA6=!PORTA_PA6;
EnableInterrupts; //开中断
}
#pragma CODE_SEG DEFAULT
/** write in “main.c”” **/
#include "Init.h"
#include "SCI.h"
void main(void) {
/* put your own code here */
_DISABLE_COP(); //关看门狗
DisableInterrupts; //关中断
//InitBusClk();
InitSci();
EnableInterrupts; //开中断
for(;;) {
// _FEED_COP(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
A/D转换应用实例
要让ATD 开始转换工作,必须经过以下三个步骤:
1.将ADPU 置1,使ATD 启动;
2.按照要求对转换位数、扫描方式、采样时间、时钟频率及标志检查等方式进行设置;