📄 lqiocmain.c
字号:
/**************************************************************************************
龙丘MC9S12X多功能开发板V1.0
Designed by 龙丘
E-mail:chiusir@163.com
软件版本:V1.1
最后更新:2009年2月21日
相关信息参考下列地址:
博客: http://longqiu.21ic.org
淘宝店:http://shop36265907.taobao.com
------------------------------------
Code Warrior 4.7
Target : MC9S12XS128
Crystal: 16.000Mhz
busclock:16.000MHz
pllclock:32.000MHz
============================================
本程序主要包括以下功能:
1.设置锁相环和总线频率;
2.IO口使用;
3.IOC7口16位计数器。
LED计数,根据灯亮可以读取系统循环了多少次
*****************************************************************************************/
#include <hidef.h>
#include <MC9S12XS128.h>
#include <stdio.h>
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
//-----------------------------------------------------
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=0x80 | 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;
}
//-----------------------------------------------------
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;
}
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++]);
}
}
//-----------------------------------------------------
static void IOC_Init(void)
{
TCNT =0x00;
TSCR1=0x80;//时钟允许
TSCR2=0x04;//div by 16
PACTL=0x30;//PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT
TCTL3=0xc0;//c-输入捕捉7任何沿有效,
TCTL4=0x03;//0表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿
TIE =0x00;//每一位对应相应通道中断允许,0表示禁止中断
TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较
TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,
TCTL4_EDG0x=1;
}
//-----------------------------------------------------
void Dly_ms(int ms)
{
int ii,jj;
if (ms<1) ms=1;
for(ii=0;ii<ms;ii++)
for(jj=0;jj<2670;jj++); //busclk:16MHz--1ms
}
void main(void)
{
char mystr[20]="";
unsigned char LedCnt=0;
unsigned int IOCcnt;
setbusclock();
SCI_Init();
IOC_Init();
DDRB=0xFF;
PUCR_PUPBE=1;
putstr("\nLongQiu s.&t. Co. Ltd.");
putstr("\nhttp://shop36265907.taobao.com");
EnableInterrupts;
for(;;)
{
LedCnt=(LedCnt>0XFE?0:++LedCnt);
Dly_ms(1000); //修改延时以修改数据发送频率
//低电平灯亮用这句,注释掉下面那句
PORTB=~LedCnt;
//高电平灯亮用这句,注释掉上面那句
//PORTB=LedCnt;
IOCcnt=PACNT;
if(IOCcnt>999) PACNT=0;
sprintf(mystr,"\n\nIOC pulses:%d",IOCcnt);
putstr(mystr);
sprintf(mystr,"\nTC7; pulses:%d",TC7L);
putstr(mystr);
sprintf(mystr,"\nTC0L pulses:%d",TC0L);
putstr(mystr);
}
}
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -