⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lqinit.c

📁 --- --- --- Code Warrior 4.6 Target : MC9S12DG128B Crystal: 16.000Mhz busclock: 8.000MHz pllcl
💻 C
字号:
/********************************************************
龙丘MC9S12(DG128)多功能开发板V2.4
编写:邱钊鹏
Designed by Chiu Sir
E-mail:chiusir@163.com
软件版本:V1.1
最后更新:2008年10月28日
相关信息参考下列地址:
博客:  http://longqiu.21ic.org
淘宝店:http://shop36265907.taobao.com
------------------------------------
Code Warrior 4.6
Target : MC9S12DG128B
Crystal: 16.000Mhz
busclock:16.000MHz
pllclock:32.000MHz
目录路径:F:\IVTech\demoALL  
*********************************************************/
#include <hidef.h>
#include <mc9s12dg128.h>  

//-----------------------------------------------------
static void SCI_Init(void) 
{
    SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enable
    SCI0BDH=0x00; //busclk  8MHz,19200bps,SCI0BDL=0x1a
    SCI0BDL=0x68; //SCI0BDL=busclk/(16*SCI0BDL)
                  //busclk  8MHz, 9600bps,SCI0BDL=0x34
                  //busclk  8MHz, 9600bps,SCI0BDL=0x68
                  //busclk 24MHz, 9600bps,SCI0BDL=0x9C
}                 //busclk 32MHz, 9600bps,SCI0BDL=0xD0
//----------------------------------------------------- 
static void Port_Init(void)
{  
    DDRA = 0xff;  //LCD1100,PA0--4,PA67 D1D2
    PORTA= 0x00;   
       
    DDRB = 0xff;  //LED  PTB0--7,
    PORTB= 0xff;  //LEDs on  
   
    DDRE = 0xFF;  //MOTOR CONTROL
    PORTE= 0x00;  //P      
    
    DDRH = 0x00; // PORTH input
    PTIH = 0X00; // KEY,PH0--5
    PERH = 0xff; // PORTH pull up  
    PPSH = 0x00; // Port H Polarity Select Register-falling edge
    PIEH = 0x02; // PORTH interrut disable,                 
    
    DDRJ = 0X01; // PJ0判断行同步脉冲到达
    //PPSJ = 0x01; // Port J Polarity Select Register-rising EDGE 
    PPSJ = 0x00; // Port J Polarity Select Register-falling EDGE   
    PIEJ = 0X00; // VIDEO SYNC INTERRUPT DISABLED,BUT NOT IN MAIN()
    PERJ = 0xff;
    
    DDRP  = 0xff;
    PERP = 0xff;
    PTP_PTP0 = 0;
}
//----------------------------------------------------- 
static void PWM_Init(void)
{     
    //SB,B for ch2367
    //SA,A for ch0145  
    PWMPRCLK = 0X55;    //clockA,CLK B 32分频:500khz   
    PWMSCLA = 0x02;     //对clock SA 进行2*PWMSCLA=4分频;pwm clock=clockA/4=125KHz;     
    PWMSCLB = 0X02;     //clk SB=clk B/(2*pwmsclb)=125KHZ

  //pwm1  
    PWMCNT1 = 0;
    PWMCAE_CAE1=0;      
    PWMPOL_PPOL1=0;                      
    PWMPER1 =125;        
    PWMDTY1 =100;        
    PWMCLK_PCLK1 = 1;                 
    PWME_PWME1 = 0; 
  
  /*     
    PWMCTL_CON01=1;		  //0和1联合成16位PWM;
    PWMCAE_CAE1=0;			//选择输出模式为左对齐输出模式
    PWMCNT01 = 0;				//计数器清零;
    PWMPOL_PPOL1=1;			//先输出高电平,计数到DTY时,反转电平
    PWMPRCLK = 0X50;    //clockA不分频,clockA=busclock=32MHz;CLK B 32分频:1Mhz   
    PWMSCLA = 0x10;     //对clock SA 进行2*PWMSCLA=32分频;pwm clock=clockA/32=1MHz;     
    PWMCLK_PCLK1 = 1;   //选择clock SA做时钟源
    PWMPER01 = 20000;   //周期20ms; 50Hz;(可以使用的范围:50-200hz)
    PWMDTY01 =  1510;   //高电平时间为1.5ms;  
    PWME_PWME1 = 0;
  
  
  //pwm0  
    PWMCNT0 = 0;
    PWMCAE_CAE0=0;      
    PWMPOL_PPOL0=0;                      
    PWMPER0 =125;        
    PWMDTY0 =100;        
    PWMCLK_PCLK0 = 1;                 
    PWME_PWME0 = 0;     
   
    

    //pwm2;
    PWMCNT2 = 0;
    PWMCAE_CAE2=0;      //选择输出模式为左对齐输出模式
    PWMPOL_PPOL2=0;                      
    PWMPER2 =25;        //后轮驱动CLOCK大约125K--5.000KHz,75K--3K=clk B/PWMPER2
    PWMDTY2 =25;        //duty circle=(PWMPER2-PWMDTY2)/PWMPER2=0
    PWMCLK_PCLK2 = 1;   //1 = Clock SB is the clock source for PWM channel 2.                
    PWME_PWME2 = 1;     //如果禁止,则PWM2输出高电平,意味着MC33886全速运行
  
    //pwm3; 
    PWMCNT3 = 0;
    PWMCAE_CAE3=0;      //选择输出模式为左对齐输出模式
    PWMPOL_PPOL3=0;                      
    PWMPER3 =125;       //蜂鸣器名叫频率为1KHZ 
    PWMDTY3 =100;       //duty circle=(PWMPER3-PWMDTY3)/PWMPER3=20%
    PWMCLK_PCLK3 = 1;                   
    PWME_PWME3 = 1;
    
    //PWM6,IN1驱动电机控制
    PWMCNT6 = 0;
    PWMCAE_CAE6=0;      //选择输出模式为左对齐输出模式
    PWMPOL_PPOL6=0;                      
    PWMPER6 =25;        //后轮驱动CLOCK大约125K--5.000KHz,75K--3K=clk B/PWMPER2
    PWMDTY6 =25;        //duty circle=(PWMPER2-PWMDTY2)/PWMPER2=0
    PWMCLK_PCLK6 = 1;   //1 = Clock SB is the clock source for PWM channel 2.                
    PWME_PWME6 = 1;     //如果禁止,则PWM2输出高电平,意味着MC33886全速运行
    
    //PWM7,IN2驱动电机控制
    PWMCNT7 = 0;   
    PWMCAE_CAE7=0;      
    PWMPOL_PPOL7=0;                      
    PWMPER7 =25;      
    PWMDTY7 =25;       
    PWMCLK_PCLK7 = 1;   
    PWME_PWME7 = 1; 
   */       
}
void AD_Init(void) 
{  
  
    ATD0CTL2=0xC0;   //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
    ATD0CTL3=0x08;   //每次转换1个序列, No FIFO, Freeze模式下继续转    
    ATD0CTL4=0x81;   //8位精度, 采样时间为2个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]=2MHz; PRS=1, divider=4 
    ATD0CTL5=0xA0;   //右对齐无符号,,连续转换 ,1通道采样,通道零   
    ATD0DIEN=0x00;   //禁止数字输入 
 /*
    //2通道   
    ATD0CTL2=0xC0;   //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止    
    ATD0CTL3=0x10;   //每次转换2个序列, No FIFO, Freeze模式下继续转
    //ATD0CTL4=0x87; //8位精度, 采样时间为2个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]=2MHz; PRS=7, divider=16    
    ATD0CTL4=0x81;   //8位精度, 采样时间为2个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]=8MHz; PRS=1, divider=4 
    ATD0CTL5=0xB0;   //右对齐无符号,,连续转换 ,8轮流通道采样
    ATD0DIEN=0x00;   //禁止数字输入 

    ATD0CTL2=0xC0;  
    //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
    ATD0CTL3=0x00; 
    // 每个序列8次转换, No FIFO, Freeze模式下继续转换
    ATD0CTL4=0x85; 
    // 8位精度, 采样时间为2个AD时钟周期, 
    //ATDClock=[BusClock*0.5]/[PRS+1]  ; PRS=5, divider=12
    ATD0CTL5=0xB0;   //右对齐无符号,,连续转换 ,8轮流通道采样,通道零
    ATD0DIEN=0x00;   //禁止数字输    
  */  
} 
//-----------------------------------------------------
//IOC7/PT7用于计算CS3144产生的脉冲数
static void IOC_Init(void)
{   
    TCTL3=0xc0;//c-输入捕捉7任何沿有效,             
    TCTL4=0xc0;//40表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿      
    TIE  =0x00;//每一位对应相应通道中断允许,0表示禁止中断
    TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较
    TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,
} 
//产生40ms的定式中断,读取IOC7的计数值
static void Timer_Init(void) 
{                         
    //TSCR1=0X80;//TIMER INT ENABLED
    //TSCR1=0x90;//计数器使能TEN|快速清零TFFCA
    TSCR1=0X00;  //禁止TIM
    //TSCR2=0X80;//DIV 1->2.5ms,enable time overflow interrrupt
    //TSCR2=0X82;//DIV 4->10ms
    //TSCR2=0X83;//DIV 8->20ms   
    //TSCR2=0X84;//DIV 16->40ms
    TSCR2=0X85;//DIV 32->80ms
    //TSCR2=0X86;//DIV 64->160ms    
    //TSCR2=0X87;//DIV 128->320ms,enable time overflow interrrupt
    TCNT =0;     //    
    PACTL=0X50;  //PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT
    //PBCTL=0X40;//PBCN10 16BIT,INT DISABLED
    //ICPAR=0;   //8BIT DISABLED
}
//-----------------------------------------------------
// setup of the RTI interrupt frequency     
static void RTI_Init(void) 
{   
    //RTICTL=0x10;   //2^10x40ms=4.96s
    //RTICTL=0X74; //SET PRESCALER,div rate=(m+1)x2^(n+9),(m=1-7,n=0-15)
                   //tick=16Mhz/((4+1)x2^(7+9))=48.83,(/sec)
                   //16000000/64k=244.140625 ,与晶振频率相关,与分频无关
    RTICTL=0x77;   //8x2^16 =>32,75ms,30.5175Hz
    //RTICTL=0x7f;   //16x2^16 =>,65.536ms,15.26Hz    
    //RTICTL=0x1F; //16x2^10--1ms                              
    //CRGINT=0X80;   //enable RTI Interrupt
    CRGINT=0X00;   //disable RTI Interrupt    
} 
static void Time_Start(void){     
    RTI_Init();
    CRGINT=0X80;   //enable RTI Interrupt  
} 
//-----------------------------------------------------
// PLL初始化子程序   BUS Clock=16M
void setbusclock(void)
{   
    CLKSEL=0X00;				//disengage PLL to system
    PLLCTL_PLLON=1;			//turn on PLL
    SYNR=1;										
    REFDV=1;		        //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
    _asm(nop);          //BUS CLOCK=16M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));	  //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;		        //engage PLL to system; 
}
//-----------------------------------------------------
#pragma CODE_SEG DEFAULT
void Init_Dev(void)
{
    setbusclock();
    Port_Init();
    SCI_Init();
    PWM_Init();
    AD_Init();    
    Timer_Init();     
    Time_Start();
    IOC_Init(); 
}

//----------------------------------------------------- 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -