📄 lqinit.c
字号:
/********************************************************
龙丘MC9S12(DG128)多功能开发板V2.4
编写:邱钊鹏
Designed by Chiu Sir
E-mail:chiusir@163.com
软件版本:V1.1
最后更新:2008年10月28日
相关信息参考下列地址:
博客: http://longqiu.21ic.org
淘宝店:http://shop36265907.taobao.com
------------------------------------
Code Warrior 4.6
Target : MC9S12DG128B
Crystal: 16.000Mhz
busclock:16.000MHz
pllclock:32.000MHz
目录路径:F:\IVTech\demoALL
*********************************************************/
#include <hidef.h>
#include <mc9s12dg128.h>
//-----------------------------------------------------
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 8MHz, 9600bps,SCI0BDL=0x34
//busclk 8MHz, 9600bps,SCI0BDL=0x68
//busclk 24MHz, 9600bps,SCI0BDL=0x9C
} //busclk 32MHz, 9600bps,SCI0BDL=0xD0
//-----------------------------------------------------
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 = 0x02; // PORTH interrut disable,
DDRJ = 0X01; // PJ0判断行同步脉冲到达
//PPSJ = 0x01; // Port J Polarity Select Register-rising EDGE
PPSJ = 0x00; // Port J Polarity Select Register-falling EDGE
PIEJ = 0X00; // VIDEO SYNC INTERRUPT DISABLED,BUT NOT IN MAIN()
PERJ = 0xff;
DDRP = 0xff;
PERP = 0xff;
PTP_PTP0 = 0;
}
//-----------------------------------------------------
static void PWM_Init(void)
{
//SB,B for ch2367
//SA,A for ch0145
PWMPRCLK = 0X55; //clockA,CLK B 32分频:500khz
PWMSCLA = 0x02; //对clock SA 进行2*PWMSCLA=4分频;pwm clock=clockA/4=125KHz;
PWMSCLB = 0X02; //clk SB=clk B/(2*pwmsclb)=125KHZ
//pwm1
PWMCNT1 = 0;
PWMCAE_CAE1=0;
PWMPOL_PPOL1=0;
PWMPER1 =125;
PWMDTY1 =100;
PWMCLK_PCLK1 = 1;
PWME_PWME1 = 0;
/*
PWMCTL_CON01=1; //0和1联合成16位PWM;
PWMCAE_CAE1=0; //选择输出模式为左对齐输出模式
PWMCNT01 = 0; //计数器清零;
PWMPOL_PPOL1=1; //先输出高电平,计数到DTY时,反转电平
PWMPRCLK = 0X50; //clockA不分频,clockA=busclock=32MHz;CLK B 32分频:1Mhz
PWMSCLA = 0x10; //对clock SA 进行2*PWMSCLA=32分频;pwm clock=clockA/32=1MHz;
PWMCLK_PCLK1 = 1; //选择clock SA做时钟源
PWMPER01 = 20000; //周期20ms; 50Hz;(可以使用的范围:50-200hz)
PWMDTY01 = 1510; //高电平时间为1.5ms;
PWME_PWME1 = 0;
//pwm0
PWMCNT0 = 0;
PWMCAE_CAE0=0;
PWMPOL_PPOL0=0;
PWMPER0 =125;
PWMDTY0 =100;
PWMCLK_PCLK0 = 1;
PWME_PWME0 = 0;
//pwm2;
PWMCNT2 = 0;
PWMCAE_CAE2=0; //选择输出模式为左对齐输出模式
PWMPOL_PPOL2=0;
PWMPER2 =25; //后轮驱动CLOCK大约125K--5.000KHz,75K--3K=clk B/PWMPER2
PWMDTY2 =25; //duty circle=(PWMPER2-PWMDTY2)/PWMPER2=0
PWMCLK_PCLK2 = 1; //1 = Clock SB is the clock source for PWM channel 2.
PWME_PWME2 = 1; //如果禁止,则PWM2输出高电平,意味着MC33886全速运行
//pwm3;
PWMCNT3 = 0;
PWMCAE_CAE3=0; //选择输出模式为左对齐输出模式
PWMPOL_PPOL3=0;
PWMPER3 =125; //蜂鸣器名叫频率为1KHZ
PWMDTY3 =100; //duty circle=(PWMPER3-PWMDTY3)/PWMPER3=20%
PWMCLK_PCLK3 = 1;
PWME_PWME3 = 1;
//PWM6,IN1驱动电机控制
PWMCNT6 = 0;
PWMCAE_CAE6=0; //选择输出模式为左对齐输出模式
PWMPOL_PPOL6=0;
PWMPER6 =25; //后轮驱动CLOCK大约125K--5.000KHz,75K--3K=clk B/PWMPER2
PWMDTY6 =25; //duty circle=(PWMPER2-PWMDTY2)/PWMPER2=0
PWMCLK_PCLK6 = 1; //1 = Clock SB is the clock source for PWM channel 2.
PWME_PWME6 = 1; //如果禁止,则PWM2输出高电平,意味着MC33886全速运行
//PWM7,IN2驱动电机控制
PWMCNT7 = 0;
PWMCAE_CAE7=0;
PWMPOL_PPOL7=0;
PWMPER7 =25;
PWMDTY7 =25;
PWMCLK_PCLK7 = 1;
PWME_PWME7 = 1;
*/
}
void AD_Init(void)
{
ATD0CTL2=0xC0; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
ATD0CTL3=0x08; //每次转换1个序列, No FIFO, Freeze模式下继续转
ATD0CTL4=0x81; //8位精度, 采样时间为2个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]=2MHz; PRS=1, divider=4
ATD0CTL5=0xA0; //右对齐无符号,,连续转换 ,1通道采样,通道零
ATD0DIEN=0x00; //禁止数字输入
/*
//2通道
ATD0CTL2=0xC0; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
ATD0CTL3=0x10; //每次转换2个序列, No FIFO, Freeze模式下继续转
//ATD0CTL4=0x87; //8位精度, 采样时间为2个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]=2MHz; PRS=7, divider=16
ATD0CTL4=0x81; //8位精度, 采样时间为2个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]=8MHz; PRS=1, divider=4
ATD0CTL5=0xB0; //右对齐无符号,,连续转换 ,8轮流通道采样
ATD0DIEN=0x00; //禁止数字输入
ATD0CTL2=0xC0;
//AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
ATD0CTL3=0x00;
// 每个序列8次转换, No FIFO, Freeze模式下继续转换
ATD0CTL4=0x85;
// 8位精度, 采样时间为2个AD时钟周期,
//ATDClock=[BusClock*0.5]/[PRS+1] ; PRS=5, divider=12
ATD0CTL5=0xB0; //右对齐无符号,,连续转换 ,8轮流通道采样,通道零
ATD0DIEN=0x00; //禁止数字输
*/
}
//-----------------------------------------------------
//IOC7/PT7用于计算CS3144产生的脉冲数
static void IOC_Init(void)
{
TCTL3=0xc0;//c-输入捕捉7任何沿有效,
TCTL4=0xc0;//40表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿
TIE =0x00;//每一位对应相应通道中断允许,0表示禁止中断
TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较
TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,
}
//产生40ms的定式中断,读取IOC7的计数值
static void Timer_Init(void)
{
//TSCR1=0X80;//TIMER INT ENABLED
//TSCR1=0x90;//计数器使能TEN|快速清零TFFCA
TSCR1=0X00; //禁止TIM
//TSCR2=0X80;//DIV 1->2.5ms,enable time overflow interrrupt
//TSCR2=0X82;//DIV 4->10ms
//TSCR2=0X83;//DIV 8->20ms
//TSCR2=0X84;//DIV 16->40ms
TSCR2=0X85;//DIV 32->80ms
//TSCR2=0X86;//DIV 64->160ms
//TSCR2=0X87;//DIV 128->320ms,enable time overflow interrrupt
TCNT =0; //
PACTL=0X50; //PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT
//PBCTL=0X40;//PBCN10 16BIT,INT DISABLED
//ICPAR=0; //8BIT DISABLED
}
//-----------------------------------------------------
// setup of the RTI interrupt frequency
static void RTI_Init(void)
{
//RTICTL=0x10; //2^10x40ms=4.96s
//RTICTL=0X74; //SET PRESCALER,div rate=(m+1)x2^(n+9),(m=1-7,n=0-15)
//tick=16Mhz/((4+1)x2^(7+9))=48.83,(/sec)
//16000000/64k=244.140625 ,与晶振频率相关,与分频无关
RTICTL=0x77; //8x2^16 =>32,75ms,30.5175Hz
//RTICTL=0x7f; //16x2^16 =>,65.536ms,15.26Hz
//RTICTL=0x1F; //16x2^10--1ms
//CRGINT=0X80; //enable RTI Interrupt
CRGINT=0X00; //disable RTI Interrupt
}
static void Time_Start(void){
RTI_Init();
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=1;
REFDV=1; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;
_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;
}
//-----------------------------------------------------
#pragma CODE_SEG DEFAULT
void Init_Dev(void)
{
setbusclock();
Port_Init();
SCI_Init();
PWM_Init();
AD_Init();
Timer_Init();
Time_Start();
IOC_Init();
}
//-----------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -