MC9S12G128 PWM

来源:互联网 发布:帝国cms 文件权限 编辑:程序博客网 时间:2024/06/06 15:43
/*******************************************************************    程序名:MC9S12G128 PWM**    参  数:无**    功  能:初始化G128PWM,频率,16KHz,占空比50%  **    注  意:总线时钟需超频至32MHz**    作  者:赵露露**    版  本:v1.0**    时  间:2012.5.11   ******************************************************************/#include <hidef.h>            /* common defines and macros */#include "derivative.h"       /* derivative-specific definitions *//*******************************************************************    函数名: delayms()**    参  数:xms**    功  能:在32MHz总线时钟下大约延时xms毫秒  **    注  意:    ******************************************************************/void delayms(uint xms){  uint z,j;for(z=xms;z>0;z--)    for(j=5340;j>0;j--);}/*******************************************************************    函数名: PLL_Init()**    参  数:无**    功  能:将G128超频至16M,32M,64M  **    注  意:    ******************************************************************/void PLL_Init(void) {  CPMUPROT = 0x26;            //保护时钟配置寄存器  CPMUCLKS_PSTP = 0;          //禁用PLL  CPMUCLKS_PLLSEL = 1;        //选择PLL作为系统时钟源  CPMUOSC_OSCE = 1;           //外部晶振使能    CPMUSYNR = 0x07;            //fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)                       CPMUREFDIV = 0x03;          //16M:07,0F;32M:07,07;64M:07,03      CPMUPOSTDIV = 0x00;         // PLL CLOCK = VCO CLOCK / (POSTDIV + 1)                               //BUS CLOCK = PLL CLOCK/2  _asm(nop);  _asm(nop);    CPMUPLL=0x10;               //锁相环调频启用,用以减少噪音      while(CPMUFLG_LOCK == 0);  //等待PLL稳定    CPMUPROT = 0x00;            //关闭保护时钟   }/*******************************************************************    函数名: PWM_Init()**    参  数:无**    功  能:初始化G128的PWM模块  **    注  意:01 23通道级联使用    ******************************************************************/static void PWM_Init(void){  PWME_PWME0 = 0;             //禁止通道  PWME_PWME1 = 0;  PWME_PWME2 = 0;  PWME_PWME3 = 0;    PWMCTL_CON01 = 1;           //01,23通道连接成16位PWM使用  PWMCTL_CON23 = 1;    PWMCNT0 = 0x00;             //0123通道计数被禁止  PWMCNT1 = 0x00;  PWMCNT2 = 0x00;  PWMCNT3 = 0x00;    PWMPRCLK = 0x00;            //预分频 A、B 1分频 32MHz            PWMSCLB = 0x01;             //0x01 : SB_CLK = B_CLK  / (1*2) == 16MHz                              //SB时钟设置  PWMSCLA = 0x01;             //0x01 : SA_CLK = B_CLK  / (1*2) == 16MHz                              //SA时钟设置  PWMPOL_PPOL1 = 1;           //起始高电平   PWMCLK_PCLK1 = 1;           //PWM1---SB   时钟源的选择   PWMPOL_PPOL3 = 1;   PWMCLK_PCLK3 = 1;           //SA时钟设置    PWMCAE_CAE1 = 0;            //对齐方式设置  PWMCAE_CAE3 = 0;    PWMDTY01 = 500;             // Duty cycle =    占空比寄存器设置 3500  PWMPER01 = 1000;            //周期==(1/16M)*(1000)= ms; 16kHz 周期寄存器设置   PWMDTY23 = 500;               PWMPER23 = 1000;            //周期==(1/16M)*(1000)= ms; 16kHz     PWME_PWME1 = 1;             //Enable  PWM             使能     PWME_PWME3 = 1;                               }void main(void) {  DDRD = 0xFF;                //设置PD(0-7)方向为输出  PORTD = 0xFF;               //设置PD(0-7)输出高电平   PLL_Init();  PWM_Init();                                while(1)  {    PORTD_PD0 = ~PORTD_PD0;   //LED取反    delayms(1000);  }            }

新手上路,如有错误,欢迎指正。

原创粉丝点击