注册会员
- 积分
- 105
- 威望
- 175
- 贡献
- 20
- 兑换币
- 0
- 注册时间
- 2010-5-6
- 在线时间
- 0 小时
|
百度空间 | 百度首页 | 登录 奋斗编程学习不是一时半会儿就能学会的,需要努力,需要理解。 主页博客相册|个人档案 |好友 查看文章
XS128初始化参考方案2010-02-03 20:45#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#include "Hard.h"
//----------------------XS128 PLL初始化函数--------------------------------*
//功 能: *
// 芯片初始化设置:通过设置CLKSEL寄存器,确定内部总线的时钟源;通过PLL编 *
// 程,设置PLLCLK;通过设置INTCR和COPCTL寄存器,分别决定是否允许IRQ中断和 *
// 看门狗。 *
// (1)外部晶振=16MHZ BusClock=40MHZ *
// (3)禁止看门狗 *
//参 数:无 *
//返 回:无 *
//-------------------------------------------------------------------------*
//定义波特率Bt=14400,SCI0BD=fBUS/(16*Bt)
static void PLL_Init(void)
{
//(2)CLKSEL的第7位置0,选择系统时钟源为OSCCLK
//在PLL程序执行前,内部总线频率=OSCCLK/2
//clksel.7(PLL选择位)决定内部总线时钟来源
//=O,BusClock=OSCCLK/2; =1,BusClock=PLLCLK/2
CLKSEL &= 0x7f; //此时:BusClock=OSCCLK/2
//(3)禁止PLL
PLLCTL &= 0xbf;//PLLCTL.6(pllon)设为0;先关闭PLL
//(4)根据需要的时钟频率设置SYNR和REFDV寄存器
//计算公式LLCLK=2*OSCCLK*((SYNR+1)/(REFDV+1))
SYNR = 0x04; //对PLLCLK增频的因子
REFDV = 0x01; //对PLLCLK分频的因子
//(5)打开PLL
PLLCTL |= (1<<6); //PLLCTL.6(pllon)设为1;开PLL
//(6)通过判断CRGFLG寄存器的LOCK位,确定PLL是否稳定
while ((CRGFLG&0x08) == 0x00);
//(7)时钟频率稳定后,允许锁相环时钟源作为系统时钟源;
CLKSEL |= (1<<7); //本句执行后:BusClock=PLLCLK/2
//(8)设置是否允许IRQ中断、是否允许看门狗
IRQCR &= 0xbf; //IRQCR.6(IRQEN) =0禁止IRQ中断(默认开)
COPCTL = 0x00; //COPCTL.2-0(cr2:cr0) =000禁止看门狗
}
void IOInit(){
//DDRB = 0xff; //测试用的IO口
// PORTB = 0x0f;
DDRH = 0xcf; //NRF24L01无线发送端口占用低6位
DDRM |= 0x03; //PM0、1口控制电机
PTM |= 0x03; //初始时,电机停止转动
//A0 = 0, A1 = 1 直流电机倒转
//A0 = 1, A1 = 0 直流电机正转
}
/*****************************************************
功能:未级联时直接选择PP3作为控制舵机的口,级联后,需要
改为PP3口作为舵机控制口。
最好的方案:选择23口级联
******************************************************/
void PwmInit(void)
{
PWME=0X00; //禁止PWM输出
PWMCTL_CON23 = 1; //通道2,3级联
PWMCAE_CAE3 = 0; //左对齐
PWMPOL_PPOL3 = 1; //PWM输出起始为高电平
PWMPRCLK = 0X00; //ClockB不分频
PWMSCLB = 0X05; //ClockSB=fbus/10 ClockSB为4MHZ
PWMCLK_PCLK3 = 1; //时钟来源选择ClockSB
PWMPER23 = 40000; //输出周期=(1/4M)*(40000) =10ms
PWMDTY23 = 5950; //高电平持续时间1.5ms,使舵机输出转角为0,舵机处于正中间
PWME_PWME3 = 1; //启动PWM输出
}
/*****************************************************
功能:直流电机速度端口初始化
端口:PTP1口,方向端口:PTM0 1
******************************************************/
void MOTOR_PWM_Init(void){
PWMCTL_CON01 = 1; //通道01级联
PWMCAE_CAE1 = 0; //左对齐
PWMPOL_PPOL1 = 1; //PWM输出起始为高电平
PWMPRCLK = 0X00; //ClockA不分频
PWMSCLA = 0X01; //ClockSA=fbus/4 ClockSA为10MHZ
PWMCLK_PCLK1 = 1; //时钟来源选择ClockSA
PWMPER01 = 10000; //输出周期=(1/10M)*(10000) =1ms
PWMDTY01 = 3000;//高电平时间325us //启动速度 调试时待改
PWME_PWME1 = 1; //启动PWM输出
}
/*****************************************************
功能:传感器检测路面信息初始化
占用端口:原ATD转换多用口,作为普通IO口使用时需设ATD0DIEN为全1.
******************************************************/
void SeniorInit(){
DDR01AD0 &= 0xf000; //光电传感器借PAD0~PAD11口
//占PAD0低8位,占PAD0H口低三位
PT01AD0 = 0x0000; //初始给端口低电平
ATD0DIEN = 0xffff; //普通IO使能
}
/*****************************************************
功能:时基中断初始化,实现5ms中断
这次使用:中断里500ms进行一次测速。
******************************************************/
void initPIT(void)
{
PITCFLMT_PITE=0; //定时中断通道0关
PITCE_PCE0=1;//定时器通道0使能
PITMTLD0=40-1;//8位定时器初值设定。40分频,在40MHzBusClock下,为1MHz。即 1us.
PITLD0=PITTIME-1;//16位定时器初值设定。PITTIME*0.001MS
PITINTE_PINTE0=1;//定时器中断通道0中断使能
PITCFLMT_PITE=1;//定时器通道0使能
}
/*****************************************************
功能:脉冲累加器初始化,实现脉冲测速。
端口使用:PTT7口,电路接法:需要上拉电阻5.1千欧姆
******************************************************/
void initPACA(void)//初始化脉冲累加器A
{
PACTL=0x50; //PT7上升沿脉冲计数
PACNT =0x00; //累加器置初值
}
/*****************************************************
功能:硬件初始化,包括以上各初始化
所有初始化都要在这里进行
******************************************************/
void HardInit() {
DisableInterrupts;//关闭中断
IOInit();//IO初始化
SeniorInit();//传感器设置
PLL_Init();//总线时钟设置
initPIT(); //定时中断
initPACA();//脉冲累加器中断
PwmInit(); //舵机初始化
MOTOR_PWM_Init();//控制直流电机
nRF24L01_Initial();//nRF2401初始化
EnableInterrupts;
} |
|