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

📄 rti源代码.txt

📁 Code Warrior 4.7 Target : MC9S12XS128 Crystal: 16.000Mhz busclock:16.000MHz pllclock:32.000MHz
💻 TXT
字号:
#include <hidef.h>      
#include <MC9S12XS128.h>    
#include <stdio.h>
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"  

volatile dword u32_time_cnt=0;
volatile int p=0;     

//====================中断函数==================================   

#pragma CODE_SEG __NEAR_SEG NON_BANKED 
void interrupt 7 RTI_ISR(void) { 	 // 32.75ms timer overflow   
  ++u32_time_cnt;         
  PORTB_PB2=~PORTB_PB2;
  CRGFLG|=0X80;//Write 1 to clear RTIF bit   
}
 //--------------------J口光电计数器的中断输入---------------------------------
#pragma CODE_SEG __NEAR_SEG NON_BANKED 
void interrupt 24 PORTJ_ISR(void)
{         
  PORTB_PB0=~PORTB_PB0;
  p=1; 
  PIFJ_PIFJ0=1;   //清除中断标志位 
}

// 函 数 名: void DLY_ms(word x)
// 功能描述: 毫秒级延时
void DLY_ms(int ms)		//x取值1~255;
{
	 int ii,jj;
   if (ms<1) ms=1;
   for(ii=0;ii<ms;ii++)
     for(jj=0;jj<2770;jj++);    //32MHz--1ms  
} 
//----------------------------------------------------- 
 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 = 0xff; // PORTH interrut disable,
                 // PH7判断奇偶场换场信号
    
    DDRJ = 0X00; // PJ0判断行同步脉冲到达
    //PPSJ = 0x01; // Port J Polarity Select Register-rising EDGE 
    PPSJ = 0x00; // Port J Polarity Select Register-falling EDGE   
    PIEJ = 0Xff; // VIDEO SYNC INTERRUPT DISABLED,BUT NOT IN MAIN()
    PERJ = 0xff;
    
    DDRM = 0XFF; // motor2的驱动模块MC33886的初始化子程序
    PTIM = 0X01; // EN:PM0=0,operating run;
    PERM = 0xff; // EN:PM0=1,full run;
    
    DDR1AD0=0xF8; 
    PT1AD0 =0xFF;
}
//-----------------------------------------------------
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 16MHz, 9600bps,SCI0BDL=0x68                   
}                 
void uart_putchar(unsigned char ch)
{ 
  if (ch == '\n')  
  {
      while(!(SCI0SR1&0x80)) ;     
      SCI0DRL= 0x0d; //output'CR'
	    return;
  }
  if (ch == '\r')  
  {
      while(!(SCI0SR1&0x80)) ;     
      SCI0DRL= 0x0a; //output'LF'
	    return;
  }
  while(!(SCI0SR1&0x80)) ; 		    //keep waiting when not empty  
  SCI0DRL=ch;
}

void putstr(char ch[])
{
  unsigned char ptr=0;
  while(ch[ptr]){
      uart_putchar((unsigned char)ch[ptr++]);
  } 
}
// setup of the RTI interrupt frequency     
static void RTI_Init(void) 
{               
    RTICTL=0x77;   //8x2^16 =>32,75ms,30.5175Hz                     
    //CRGINT=0X80;   //enable RTI Interrupt
    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=0x00 | 0x01; 	// VCOFRQ[7:6];SYNDIV[5:0]
                        // fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)
                        // fPLL= fVCO/(2 × POSTDIV) 
                        // fBUS= fPLL/2 
                        // VCOCLK Frequency Ranges  VCOFRQ[7:6]
                        // 32MHz <= fVCO <= 48MHz    00
                        // 48MHz <  fVCO <= 80MHz    01
                        // Reserved                  10
                        // 80MHz <  fVCO <= 120MHz   11				
    REFDV=0xc0 | 0x01;  // REFFRQ[7:6];REFDIV[5:0]
                        // fREF=fOSC/(REFDIV + 1)
                        // REFCLK Frequency Ranges  REFFRQ[7:6]
                        // 1MHz <= fREF <=  2MHz       00
                        // 2MHz <  fREF <=  6MHz       01
                        // 6MHz <  fREF <= 12MHz       10
                        // fREF >  12MHz               11                         
                        // pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
    POSTDIV=0x00;       // 4:0, fPLL= fVCO/(2xPOSTDIV)
                        // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one).
    _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;
}
//---------------------PWM output--------------------------------

static void PWM_Init(void)
{     
    
    //pwm0.pwm1
    PWMCTL_CON01=1;		  //0和1联合成16位PWM;
    PWMCAE_CAE1=0;			//选择输出模式为左对齐输出模式
    PWMCNT01 = 0;				//计数器清零;
    PWMPOL_PPOL1=1;			//先输出高电平,计数到DTY时,反转电平
    PWMPRCLK = 0X77;    //clockA 不分频,clockA=busclock=16MHz;CLK B 16分频:1Mhz  
    PWMSCLA  = 0x04;    //对clock SA 16分频,pwm clock=clockA/16=1MHz;     
    PWMCLK_PCLK1 = 1;   //选择clock SA做时钟源
    PWMPER01 = 10000;   //周期20ms; 50Hz;(可以使用的范围:50-200hz)
    PWMDTY01 = 5000;   //高电平时间为1.5ms;  
    PWME_PWME1 = 1;     
}
//-----------------------------------------------------
#pragma CODE_SEG DEFAULT
void Init_Dev(void)
{
    setbusclock();
    Port_Init();
    SCI_Init();      
    RTI_Init(); 
    PWM_Init();
}

//====================main()==================================
#pragma CODE_SEG DEFAULT     
void main(void)    
{
   
  char  txtbuf[66]="";
  byte  u8_mintes=0;
  word  u16_sec=0,u16_ms=0;    
  char  txtbuf1[66]="\n\r"; 
  Init_Dev();  
  PORTB=0x00;
  DLY_ms(1000);     
  PORTB=0xFF;
  EnableInterrupts;    
  for(;;)
  { 
//----------时钟计时器---------------------------------
    u16_sec=u32_time_cnt*131/4;//理论值为32.75ms,时间计算部分  
    u16_ms=u16_sec%1000;        
    u16_sec=u16_sec/1000;    
    sprintf(txtbuf,"\n%d:%02ds-%03dms ",u8_mintes,u16_sec,u16_ms);     
    putstr(txtbuf);           
    if(u16_sec>58)
    {
      u8_mintes++;
      u32_time_cnt=0; 
    }
    if(p==1) 
    {
      u8_mintes=0;
      u16_sec=0;
      u16_ms=0;
      u32_time_cnt=0;
      p=0;
      putstr(txtbuf1);
    }
//--------------------------------------------------------    
  //  PORTB_PB0=~PORTB_PB0;
  //  DLY_ms(50);         
  }//for(;;)
} //main

⌨️ 快捷键说明

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