MC9S12 底层驱动

底层驱动

init.c

倍频 + 三个级联PWM(moto1 moto2 steer) + 串口中断 + 脉冲计数 + 外部中断(下降沿)


#include "All_includes.h"  
   
 /* 
 锁相环总线倍频至80MHz 
 fPLLCLK = 2 * fOSCCLK * (SYNR + 1) / (REFDV + 1) 
 */  
  
 void initPLL(void){  
 SYNR                =  0X09;            
 SYNR                |= 0XC0;       
 REFDV               =  0X01;            
 REFDV               |= 0X80;       
 POSTDIV             =  0X00;  
 asm nop;  
 asm nop;  
 asm nop;  
 while((CRGFLG & 0X08) ==0);  
 CLKSEL              &= 0X7F;  
 CLKSEL              |= 0X80;  
 }  
  
 //IO初始化 数据采集 拨码开关  
 void initIO(void) {  
  
 DDRA_DDRA0 = 1;    //trigH  
 PORTA_PA0  = 0;  
  
DDRA_DDRA1 = 1;  //trigT  
PORTA_PA1  = 0;    
   
 //设置H口0位的中断 //EchoH  
 DDRP_DDRP0 = 0; //P口0位:开关量输入     读数据!  
 PERP_PERP0 = 0; //P口0位:允许上拉或下拉器件    
 PPSP_PPSP0 = 0; //P口0位:1上升沿触发中断 0下降沿  
 PIEP_PIEP0=1;  
   
 DDRP_DDRP1 = 0;  
 PERP_PERP1 = 0;  
 PPSP_PPSP1 = 0;  
 PIEP_PIEP1 = 1; //H口0位:中断允许  中断标志位 PIFP_PIFP0   
 }  
  
 void initSteer01(void)    //舵机PWM初始化  
 {  
 PWMCTL_CON01        =1;          //0,1通道级联  
 PWMCLK_PCLK1        =1;          //选择 PWM7口的时钟源为Clock SA ;若置为0,则时钟源为Clock A  
 PWMPRCLK_PCKA       =3;          //ClockA=总线时钟/8   即10MHz  
 PWMSCLA             =5;          //ClockSA=ClockA/(2*PWMSCLA)=5MHZ   
 PWMPOL_PPOL1        =1;          //设置通道1 PWM波的一个周期开始时是高电平  
 PWMCAE_CAE1         =0;          //通道1 PWM输出左对齐  
 PWMPER01            =10000;      //设置PWM频率,PWM1 Frequency = Clock SA / PWMPER01;初始值为 100Hz  
   
 PWME_PWME1          =1;          //使能PWM1   
 PWMDTY01            =1560;       //舵机回中  
 }  
 //****************************PWM初始化*********************  
 //ClockSB =ClockB/(2*PWMSCLB)  
 //0 1 4 5-->A  SA  
 //2 3 6 7-->B  SB  
 //输出频率    =CLK/PWMPERx    (左对齐方式)  
 //输出频率    =CLK/2*PWMPERx  (中心对齐方式)  
   
 /*  
 PWMDTY23 = pwm; PWMDTY45 = 0 正转  
 PWMDTY23 = pwm; PWMDTY45 = 1000 正转  
 */  
 void initMoto23(void)   //电机PWM初始化  
 {  
 PWMCTL_CON23   =1;               //2,3通道级联为16位PWM 对3的设置有效 2无效                  级联  
 PWMCLK_PCLK3   =1;               //PWM3(16位) 选择 ClockSB                                                    时钟  
 PWMPRCLK_PCKB  =3;               //ClockSB=总线时钟/(2^3)   即10MHz                分频  
 PWMSCLB        =5;               //ClockSB=ClockB/(2*PWMSCLB)=1MHZ                                     置频??  
 PWMPOL_PPOL3   =1;               //设置通道3 PWM波的一个周期开始时是高电平  
 // PWMCAE_CAE3 =1;               //通道3 PWM输出左对齐  
 PWMPER23       =1000;            //设置PWM频率 PWM3  f=ClockSB/PWMPER23 = 1000HZ   
   
 PWME_PWME3     =1;               //使能PWM3   
 PWMDTY23       =0;               //设置初值刹车  
 }     
 void initMoto45(void)  //电机PWM初始化      
 {  
 PWMCTL_CON45        =1;          //4,5通道级联  
 PWMCLK_PCLK5        =1;          //PWM5 选择 ClockSA  
 PWMPRCLK_PCKA       =3;          //ClockSA=总线时钟/8   即10MHz  
 PWMSCLA             =5;          //ClockSA=ClockA/(2*PWMSCLA)=1MHZ   
 PWMPOL_PPOL5        =1;          //设置通道5 PWM波的一个周期开始时是高电平  
 // PWMCAE_CAE5      =1;          //通道5 PWM输出左对齐  
 PWMPER45            =1000;       //设置PWM频率 PWM5  f=ClockSA/PWMPER45 = 1000HZ   
   
 PWME_PWME5          =1;          //使能PWM5   
 PWMDTY45            =0;          //设置初值刹车  
 }   
   
 //脉冲累加器初始化 编码器?  
 /* 
 void initCnt(void)                  
 { 
 PACTL       =0X50;     //PT7上升沿脉冲计数 
 TCTL3_EDG7B =0; 
 TCTL3_EDG7A =1;        //输入捕捉上升沿 
 TIE_C7I     =0;        //通道中断屏蔽 
 TIOS_IOS7   =0;        //输入捕捉 
 PACNT       =0X00;     //计数器清零 
 } 
 */  
   
 //串口初始化  
 void initSCI0(void)       //初始化SCI0模块  
 {  
 //SCI0BD            =43;             //总线频率80M  波特率=MCLK/(16*BR)=80M/(16*43)=116379~115200  
 SCI0BD              =521;            //总线频率80M  波特率=MCLK/(16*BR)=80M/(16*521)=9597  
 SCI0CR1             =0x00;           //7:LOOPS=0 6:SCISWAI=0 5:RSRC=0 4:M=0 3:WAKE=0 2:ILT=0 1:PE=0 0:PT=0  
 SCI0CR2             =0x0C;           //7:TIE=0 6:TCIE=0 5:RIE=0 4:ILIE=0 3:TE=1 2:RE =1 1:RWU=0 0:SBK=0  
 }  
   
 void initSCI0irq(void)  
 {    
 SCI0BD = 521;  
 SCI0CR1 = 0x00;  
 SCI0CR2 = 0x2C;  
 }

