📄 rti源代码.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 + -