MC9S12 底层驱动

来源:互联网 发布:人工智能芯片龙头股票 编辑:程序博客网 时间:2024/06/05 23:59

底层驱动

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);}



原创粉丝点击