MC9S12XS128终极例程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 /* common defines and macros */

#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.按照要求对转换位数、扫描方式、采样时间、时钟频率及标志检查等方式进行设置;

相关文档
最新文档