⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inits_tasks.c

📁 飞思卡尔嵌入式微处理器S12控制程序
💻 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 + -