void SCI_putchar(byte ch) {        
	if (ch =='\n')  
	{
		while(!(SCI0SR1&0x80));     
		SCI0DRL= 0x0d;       				 //输出回车
		return;
	}
	while(!(SCI0SR1&0x80));           //等待发送数据寄存器为空 		            
	SCI0DRL=ch;
}
/////////////通过SCI传送字符串///////////////
void SCI_putstr(byte ch[]) {      
	byte ptr=0;
	while(ch[ptr]){
		SCI_putchar((byte)ch[ptr++]);
	}      
}
//////////////向上位机发图像/////////////////
void send_image(void) {           
	char m,n;
	SCI_putstr(Image);
	SCI_putchar(ROW);
	SCI_putchar(COL);
	SCI_putchar(real_row);
	for(m=0;m<ROW;m++)
		SCI_putchar(path[m]);
	for(m=0;m<ROW;m++)
		SCI_putchar(pathLeft[m]);
	for(m=0;m<ROW;m++)
		SCI_putchar(pathRight[m]);
	for(m=0;m<ROW;m++) {
		for(n=0;n<COL;n++) {
			while(!SCI0SR1_TDRE);
			SCI0DRL=value[m][n];
		}     
	} 
	SCI_putstr(end);
}



你可能感兴趣的:(MC9S12 底层驱动)