📄 inits_tasks.c
字号:
//各模块初始化例程
//文件名:Inits.c
//编码人:梁霄
//最后更新时间:2008.06.05 23:28
#include <hidef.h> //基本定义和宏定义
#include <mc9s12dg128.h> //硬件定义
#include "..\Sources\common_defs.h" //自定义常量
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
void CRG_Init(void)
{
SYNR = 0x02; //同步器系数=2
REFDV = 0x01; //参考分频器系数=1
//锁相环频率PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)=48MHz
while(CRGFLG_LOCK == 0); //等待直到锁相环稳定
CLKSEL = 0x80; //选定系统时钟为锁相环时钟,系统总线频率为锁相环时钟频率
//的一半,为24MHz
//以下语句来自第一届志存高远队程序,尚未弄清楚是何种功能
//PE4输出E时钟,时钟E=PLL/2=24M
//PEAR=0x00;
//使E时钟自由运行
//EBICTL_ESTR=0;
return;
}
void PORT_Init(void)
{
//PORTA方向为输入(是8个控制开关,),初始化为低电平
//注意:8个开关的顺序和端口的顺序是相反的!比如8号开关就对应着PORTA_BIT0
DDRA = 0x00;
PORTA = 0x00;
//PORTB方向:PB0、PB1为输入;PB2~PB6为输出(4个LED小灯,高电平灯亮);初始化为低电平,即小灯全灭
DDRB = 0xFC;
PORTB = 0x00;
//PORTE_BIT1(/IRQ)方向为输入,为行同步信号
DDRE = 0x02;
//PORTP(PWM)方向为输出,为舵机、电机驱动信号
DDRP = 0xFF;
}
void PWM_Init(void)
{
//PWM使能:PWM01,23,67启动
PWME = 0x8A;
//PWM时钟设定
//通道01选择SA为时钟;通道23,通道67选择SB为时钟
PWMCLK = 0x8A;
//时钟A预分频系数为4,故时钟A频率为24MHz/4=6MHz
//时钟B预分频系数为16,故时钟B频率为24MHz/16=1.5MHz
PWMPRCLK = 0x42;
//时钟SA分频系数为2*3=6,故时钟SA频率为6MHz/6=1MHz
PWMSCLA = 0x03;
//时钟SB分频系数为150*2=300,故时钟SB频率为1.5MHz/300=5KHz
PWMSCLB = 0x96;
//PWM通道设定
//PWM通道0和通道1级联,通道2和通道3级联,通道6和通道7级联
PWMCTL = 0xD0;
//PWM输出极性设定:低电平在先
PWMPOL = 0x8A;
//PWM输出对齐设定:左对齐
PWMCAE = 0x00;
//PWM通道周期/占空比设定
//PWM通道01周期为20000(十进制),即4E20(十六进制)
PWMPER01 = 0x4E20;
//PWM通道23,通道67周期均为100(十进制),即0064(十六进制)
PWMPER23 = 0x0064;
PWMPER67 = 0x0064;
//PWM通道01占空比从1350到1850可调,即0546到073A
//初始值为1625(0659),舵机处于中间位置
PWMDTY01 = 0x0659;
//PWM通道23,通道67初始占空比均为0%
PWMDTY23 = 0x0000;
PWMDTY67 = 0x0000;
return;
}
void MDC_Init(void)
{
//允许回零中断、反复计数、强制装载初始值、分频系数为8
//这样,减计数器基准频率为24MHz/8=3MHz
MCCTL = 0xCE;
//写入减计数器初值为60000,即为0xEA60
//这样,每次中断的间隔时间为20毫秒
MCCNT = 0xEA60;
//把模数常数寄存器的值加载到模数计数器
MCCTL = MCCTL|0x08;
//暂时不开启模数计数器
MCCTL_MCEN = 0;
return;
}
void IOC_Init(void)
{
//TIOS:IOC0,IOC1均为输入捕捉
TIOS = 0x00;
//TSCR1:允许主定时器工作
TSCR1 = 0x80;
//TSCR2:禁止定时器溢出中断,其余设置不变
TSCR2 = 0x00;
//TCTL3,TCTL4:IOC捕捉下降沿
TCTL3 = 0x00;
TCTL4 = 0x08;
//允许通道1中断
TIE = 0x02;
//清中断标志位
TFLG1 = 0x02;
//DLYCT:禁止
DLYCT = 0x00;
//ICOVW:自动覆盖输入捕捉寄存器的值(因为用不到)
ICOVW = 0x00;
ICSYS = 0x00;
}
void IRQ_Init(void)
{
//下降沿触发,能够IRQ中断,行同步
INTCR = 0xC0;
}
void ATD_Init(void)
{
//ATD0CTL2:禁止发生中断,忽略外部触发,软件方式清除中断
//暂时不启动转换(等待奇偶场同步信号)
ATD0CTL2 = 0x40;
//ATD0CTL3:结果不映射到转换序列,转换序列长度为1
ATD0CTL3 = 0x08;
//ATD0CTL4:8位精度,ATD时钟为4MHz,按照公式
//ADClock=BusClock*0.5/(PRS+1),BusClock=24MHz,
//故PRS=2,精采样时间为2个AD时钟周期,AD转换时间为1微秒
ATD0CTL4 = 0x82;
//ATD0CTL5:单通道采样;连续A/D转换;转换结果无符号,右对齐;
//模拟信号从AN0引脚输入
ATD0CTL5 = 0xA0;
//禁止数字输入
ATD0DIEN = 0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -