📄 init.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
#define SERVO_MID 4500
extern void iic_write(byte sub_address,byte write_record);
extern void delay_ms(unsigned int time);
//初始化锁相环、系统总线时钟24MHz
void init_PLL(void){
SYNR=2;
REFDV=1;
while(!(CRGFLG_LOCK));
CLKSEL=0x80;
}
//CMOS传感器设定函数
void init_CMOS(void){
iic_write(0x12,0x80); //reset
delay_ms(3); //delay 3ms
iic_write(0x71,0x40); //Gated PCLK
delay_ms(3);
iic_write(0x14,0x24); //320*240
delay_ms(3);
iic_write(0x28,0x00); //black/white
iic_write(0x20,0x01); //驱动能力增强P39
//亮度控制
//iic_write(0x2D,0x91); //关闭自动亮度控制P43
//开窗
/*
//开窗参数1 横竖各隔4采1
iic_write(0x17,0x56); //HS=0x3C
iic_write(0x18,0xCE); //HE=0xC8
iic_write(0x19,0x5D); //VS81
iic_write(0x1A,0x98); //VEBC
*/
//开窗参数2 横隔4采1 竖隔8采1
iic_write(0x17,0x5a); //HS 5a
iic_write(0x18,0xb4); //HE b4
iic_write(0x19,0x38); //VS 20
iic_write(0x1A,0x98); //VE
//iic_write(0x24,0x20); //白色比例
//iic_write(0x25,0x2d); //黑色比例
}
//PWM模块初始化
void init_PWM(void){
PWME=0;
/*舵机使用PWM45级联*/
PWMCTL_CON45=1; //级联PWM45
PWMCLK_PCLK5=1; //PWM5选择SA为时钟源
PWMPRCLK_PCKA=0; //A时钟预分频0;分频4
PWMSCLA=4; //即1/3us
PWMPOL_PPOL5=1; //PWM5输出先高后低
PWMPER45=30000; //100Hz
PWMDTY45=SERVO_MID; //舵机中心位置1.5ms高电平
PWME_PWME5=1; //启动PWM5
/*驱动电机使用PWM2和PWM3,目前仅使用PWM3*/
PWMCLK_PCLK2=1; //PWM2使用SB时钟
PWMCLK_PCLK3=1; //PWM3使用SB时钟
PWMPRCLK_PCKB=0; //B=Bus
PWMSCLB=128; //SB=B/64=384K 即4us
PWMPOL_PPOL2=1; //P2先低后低
PWMPOL_PPOL3=1; //P3先高后低
PWMPER2=0xff;
PWMPER3=0xff;
PWMDTY2=0x60;
PWMDTY3=0x00;
PWME+=0x0c; //同时使能PWM23
}
//ECT模块初始化
void init_ECT(void){
TIOS_IOS0=0; //PT0 PT1口进行输入捕捉
TIOS_IOS1=0;
TIOS_IOS2=1; //PT2进行输出比较,产生定时中断
TSCR2_PR=7; //M_clock分频128
PBCTL_PBEN=0; //PAC0\PAC1不级联
DLYCT=0x01; //延迟256个bus周期@24M=10us
TCTL4_EDG0A=0; //PT0口计采集行数
TCTL4_EDG0B=1; //PT0口检测下跳沿(HREF当前行结束后开始读数据)
PACN0=0; //清零
TCTL4_EDG1A=0; //PT1口测速
TCTL4_EDG1B=1; //PT1口检测下降沿
PACN1=0; //清零
ICPAR_PA1EN=1; //打开脉冲累加器
/*每650ms产生定时中断,取得车速信息*/
TC2=6553; //xxms
TIE_C2I=1; //允许PT4产生中断
TSCR1_TEN=0; //启动定时器
}
//初始化PortB
//PortB口管脚用途分布如下
//0: VSYN输入 <<
//1|2: 驱动板控制输出
//3: V_en视频使能输出
//4: LED_en光电管使能
//5: EF fifo空信号输入 <<
//6: R_en fifo读时钟输出
//7: FIFO_Reset fifo复位信号输出
void init_PB(void){
DDRB=0xff;
DDRB_BIT0=0; //VSYN输入
DDRB_BIT5=0; //EF input
PORTB_BIT1=0;
PORTB_BIT2=0; //关闭电机
PORTB_BIT3=0; //V_en关闭
PORTB_BIT4=0; //光电管关闭
PORTB_BIT6=1; //读fifo时钟维持高
PORTB_BIT7=1; //复位维持高
}
//初始化PortA
//PortA口 视频信号输入口 FIFO>>>MCU
void init_PA(void){
DDRA=0x00;
}
//初始化PortAD
//PortAD口 光电管数字量输入口
void init_PAD(void){
//ATD0DIEN=0xff; //把AD口作为数字输入使用
}
//空余io口组合成一个8位拨码开关,供输入参数使用
//从低到高分别为PP0-PP1 IOC2-IOC7
//PP7口作为输出口 控制LED
void init_IO(void){
//PP0 PP1为输入引脚
DDRP_DDRP0=0;
DDRP_DDRP1=0;
//IOC2-7为输入引脚
DDRT=0x00;
//PP7为输出引脚
DDRP_DDRP7=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -