飞思卡尔MC9S12XS128功能模块驱动

来源:互联网 发布:ntfs for mac 注册码 编辑:程序博客网 时间:2024/05/08 21:34

     用了一年多飞思卡尔MC9S12XS128这款处理器,现在总结下各个功能模块的驱动.

//锁相环时钟的初始化  总线频率为40MHz(总线时钟为锁相环时钟的一半)
//晶振为11.0592MHz
void PLL_init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{                   //锁相环时钟= 2*11.0592*(39+1)/(10+1)=80MHz    总线时钟为40MHz
  REFDV=0x0A;     
  SYNR=0x67;     //0110_0111 低6位的值为19,高两位的值为推荐值
  
  while(CRGFLG_LOCK != 1);
  CLKSEL_PLLSEL = 1;  //选定锁相环时钟
  //FCLKDIV=0x0F;     //Flash Clock Divide Factor 16M/16=1M
}

 

//周期中断定时器的初始化-
//  //周期中断通道1用于脉冲累加器的定时采样,定时周期为: 10ms=(199+1)*(1999+1)/(40M)  (没有使用)
//周期中断通道0用于控制激光管的轮流发射,定时周期为: 2000us= (399+1)*(199+1)/(40M)
//2011/4/4 15:24  定时时间改为1ms

void PIT_init(void)
{
  PITCFLMT_PITE = 0;  // 禁止使用PIT模块  PITCFLMT :PIT 控制强制加载微计数器寄存器。
  PITCE_PCE0 = 1;     // 使能定时器通道0
  //PITCE_PCE1 = 1;     //使能定时器通道1
  PITMUX = 0;         //通道0,和通道1均选择8位微计数器0
 
  //修改时间只需要改下面四行
  PITMTLD0 = 199;     //向8位微计数器中加载的值  
  PITLD0 = 199;       //向16位计数器中加载的值
  //PITMTLD1 = 39;     //向8位微计数器中加载的值  8位,最大值不要超过255
  //PITLD1  = 1999;     //向16位计数器中加载的值
 
  PITINTE |= 0x01;    //使能定时器通道0的中断
  PITCFLMT_PITE = 1;//使能PIT模块
}

 

//脉冲累加器的初始化, PT7口外接光电编码器
//最新修改: 2011/3/25 16:53
void PT7_PulAcc_Init(void)
{
   DDRT &= 0x77;//设置PT7,PT3口为输入(硬件上PT7,PT3通过跳线联到了一块)
   PERT |= 0x80; //使能通道7的上拉电阻
  PPST &= 0x7f; //电阻设为上拉电阻
  TCTL4 &= 0x3f; //禁止PT3的输入捕捉功能
  PACTL = 0x50; //启动脉冲累加计数器,上升沿触发,禁止触发中断和溢出中断,主定时器禁止
}

 

//通道1用于控制舵机1   PWM 高电平有效,
//通道3用于控制电机1   PWM 低 电平有效,这与前两代车高电平有效有区别!!!!!
//通道7用于给上排激光管提供PWM信号   PWM高电平有效!!!!!
//通道6用于给下排激光管提供PWM信号    PWM高电平有效!!!!!
// 2011-03-17 7:56  增加了A端口的使用 新增通道6
//2011-6-9 23:03 //增加了通道4,5的联合使用,用于控制下排方向舵机
 void PWM_init(void)
{
  PWME = 0x00;//PWM禁止
                             
  PWMPRCLK = 0x03;  // ClockA=40M/8=5M,  Clock B = 40M/1=40M
  PWMSCLB = 10;   // Clock SB= 40/2*10= 2MHz(供电机) 
  PWMSCLA = 5;    //  SA = Clock A/2*5 = 5M/10 = 500K = SA  用于控制舵机
  PWMPOL = 0xe2;  //1110_0010通道7,通道6与通道1、通道5先输出高电平然后输出低电平,POLx=1先输出高电平后输出低电平; PPOLx=0先输出低电平)
  PWMCAE = 0x00;  // 左对齐输出(CAEx=0为左对齐,反之为中心对齐)
 
  //PWMCLK = 0010_1010  (0 1 4 5位控制SA_1;或A_0;  2 3 6 7位控制SB_1 或B_0)
  //为PWM通道1选择时钟 SA(500KHz),
  //为PWM通道5选择时钟 SA(500KHz),
  //为通道3选择时钟 SB(10MHz)
  //为通道7选择时钟B(40MHz)
  //为通道6选择时钟B(40MHz)
  PWMCLK = 0x2A;  //0010_1010  
 
  PWMCTL = 0x70;   //0111_0000  CON45=1,把通道4,5联合使用。CON01=1,把通道0和1联合使用  CON23=1 把通道3和2联合使用
  PWMPER23 = 1000;  //通道周期为0.5ms 频率为2KHz 

  PWMDTY23 = 0;   //占空比为 0%

  PWMPER01 = 10000;  //一个周期为 50Hz=500KHz/10000
  PWMDTY01 = UPSERVOCENTER;  //占空比为7.5%
  
  PWMPER45 = 10000;  //一个周期为 50Hz=500KHz/10000
  PWMDTY45 = 745;//占空比为7.5%
  
  PWMPER6 = 222;//输出频率为180Khz=40M/222
  PWMDTY6 = 67;//占空比为30%
  PWMPER7 = 222;//输出频率为180Khz=40M/222
  PWMDTY7 = 44;//占空比为20%
  PWME = 0xeA;     //1110_1010使能通道1,3和7,6,5(联合后通道的使能由高通道决定)
}

/*******************************************************************
                            GPIO的初始化
 1:为输出,  0:为输入
 PB[0..7]做为输出端口,

 PA[0..7]做为输出端口
 PM[0..7]做为输出端口,用于控制核心板上的八个LED小灯(1灭,0亮)
 PH[0..3]做为输入端口 
  2011-03-17 7:56  增加了A端口的使用
********************************************************************/
void GPIO_Init(void)
{
  DDRA |= 0xff;   //A口做为输出端口
  DDRB |= 0xff;   //B口做为输出端口
  DDRM |= 0xff;  //M口做为输出端口
  DDRH &= 0xf0;   //PH的低四位做为输入端口
 
  ATD0DIENL = 0xff;
  DDR1AD0 = 0X00;//PT1AD0口作为输入端口
 
  PORTA = 0x00;  //激光管不发射信号
  PORTB = 0x00;  //激光管不发射信号 
  PTM = 0xff;//初始化为全灭(新车小灯)
}

 
原创粉丝点击