飞思卡尔万能初始化函数

飞思卡尔万能初始化函数
飞思卡尔万能初始化函数

/*IQR.H */

/*Designed by chen binbin */

/*2011-1-26 18:39 */

/*单片机外部接收中断用于计数或处理*/

/*实时事件 */

#include /* common defines and macros */

#include

unsigned char IRQ_flag=0;

unsigned int IRQ_count=0;

/*中断初始化*/

void IRQ_Init(void)

{

IRQCR_IRQE=1; //1 下降沿触发中断,0 低电平有效

IRQCR_IRQEN=1;//使能IRQ 中断

}

//中断服务子函数

#pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt 6 IRQ_ISR(void)//PE1 接收中断

{

IRQ_flag=1;

IRQ_count++;

//IRQCR_IRQEN=0;//这两条指令共同作用清除中断标志

//IRQCR_IRQEN=1;//以响应下一次中断

}

/*PIT.H /

/*Designed by chen binbin */

/*2011-1-27 18:03 */

/*4 位内部定时器可产生准确的时间中断*/

/*用于处理特定时间下系统需求功能 */

#include /* common defines and macros */

#include

#define PITTIME0 10000//设定为20ms 定时

#define PITTIME1 20000//设定为40ms 定时

#define PITTIME2 30000//设定为60ms 定时

#define PITTIME3 40000//设定为80ms 定时

volatile uint count0=0,count1=0,count2=0,count3=0;

//定时器初始化

void PIT_Init(void)//定时中断初始化函数

{

//通道0 初始化,20ms 定时中断设置

//PITCFLMT_PITE=0; //定时中断通道关,4 个通道均关闭

PITCE_PCE0=1;//定时器通道0 使能

PITMUX_PMUX0=0;//0:8 位定时器0 与16 位定时器共同作用,需设定PITMTLD0 初值//1:8 位定时器1 与16 位定时器共同作用,需设定PITMTLD1 初值

PITMTLD0=160-1;//8 位定时器0 初值设定,80MHzBusClock 下为1us,设定一次即可//PITMTLD1=160-1;//8 位定时器1 初值设定,80MHzBusClock 下为2us,设定一次即可PITLD0=PITTIME0-1;//16 位定时器初值设定。time=PITTIME*0.001MS

PITINTE_PINTE0=0;//1 定时器中断通道0 中断使能

//PITCFLMT_PITE=1;//定时器使能,初始化一次即可

//通道1 初始化,40ms 定时中断设置

//PITCFLMT_PITE=0; //定时中断通道关,4 个通道均关闭

PITCE_PCE1=1;//定时器通道2 使能

PITMUX_PMUX1=0;//0:8 位定时器0 与16 位定时器共同作用,需设定PITMTLD0 初值

//1:8 位定时器1 与16 位定时器共同作用,需设定PITMTLD1 初值

//PITMTLD0=160-1;//8 位定时器初值设定,80MHzBusClock 下,为2us

PITLD1=PITTIME1-1;//16 位定时器初值设定。PITTIME*0.001MS

PITINTE_PINTE1=0;//1 定时器中断通道1 中断使能

//PITCFLMT_PITE=1;//定时器使能,初始化一次即可

//通道2 初始化,60ms 定时中断设置

//PITCFLMT_PITE=0; //定时中断通道关,4 个通道均关闭

PITCE_PCE2=1;//定时器通道2 使能

PITMUX_PMUX2=0;//0:8 位定时器0 与16 位定时器共同作用,需设定PITMTLD0 初值

//1:8 位定时器1 与16 位定时器共同作用,需设定PITMTLD1 初值

//PITMTLD0=160-1;//8 位定时器初值设定,80MHzBusClock 下,为2us

PITLD2=PITTIME2-1;//16 位定时器初值设定。PITTIME*0.001ms

PITINTE_PINTE2=0;//1 定时器中断通道2 中断使能

//PITCFLMT_PITE=1;//定时器使能,初始化一次即可

//通道3 初始化,80ms 定时中断设置

//PITCFLMT_PITE=0; //定时中断通道关,4 个通道均关闭

PITCE_PCE3=1;//定时器通道3 使能

PITMUX_PMUX3=0;//0:8 位定时器0 与16 位定时器共同作用,需设定PITMTLD0 初值

//1:8 位定时器1 与16 位定时器共同作用,需设定PITMTLD1 初值

//PITMTLD0=160-1;//8 位定时器初值设定,80MHzBusClock 下,为2us

PITLD3=PITTIME3-1;//16 位定时器初值设定。PITTIME*0.001ms

PITINTE_PINTE3=1;//1 定时器中断通道3 中断使能

PITCFLMT_PITE=1;//定时器使能,初始化一次即可

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区

void interrupt 66 PIT0(void)//定时器0 中断服务函数

{

count0++;

if(count0==50)

{

PORTA_PA0=~PORTA_PA0;//A0 LED 翻转,T=1S

count0=0;

}

PITTF_PTF0=1;//清中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区void interrupt 67 PIT1(void)//定时器1 中断服务函数

{

count1++;

if(count1==50)

{

PORTA_PA0=~PORTA_PA0;//A0 LED 翻转,T=2S

count1=0;

}

PITTF_PTF1=1;//清中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区void interrupt 68 PIT2(void)//定时器2 中断服务函数

{

count2++;

if(count2==50)

{

PORTA_PA0=~PORTA_PA0;//A0 LED 翻转,T=3S

count2=0;

}

PITTF_PTF2=1;//清中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区void interrupt 69 PIT3(void)//定时器3 中断服务函数

{

count3++;

if(count3==50)

{

PORTA_PA0=~PORTA_PA0;//A0 LED 翻转,T=4S

count3=0;

}

PITTF_PTF3=1;//清中断标志位

}

/*PWM.H */

/*Designed by chen binbin*/

/*2011-1-25 14:20 */

/*80Mhz 总线时钟下 */

/*输出10kHz 方波 */

#include /* common defines and macros */

#include "derivative.h" /* derivative-specific definitions */ //级联模式下,1,3,5,7 通道各控制寄存器起作用 //

//0,2,4,8 通道控制失效,但周期、占空比寄存器 //

//作为1、3、5、7 通道的高八位是有效的,要初始化//

//p1、p3、p5、p7 口输出10kHz 方波 //

void Init_pwm(void)

{

/* PWME:

PWME7=0,PWME6=0,PWME5=0,PWME4=0,PWME3=0,PWME2=0,PWME1=0,PWME0=0 */ PWME = 0x00;//禁止pwm 模块 /* Disable all PWM channels */

/* PWMPOL:

PPOL7=1,PPOL6=1,PPOL5=1,PPOL4=1,PPOL3=1,PPOL2=1,PPOL1=1,PPOL0=1 */ PWMPOL =0xff; //输出极性选择,PWM 先输出高电平,之后输出低电平

/* PWMCLK:

PCLK7=0,PCLK6=0,PCLK5=0,PCLK4=0,PCLK3=0,PCLK2=0,PCLK1=0,PCLK0=0 */ PWMCLK =0xff;//计数时钟选择寄存器,clock sA,clock sB

/* PWMCAE: CAE7=0,CAE6=0,CAE5=0,CAE4=0,CAE3=0,CAE2=0,CAE1=0,CAE0=0 */ PWMCAE = 0x00;//输出左对齐

/* PWMCTL: CON67=1,CON45=1,CON23=1,CON01=1,PSWAI=0,PFRZ=0 */

PWMCTL =240;//级联控制

/* PWMDTY7: BIT7=0,BIT6=0,BIT5=1,BIT4=1,BIT3=0,BIT2=0,BIT1=1,BIT0=0 */ PWMDTY7 = 150;//占空比寄存器

/* PWMPER7: BIT7=0,BIT6=1,BIT5=1,BIT4=0,BIT3=0,BIT2=1,BIT1=0,BIT0=0 */ PWMPER7 = 208;//通道周期寄存器,计数值100

/* PWMDTY6: BIT7=0,BIT6=0,BIT5=1,BIT4=1,BIT3=0,BIT2=0,BIT1=1,BIT0=0 */ PWMDTY6 = 0;//占空比寄存器

/* PWMPER6: BIT7=0,BIT6=0,BIT5=0,BIT4=0,BIT3=0,BIT2=0,BIT1=0,BIT0=0 */ PWMPER6 = 7;

/* PWMDTY5: BIT7=0,BIT6=0,BIT5=1,BIT4=1,BIT3=0,BIT2=0,BIT1=1,BIT0=0 */ PWMDTY5 = 90;//占空比寄存器

/* PWMPER5: BIT7=0,BIT6=1,BIT5=1,BIT4=0,BIT3=0,BIT2=1,BIT1=0,BIT0=0 */ PWMPER5 = 208;

/* PWMDTY4: BIT7=0,BIT6=0,BIT5=1,BIT4=1,BIT3=0,BIT2=0,BIT1=1,BIT0=0 */ PWMDTY4 = 0;//占空比寄存器

/* PWMPER4: BIT7=0,BIT6=0,BIT5=0,BIT4=0,BIT3=0,BIT2=0,BIT1=0,BIT0=0 */ PWMPER4 = 7;

/* PWMDTY3: BIT7=0,BIT6=0,BIT5=1,BIT4=1,BIT3=0,BIT2=0,BIT1=1,BIT0=0 */ PWMDTY3 = 150;//占空比寄存器

/* PWMPER3: BIT7=0,BIT6=1,BIT5=1,BIT4=0,BIT3=0,BIT2=1,BIT1=0,BIT0=0 */ PWMPER3 = 208;

/* PWMDTY2: BIT7=0,BIT6=0,BIT5=1,BIT4=1,BIT3=0,BIT2=0,BIT1=1,BIT0=0 */ PWMDTY2 = 0;//占__________空比寄存器

/* PWMPER2: BIT7=0,BIT6=0,BIT5=0,BIT4=0,BIT3=0,BIT2=0,BIT1=0,BIT0=0 */ PWMPER2 = 7;

/* PWMDTY1: BIT7=0,BIT6=0,BIT5=1,BIT4=1,BIT3=0,BIT2=0,BIT1=1,BIT0=0 */ PWMDTY1 = 150;//占空比寄存器

/* PWMPER1: BIT7=0,BIT6=1,BIT5=1,BIT4=0,BIT3=0,BIT2=1,BIT1=0,BIT0=0 */ PWMPER1 = 208;

/* PWMDTY0: BIT7=0,BIT6=0,BIT5=1,BIT4=1,BIT3=0,BIT2=0,BIT1=1,BIT0=0 */

PWMDTY0 = 0;

/* PWMPER0: BIT7=0,BIT6=0,BIT5=0,BIT4=0,BIT3=0,BIT2=0,BIT1=0,BIT0=0 */ PWMPER0 = 7;

/* PWMSCLA: BIT7=0,BIT6=0,BIT5=0,BIT4=0,BIT3=0,BIT2=1,BIT1=0,BIT0=1 */ PWMSCLA = 50;//clock A 10 分频

/* PWMSCLB: BIT7=0,BIT6=0,BIT5=0,BIT4=0,BIT3=0,BIT2=1,BIT1=0,BIT0=1 */ PWMSCLB = 50; //clock B 10 分频

/* PWMPRCLK: PCKB2=0,PCKB1=1,PCKB0=1,PCKA2=0,PCKA1=1,PCKA0=1 */ PWMPRCLK = 0x33;//预分频时钟选择寄存器,总线时钟8 分频10MHz

/* PWMSDN:

PWMIF=1,PWMIE=0,PWMRSTRT=0,PWMLVL=0,PWM7IN=0,PWM7INL=0,PWM7ENA=0

*/

//PWMSDN = 128;//

/* PWME:

PWME7=1,PWME6=1,PWME5=1,PWME4=1,PWME3=1,PWME2=1,PWME1=1,PWME0=1 */ PWME = 255; //使能pwm 模块 /* Enable only configured PWM channels */ }

/*SCI.H*/

#include /* common defines and macros */

#include "mc9s12xs128.h" /* derivative-specific definitions */

typedef unsigned char uchar

typedef unsigned int uint

uchar data;

//****SCI 初始化程序****************//

void SCI0_Init(void)

{

SCI0CR2=0X0c;

SCI0BDH=0X01; //写入波特率初值必须先写BDH 再写BDL

SCI0BDL=0Xa0;//SCI 波特率=SCI 模块时钟/(16*BR)(BR 为写入寄存器的值)

}

void SCI0_putchar(uchar ch)

{

while(!(SCI0SR1&0X40));//

SCI0DRL=ch;

}

#pragma CODE_SEG NON_BANKED

void interrupt SCI0_re(void)

{

while(SCI0SR1_RDRF!=1);

SCI0SR1_RDRF=1;

data=SCI0DRL;

}

//****SCI 初始化程序****************//

void SCI1_Init(void)

{

SCI1CR2=0X0c;

SCI1BDH=0X01; //写入波特率初值必须先写BDH 再写BDL

SCI1BDL=0Xa0;//SCI 波特率=SCI 模块时钟/(16*BR)(BR 为写入寄存器的值)

}

void SCI1_putchar(uchar ch)//发送字符

{

while(!(SCI0SR1&0X40));//

SCI0DRL=ch;

}

void Put_string(char ch[])//发送字符串

{

unsigned char ptr=0;

while(ch[ptr])

{

SCI0_putchar((uchar)ch[ptr++]);

}

//接收中断服务函数

}

#pragma CODE_SEG NON_BANKED

void interrupt SCI1_re(void)

{

while(SCI1SR1_RDRF!=1);

SCI1SR1_RDRF=1;

data=SCI0DRL;

}

//主函数流程

/*void main(void)

{

uchar

str[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x 0e,0x0f};

uchar i;

SetBusCLK_80M();

EnableInterrupts;

SCI0_Init();

while(1)

{

for(i=0;i<16;i++)

{

SCI0_putchar(str[i]);

delay(1000);

}

}

} */

/*ATD.H*/

/*Designed by chen binbin */

/*2011-1-26 16:50 */

/*Question:single mode sequence ?*/

/*单通道多次转换未调出 */

#include /* common defines and macros */

#include

//#define _8_bit_mode

#ifdef _8_bit_mode

unsigned char AD_value[8];

/*ATD 模块初始化*/

void ATD_Init(void)//8bit 模式

{

//八通道AD 循环采样配置如下

ATD0CTL1=0x00; //7:1-外部触发,65:00-8 位精度01-10 位精度,4:放电,3210:通道0 ATD0CTL2=0x40; //禁止外部触发, 中断禁止

ATD0CTL3=0xc0; //7:1 数据右对齐无符号,每次转换8 个序列, No FIFO, Freeze 模式下继续转

ATD0CTL4=0x17; //765: 采样时间为4 个AD 时钟周

期,ATDClock=[BusClock*0.5]/[PRS+1]=1MHz(BusClock=80MHz)

ATD0CTL5=0x30; //6:0 特殊通道禁止,5:1 连续转换0 单次转换 ,4:1 多通道轮流采样3210:第一通道指定

ATD0DIEN=0x00; //禁止数字输入

//使用一个通道采集配置如下

/*

ATD0CTL1=0x20; //7:1-外部触发,65:00-10 位精度,4:放电,3210:ch

ATD0CTL2=0x40; //禁止外部触发, 中断禁止

ATD0CTL3=0x88; //右对齐无符号,每次转换1 个序列, No FIFO, Freeze 模式下继续转

// ATD0CTL3=0xc0; //右对齐无符号,每次转换8 个序列, No FIFO, Freeze 模式下继续转ATD0CTL4=0x17; //765: 采样时间为4 个AD 时钟周

期,ATDClock=[BusClock*0.5]/[PRS+1]=1MHz(BusClock=80MHz)

ATD0CTL5=0x30; //6:0 特殊通道禁止,5:1 连续转换 ,4:1 多通道轮流采样

ATD0DIEN=0x00; //禁止数字输入

*/

}

void AD_Getvalue(unsigned char *AD_value)//8 位精度

{

//while(!ATD0STAT0_SCF);//全通道转换完成前等待

while(!ATD0STAT2_CCF0);//0 通道转换完成前等待

*AD_value=ATD0DR0L;

AD_value++;

while(!ATD0STAT2_CCF1);//0 通道转换完成前等待

*AD_value=ATD0DR1L;

AD_value++;

while(!ATD0STAT2_CCF2);//0 通道转换完成前等待

*AD_value=ATD0DR2L;

AD_value++;

while(!ATD0STAT2_CCF3);//0 通道转换完成前等待

*AD_value=ATD0DR3L;

AD_value++;

while(!ATD0STAT2_CCF4);//0 通道转换完成前等待

*AD_value=ATD0DR4L;

AD_value++;

while(!ATD0STAT2_CCF5);//0 通道转换完成前等待

*AD_value=ATD0DR5L;

AD_value++;

while(!ATD0STAT2_CCF6);//0 通道转换完成前等待

*AD_value=ATD0DR6L;

AD_value++;

while(!ATD0STAT2_CCF7);//0 通道转换完成前等待

*AD_value=ATD0DR7L;

}

#else

unsigned int AD_val[8];

/*ATD 模块初始化*/

void ATD_Init(void)

{

//八通道AD 循环采样配置如下

ATD0CTL1=0x20; //7:1-外部触发,65:00-8 位精度01-10 位精度,4:放电,3210:开始转换通道

ATD0CTL2=0x40; //禁止外部触发, 中断禁止

ATD0CTL3=0xc0; //7:1 数据右对齐无符号,每次转换8 个序列, No FIFO, Freeze 模式下继续转

ATD0CTL4=0x17; //765: 采样时间为4 个AD 时钟周

期,ATDClock=[BusClock*0.5]/[PRS+1]=1MHz(BusClock=80MHz)

ATD0CTL5=0x30; //6:0 特殊通道禁止,5:1 连续转换0 单次转换 ,4:1 多通道轮流采样3210:第一通道指定

ATD0DIEN=0x00; //禁止数字输入

//使用一个通道采集配置如下

/*

ATD0CTL1=0x20; //7:1-外部触发,65:00-10 位精度,4:放电,3210:ch

ATD0CTL2=0x40; //禁止外部触发, 中断禁止

ATD0CTL3=0x88; //右对齐无符号,每次转换1 个序列, No FIFO, Freeze 模式下继续转

// ATD0CTL3=0xc0; //右对齐无符号,每次转换8 个序列, No FIFO, Freeze 模式下继续转ATD0CTL4=0x17; //765: 采样时间为4 个AD 时钟周

期,ATDClock=[BusClock*0.5]/[PRS+1]=1MHz(BusClock=80MHz)

ATD0CTL5=0x30; //6:0 特殊通道禁止,5:1 连续转换 ,4:1 多通道轮流采样

ATD0DIEN=0x00; //禁止数字输入

*/

}

/*读取ad 转换结果*/

void AD_Getvalue(unsigned int *AD_val)//10 位精度{

//while(!ATD0STAT0_SCF);//全通道转换完成前等待while(!ATD0STAT2_CCF0);//0 通道转换完成前等待

*AD_val=ATD0DR0;

AD_val++;

while(!ATD0STAT2_CCF1);//0 通道转换完成前等待

*AD_val=ATD0DR1;

AD_val++;

while(!ATD0STAT2_CCF2);//0 通道转换完成前等待

*AD_val=ATD0DR2;

AD_val++;

while(!ATD0STAT2_CCF3);//0 通道转换完成前等待

*AD_val=ATD0DR3;

AD_val++;

while(!ATD0STAT2_CCF4);//0 通道转换完成前等待

*AD_val=ATD0DR4;

AD_val++;

while(!ATD0STAT2_CCF5);//0 通道转换完成前等待

*AD_val=ATD0DR5;

AD_val++;

while(!ATD0STAT2_CCF6);//0 通道转换完成前等待

*AD_val=ATD0DR6;

AD_val++;

while(!ATD0STAT2_CCF7);//0 通道转换完成前等待

*AD_val=ATD0DR7;

}

#endif

/*ECT.H*/

#include /* common defines and macros */ #include

//#define _capture_mode

//#define _compare_mode

#define _Acc_mode

/*Designed by chen binbin*/

/*2011-1-27 23:15 */

/*80Mhz 总线时钟下捕获脉冲*/

/*可用于测速,脉冲计数等 */

#ifdef _capture_mode

//ECT--捕获计数测试

unsigned int Input_counter=0;//声明计数变量

unsigned int counter_value[8];

//计数器初始化

void ECT_Init(void)

{

TIOS =0x00;//0-7,0:相应通道为输入捕捉,1:相应通道为输出比较

TSCR1=0x80;//定时器使能,TFFCA=1[bit4]访问计数寄存器可清除标志,[PRNT]bit3:0,预分频使能[TSCR2],1,精密预分频使能PTPSR.ALL bits 有效

TSCR2=0x01;//禁止定时器溢出中断,禁止复位,2-0bit 预分频系数为2[TSCR1 bit3 置0 有效]。80MHz 分得40MHz 时钟

//PTPSR=0X07;//精密分频系数设定,10 分频,TSCR1 bit3 置1 有效

TCTL3=0x55;//0-7 全部捕捉上升沿,EDGnB:EDGnA,0:0 停止捕捉

TCTL4=0x55;//0:1 上升沿捕捉,1:0 下降沿捕捉,1:1 上升下降沿都捕捉

TFLG1=0xff;//清中断标志位

TIE=0xff; //C7I—C0I 输入捕捉和输出比较通道中断使允许

}

//注意:TLFG1--主定时器中断标志 (TFLG1)控制8 个捕捉中断标志位,在各个中断中要手动清除

//写1 清除标志,写0 无效,可一次全部清除TLFG1=0XFF;

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区

interrupt 8 void PT_IC0(void) //通道0

{

counter_value[0]=TC0;//读取当前计数值,可用于脉冲间隔时间计算

//TSCR1 的TFFCA 位置位时,访问TCx 可清FLAG1

Input_counter++;

PORTA_PA0=~PORTA_PA0;//A 口led 翻转

TFLG1_C0F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区

interrupt 9 void PT_IC1(void) //通道1

{

counter_value[1]=TC1;//读取当前计数值,可用于脉冲间隔时间计算

Input_counter++;

PORTA_PA0=~PORTA_PA0;//A 口led 翻转

TFLG1_C1F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区

interrupt 10 void PT_IC2(void) //通道2

{

counter_value[2]=TC2;//读取当前计数值,可用于脉冲间隔时间计算

Input_counter++;

PORTA_PA0=~PORTA_PA0;//A 口led 翻转

TFLG1_C2F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 11 void PT_IC3(void) //通道3

{

counter_value[3]=TC3;//读取当前计数值,可用于脉冲间隔时间计算Input_counter++;

PORTA_PA0=~PORTA_PA0;//A 口led 翻转

TFLG1_C3F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 12 void PT_IC4(void) //通道4

{

counter_value[4]=TC4;//读取当前计数值,可用于脉冲间隔时间计算Input_counter++;

PORTA_PA0=~PORTA_PA0;//A 口led 翻转

TFLG1_C4F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 13 void PT_IC5(void) //通道5

{

counter_value[5]=TC5;//读取当前计数值,可用于脉冲间隔时间计算Input_counter++;

PORTA_PA0=~PORTA_PA0;//A 口led 翻转

TFLG1_C5F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 14 void PT_IC6(void) //通道6

{

counter_value[6]=TC6;//读取当前计数值,可用于脉冲间隔时间计算Input_counter++;

PORTA_PA0=~PORTA_PA0;//A 口led 翻转

TFLG1_C6F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 15 void PT_IC7(void) //通道7

{

counter_value[7]=TC7;//读取当前计数值,可用于脉冲间隔时间计算Input_counter++;

PORTA_PA0=~PORTA_PA0;//A 口led 翻转

TFLG1_C7F=1;//清相应通道中断标志位

}

#endif

/*Designed by chen binbin */

/*2011-1-28 11:11 */

/*80MHz 下比较输出,可输出方波*/

/*最大20MHz,或指定高低电平 */

/*也可与输出引脚断开产生内部 */

/*定时中断信号 */

#ifdef _compare_mode

//ECT 输出比较测试

//输出方波,理论值1MHz,实测1.9MHz

void ECT_Init(void)

{

TIOS=0XFF;//0-7channel 为输出比较

//CFORC=0XFF;//强制比较输出,优先级7-0 递减

TSCR1=0x88;//定时器使能,[PRNT]bit3:0,预分频使能[TSCR2],1,精密预分频使能PTPSR.ALL bits 有效

TSCR2=0x08;//禁止定时器溢出中断,bit3:1 允许复位,2-0bit 预分频系数为2[TSCR1 bit3 置0 有效]。

//通道7 比较成功后,自由计数器复位。80MHz 分得40MHz 时钟

PTPSR=0X00;//精密分频系数设定,10 分频,TSCR1 bit3 置1 有效

OC7M=0X00;//输出比较7 屏蔽寄存器,当TIOS[6:0]设置为输出比较时,7-0:0 输出

//把OC7M[6:0]置位相应端口设置为输出,通道7 输出比较优先级最高,比较

成功后

//可以覆盖0-6,每个在OC7M 置位的通道的比较,都反映了OC7D 寄存器相应

位的状态

//将bit7 置0 不覆盖,及其他端口不受bit7 控制,否则输出跟随OC7D 状态改

OC7D=0XFF;//输出比较7 数据寄存器

TC0=20;//设置输出比较的计数值

TC1=20;//在输入捕获模式下只读,写入无效

TC2=20;//比较成功后要重新赋值

TC3=20;//通过改变计数值产生不同频率的方波

TC4=20;//也可通过两个比较输出产生频率一定

TC5=20;//占空比可调的PWM 波

TC6=20;//

TC7=20;//

TCTL1=0X55;//比较结果输出动作设置OMn:OLn,0:0 定时器与输出引脚逻辑断开,输出

比较可用来产生内部定时信好

TCTL2=0X55;//0:1 翻转OCn 引脚输出电平,1:0,OCn 引脚输出低电平,1:1,OCn 引脚输出高电平

//为使该设置被相应OC7M 相应位必须清零

TTOV =0X00;//禁止溢出触发输出比较

TFLG1=0xff;//清中断标志

TIE=0xff; //C7I—C0I 输入捕捉和输出比较通道中断允许

}

//注意:TLFG1--主定时器中断标志 (TFLG1)控制8 个捕捉中断标志位,在各个中断中要手动清除

//写1 清除标志,写0 无效,可一次全部清除TLFG1=0XFF;

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 8 void PT_IC0(void) //通道0

{

TC0=21;//比较成功后重新赋值

TFLG1_C0F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 9 void PT_IC1(void) //通道1

{

TC1=21;//比较成功后重新赋值

TFLG1_C1F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 10 void PT_IC2(void) //通道2

{

TC2=21;//比较成功后重新赋值

TFLG1_C2F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 11 void PT_IC3(void) //通道3

{

TC3=21;//比较成功后重新赋值

TFLG1_C3F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 12 void PT_IC4(void) //通道4

{

TC4=21;//比较成功后重新赋值

TFLG1_C4F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 13 void PT_IC5(void) //通道5

{

TC5=21;//比较成功后重新赋值

TFLG1_C5F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 14 void PT_IC6(void) //通道6

{

TC6=21;//比较成功后重新赋值

TFLG1_C6F=1;//清相应通道中断标志位

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区interrupt 15 void PT_IC7(void) //通道7

{

TC7=20;//比较成功后重新赋值

TFLG1_C7F=1;//清相应通道中断标志位

}

#endif

/*Designed by chen binbin */

/*2011-1-28 11:11 */

/*80MHz 下 */

/*脉冲累加器A,16 位级联模式, */

#ifdef _Acc_mode

//外部脉冲计数测试,上升沿触发成功

//下降沿触发未通过测试

//计数模式无须自由定时器

unsigned int Acc_counter=0;

void ECT_Init(void)//PT7 作为输入引脚

{

//TSCR1=0x90;//定时器使能,定时器标志快速清除,[PRNT]bit3:0,预分频使能[TSCR2], //1,精密预分频使能PTPSR.ALL bits 有效

//TSCR2=0x01;//禁止定时器溢出中断,禁止复位,2-0bit 预分频系数为2

//[TSCR1 bit3 置0 有效]。80MHz 分得40MHz 时钟

PACTL_PAEN=1;//16 位的脉冲累加器A 使能

PACTL_PAMOD=0;//0 事件计数模式,1 门控计时累加模式

PACTL_PEDGE=1;//PAMOD=0 时,0 下降沿触发,1 上升沿触发

PACTL_CLK1=0;//0:0 定时器时钟使用预分频因子定义的时钟

PACTL_CLK0=0;//0:1PACLK,1:0PACLK/256,1:1PACLK/65536

PACTL_PAOVI=0;//0 脉冲累加器A 溢出中断禁止,1 如果PAOVF 被置位则产生中断

PACTL_PAI=0;//0 禁止输入中断,1 如果PAIF 被置位则产生中断

//若允许中断,可通过置位清除标志,也可用快速清除法

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区

interrupt 18 void PAI_IC7(void) //输入中断处理

{

PORTA_PA0=~PORTA_PA0;//A0.LED 翻转

Acc_counter=PACNT;

}

#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区

interrupt 17 void PAOVI_IC7(void) //计数溢出中断处理函数

{

PORTA_PA0=~PORTA_PA0;//A 口led 翻转

}

#endif

/*SYSTEMINIT.H*/

#include

#include

//*****总线时钟设定PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)***// //******fPLL=PLLCLK/2/POSTDIV************

//********fBUS=fPLL/2********************

//***********POSTDIV 一般为零,此时fPLL=PLLCLK***********// void SetBusCLK_80M(void)

{

CLKSEL=0X00; //disengage PLL to system

PLLCTL_PLLON=1; //turn on PLL

SYNR =0xc0 | 0x09;

REFDV=0x80 | 0x01;

POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;

_asm(nop); //BUS CLOCK=80M

_asm(nop);

while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it; CLKSEL_PLLSEL =1; //engage PLL to system;

}

void PortInit(void)

{

DDRA=0XFF;

PORTA=0X00;

DDRT=0X00;

}

void System_Init(void)

{

SetBusCLK_80M();

PortInit();

}

飞思卡尔单片机各种问题汇结

飞思卡尔问题汇结 一、flash/EEPROM的操作 Tips: a、HC08系列MCU中,很多Monitor ROM中固化了对flash操作的函数,用户只需调用即可,参考AN2874等应用笔记 b、HCS08系列和HCS12系列MCU对flash的操作十分类似,可以参考 AN2140 1、FLASH操作函数 (HCS08系列) https://www.360docs.net/doc/566033084.html,/dispbbs.asp?boardID=3&RootID=111907&ID= 111907 2、如何将flash中的程序copy至ram中 https://www.360docs.net/doc/566033084.html,/dispbbs.asp?boardID=3&RootID=104074&ID= 104074 3、S12内部寄存器的映射

https://www.360docs.net/doc/566033084.html,/dispbbs.asp?boardID=3&RootID=103261&ID= 103261 4、S12EEPROM的使用、 INITRG,INITRM,INITEE寄存器的说明https://www.360docs.net/doc/566033084.html,/dispbbs.asp?boardID=3&RootID=102260&ID= 102260 5.INITRM寄存器的使用 https://www.360docs.net/doc/566033084.html,/dispbbs.asp?boardID=3&RootID=103214&ID= 103214 二、编程技巧 Tips: a、一般Codewarrior用引导生成工程的话,器件的头文件中都定义好了各个位,C语言编程只需找到对应的位进行操作即可 b、用户自定义变量进行位操作,可以参考Codewarrior的格式 1、CW位操作定义结构 https://www.360docs.net/doc/566033084.html,/dispbbs.asp?boardID=3&RootID=87784&ID=8 7784

飞思卡尔单片机LED控制例程详解

我的第一个LED程序 准备工作: 硬件:Freescale MC9S08JM60型单片机一块; 软件:集成开发环境codewarrior IDE; 开发板上有两个LED灯,如下图所示: 实验步骤: 1.首先,确保单片机集成开发环境及USBDM驱动正确安装。其中USBDM的安装步骤如下:?假设之前安装过单片机的集成开发环境6.3版本:CW_MCU_V6_3_SE; ?运行USBDM_4_7_0i_Win,这个程序会在c盘的程序文件夹下增加一个目录C:\Program Files\pgo\USBDM 4.7.0,在这个目录下: 1〉C:\ProgramFiles\pgo\USBDM 4.7.0\FlashImages\JMxx下的文件 USBDM_JMxxCLD_V4.sx是下载器的固件文件; 2〉C:\Program Files\pgo\USBDM 4.7.0\USBDM_Drivers\Drivers下有下载器的usb 驱动 所以在插入usb下载器,电脑提示发现新的usb硬件的时候,选择手动指定驱动 安装位置到以上目录即可。 ?运行USBDM_4_7_0i_Win之后,还会在目录: C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.3\prog\gdi 下增加一些文件,从修改时间上来看,增加了6个文件,这些文件是为了在codewarrior 集成开发环境下对usb下载器的调试、下载的支持。

2.新建一个工程,工程建立过程如下: ?运行单片机集成开发环境codewarrior IDE ?出现如下界面 ●Create New Project :创建一个新项目工程 ●Load Example Project :加载一个示例工程 ●Load Previous Project :加载以前创建过的工程 ●Run Getting started Tutorial:运行CodeWarrior软件帮助文档 ●Start Using CodeWarrior:立刻使用CodeWarrior ?点击Create New project按钮,以创建一个新的工程,出现选择CPU的界面 如下,请选择HCS08/HCS08JM Family/MC9S08JM60,在右边的Connection窗口

飞思卡尔单片机编程

关于Codewarrior 中的 .prm 文件 网上广泛流传的一篇文章讲述的是8位飞思卡尔单片机的内存映射,这几天,研究了一下Codewarrior 5.0 prm文件,基于16位单片机MC9S12XS128,一点心得,和大家分享。有什么错误请指正。 正文: 关于Codewarrior 中的.prm 文件 要讨论单片机的地址映射,就必须要接触.prm文件,本篇的讨论基于Codewarrior 5.0 编译器,单片机采用MC9S12XS128。 通过项目模板建立的新项目中都有一个名字为“project.prm”的文件,位于Project Settings->Linker Files文件夹下。一个标准的基于XS128的.prm文件起始内容如下: .prm文件范例: NAMES END SEGMENTS RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;

READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF; ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF; //OSVECTORS = READ_ONLY 0xFF10 TO 0xFFFF; EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF; EEPROM_01 = READ_ONLY DATA_FAR IBCC_FAR 0x010800 TO 0x010BFF; EEPROM_02 = READ_ONLY DATA_FAR IBCC_FAR 0x020800 TO 0x020BFF; EEPROM_03 = READ_ONLY DATA_FAR IBCC_FAR 0x030800 TO 0x030BFF; EEPROM_04 = READ_ONLY DATA_FAR IBCC_FAR 0x040800 TO 0x040BFF; EEPROM_05 = READ_ONLY DATA_FAR IBCC_FAR 0x050800 TO 0x050BFF; EEPROM_06 = READ_ONLY DATA_FAR IBCC_FAR 0x060800 TO 0x060BFF; EEPROM_07 = READ_ONLY DATA_FAR IBCC_FAR 0x070800 TO 0x070BFF; PAGE_F8 = READ_ONLY DATA_FAR IBCC_FAR 0xF88000 TO 0xF8BFFF;

飞思卡尔16位单片机MC9S12XS128加密(程序下载不进去,正负极未短路,通电芯片不发烫)后解锁的方法及步骤w

飞思卡尔16位单片机MC9S12XS128加密(程序下载不进去,正负极未短路,通电芯片不发烫)后解锁的方法及步骤 /*****************************************************************************/ *本人用此法成功解救了4块板子【窃喜!】,此说明是本人边操作边截图拼成的,有些是在别的说明上直接截图【有些图本人不会截取,就利用现成的了,不过那也是本人用豆和财富值换来的】,表达不清之处还望见谅,大家将就着看吧!如能有些许帮助,我心甚慰!!! ————武狂狼2014.4.23 /*****************************************************************************/ 编译软件:CW5.1版本,下载器:飞翔BDMV4.6 【1】,连接好单片机,准备下载程序,单击下载按钮出现以下界面 或 (图1.1) 图 1.1——4中所有弹出窗口均单击“取消”或红色“关闭”按钮依次进入下一界面

(图1.2) (图1.3)

(图1.4) ******************************************************************************* ******************************************************************************* 【2】单击出现如下图所示下拉列表,然后单击 (图2.1) 出现下图(图2.2)对话框,按下面说明操作 (图2.2)

从飞思卡尔SafeAssure功能安全保障方案看汽车安全设计概要

从飞思卡尔SafeAssure功能安全保障方案看汽车安全设计 就在您阅读完本文不到十分钟的时间内,全球大概有超过二十人已经因为车祸离开这个世界,而其中大约有90%是来自像中国这样的发展中国家(数据参考世界卫生组织统计。汽车造福人类的同时,在全球科技空前发达的今天,因为交通事故带来如此重大的公共安全威胁不啻为人类的一大悲剧。从汽车诞生开始,人们就没有停止过对汽车安全驾驶的追求。最早的安全带以及后来的安全气囊等被动安全措施挽救了数千万人的生命,后来发展起来的ABS(防抱死制动系统、ESP(电子稳定程序、EBD(电子制动力分配系等主动安全功能让汽车安全性再次大大提高。但尽管如此,交通事故依然是最大非自然死伤原因之一。图1 世界卫生组织统计:全球每年因交通事故死亡130万人,并有5000万人受伤“随着系统复杂性的提高,以及软件和机电设备的大量应用,因为系统失效和随机硬件失效导致的交通事故风险也日益增加。因此,近年开始出现了新的汽车安全概念——安全性预测。”在近日召开的“2012产业和技术展望媒体研讨会”上,飞思卡尔亚太区汽车及工业解决方案事业部全球产品市场经理郗蕴侠(Yolanda博士指出,“安全性预测即汽车里的一些系统能实时检测故障,在故障发生之前就能预警防止故障发生,这就是当前大家倡导的汽车功能安全的概念。”为此,飞思卡尔推出了命名为“SafeAssure”的安全保障方案,旨在帮助系统制造商更加轻松地满足汽车和工业市场中的功能安全标准要求,并大大降低开发难度、缩短开发周期。图2 汽车安全系统的演变——基于安全性预测的功能安全出现从IEC61508到ISO 26262,看汽车功能安全演变 2011年11月推出ISO 26262之前,汽车行业遵照的功能安全标准是电子、电气及可编程器件功能安全基本标准IEC 61508。然而,作为一种通用基础安全标准,对于汽车行业的特殊性而言,该标准有很多的不足,特别是近年来汽车系统的复杂性日益增长的条件下。从IEC 61508派生出来的ISO 26262为当前汽车行业量身定制,特别是ISO 26262对于硬件研发、软件研发的要求适合于当前先进的汽车工业的实际现状。 ISO 26262标准根据安全风险程度对系统或系统某组成部分确定划分由A到D的安全需求等级(汽车安全完整性等级——ASIL,其中ASIL D级为最高等级,具有最苛刻的安全要求。对系统供应商而言,必须满足这些因为安全等级提高而提出的更高的设计要求。安全事件总是和通常的功能、质量相关的研发活动以及产品生产伴随在一起。ISO26262强调了研

飞思卡尔MC9S12XS128单片机中断优先级设置简易教程

本教程试图用最少的时间教你飞思卡尔XS128单片机的中断优先级设置方法和中断嵌套的使用,如果是新手请先学习中断的基本使用方法。 先来看看XS128 DataSheet 中介绍的相关知识,只翻译有用的: 七个中断优先级 每一个中断源都有一个可以设置的级别 高优先级中断的可以嵌套低优先级中断 复位后可屏蔽中断默认优先级为1 同一优先级的中断同时触发时,高地址(中断号较小)的中断先响应 注意:高地址中断只能优先响应,但不能嵌套同一优先级低地址的中断 下面直接进入正题,看看怎么设置中断优先级: XS128中包括预留的中断一共有128个中断位,如果为每个中断都分配一个优先级寄存器的话会非常浪费资源,因此飞思卡尔公司想出了这样一种办法:把128个中断分为16个组,每组8个中断。每次设置中断时,先把需要的组别告诉某个寄存器,再设置8个中断优先寄存器的某一个,这样只需9个寄存器即可完成中断的设置。 分组的规则是这样的:中断地址位7到位4相同的中断为一组,比如MC9SX128.h中 这些中断的位7到位3都为D,他们就被分成了一组。0~F正好16个组。

INT_CFADDR就是上面说到的用来设置组别的寄存器: 我们需要设置某个组别的中断时,只要写入最后8位地址就行了,比如设置SCI0的中断优先级,就写入0xD0。 设置好组别之后,我们就要该组中相应的中断进行设置,设置中断的寄存器为 这其实是一组寄存器,一共有8个,每个都代表中断组中的一个中断。对应规则是这样的:中断地址的低四位除以2 比如还是SCI0,低四位是6,除以二就是3,那么我们就需要设置INT_CFDATA3 往INT_CFDATAx中写入0~7就能设置相应的中断优先级了 拿我本次比赛的程序来举个例子:我们的程序中需要3个中断:PIT0,PORTH,SCI0。PIT0定时检测传感器数值,PORTH连接干簧管进行起跑线检测,SCI0接收上位机指令实现急停等功能。因此中断优先级要SCI0>PORTH>PIT0。 我们先要从头文件中找出相应中断的地址: PIT0【7:4】位为7,选择中断组: INT_CFADDR=0x70;

飞思卡尔单片机寄存器及汇编指令详解

附录I:寄存器地址列表 直接页面寄存器总结

高页面寄存器总结

非易失寄存器总结 注:直接页面寄存器表地址的低字节用粗体显示,直接寻址对其访问时,仅写地址低字节即可。第2列中寄存器名用粗体显示以区别右边的位名。有0的单元格表示未用到的位总是读为0,有破折号的单元格表示未用或者保留,对其读不定。

附录II 指令接与寻址方式 HCS08指令集概括 运算符 () = 括号种表示寄存器或存储器位置的内容 ← = 用……加载(读: “得到”) & = 布尔与 | = 布尔或 ⊕= 布尔异或 ×= 乘 ÷ = 除 : = 串联 + = 加 - = 求反(二进制补码) CPU registers A =>累加器 CCR =>条件代码寄存器 H =>索引寄存器,高8位 X => 索引寄存器,低8位 PC =>程序计数器 PCH =>程序计数器,高8位 PCL =>程序计数器,低8位 SP =>堆栈指针 存储器和寻址 M =>一个存储区位置或者绝对值数据,视寻址模式而定 M:M + 0x0001 => 两个连续存储位置的16位值.高8位位于M的地址,低8位位于更高的连续地址. 条件代码寄存器(CCR)位 V => 二进制补码溢出指示,第7位 H => 半进位,第4位 I => 中断屏蔽,第 3位 N => 求反指示器, 第2位 Z => 置零指示器, 第1位 C => 进/借, 第0位 (进位第 7位 ) CCR工作性符号 – => 位不受影响 0 = > 位强制为0 1 = > 位强制为1

= >根据运算结果设置或清除位 U = > 运算后没有定义 机器编码符号 dd =>一个直接寻址0x0000–0x00FF的低8位(高字节假设为0x00) ee => 16位偏移量的高8位 ff => 16位偏移量的低8位 ii => 立即数的一个字节 jj => 16位立即数值的高位字节 kk => 16位立即数值的低位字节 hh => 16位扩展寻址的高位字节 ll => 16位扩展寻址的低位字节 rr => 相对偏移量 n —任何表达范围在0–7之间的一个有符号数的标号或表达式 opr8i —任何一个表达8位立即值的标号或表达式 opr16 —任何一个表达16位立即值的标号或表达式 opr8a —任何一个表达一个8位值的标号或表达式.指令对待这个8位值为直接页面64K 字节地址空间(0x00xx)中地址的低8位. opr16a —任何一个表达16位值的标号或表达式.指令对待这个值为直接页面64K字节地址空间. oprx8 —任何一个表达8位无符号值的标号或表达式,用于索引寻址. oprx16 —任何一个16位值的标号或表达式.因为HCS08有一个16位地址总线,这可以为一个有符号或者无符号值. rel —任何指引在当前指令目标代码最后一个字节之后–128 to +127个字节之内的标号或表达式.汇编器会计算包括当前指令目标代码在内的8位有符号偏移量. 寻址方式 隐含寻址(Inherent)如CLRA,只有操作码,无操作数,需要操作的数据一般为CPU寄存器,因此不需要再去找操作数了。(INH) 立即寻址 (Immediate)如LDA #$0A,“$”表示16进制,此时操作数位于FLASH空间,与程序一起存放。(IMM) 直接寻址 (Direct)如 LDA $88,只能访问$0000-$00FF的存储器空间,指令短速度快; (DIR) 扩展寻址 (Extended)如果操作数地址超出了$00FF,自动为扩展寻址;(EXT) 相对寻址(Relative)如BRA LOOP,指令中一般给出8位有符号数表示的偏移量。(REL) 变址寻址 (Indexed) 采用[H:X]或SP作为指针的间接寻址方式。( IX )( IX1 )( IX2 ) 变址寻址 (Indexed) 1〉无偏移量:CLR ,X 简写(IX) 2〉无偏移量,指令完成后指针加1(H:X = H:X + 0x0001) ,简写(IX+)只用于指令MOV和CBEQ指令中;

飞思卡尔单片机问题总结

飞思卡尔单片机问题总结 常见问题回答精华列表 为了方便网友查询相关问题,特将常见问题精华帖整理归类 本帖不断更新,欢迎网友们给出建议 另外,在提问时,请在标题中选用具体问题的字眼避免使用请问某某、请教、紧急求助等作为标题。对于具体器件,可以直接把器件类型写上,比如HC08QY4等;对于具体技术,比如CAN/LIN/ZigBee等也直接写明,便于版主分类回答,也便于其他网友查询。 一、flash/EEPROM的操作 Tips: a、HC08系列MCU中,很多Monitor ROM中固化了对flash操作的函数,用户只需调用即可,参考AN2874等应用笔记 b、HCS08系列和HCS12系列MCU对flash的操作十分类似,可以参考 AN2140 1、FLASH操作函数 (HCS08系列)

https://www.360docs.net/doc/566033084.html,/dispbbs.asp?boardID=3&RootID=111907&ID= 111907 2、如何将flash中的程序copy至ram中 https://www.360docs.net/doc/566033084.html,/dispbbs.asp?boardID=3&RootID=104074&ID= 104074 3、S12内部寄存器的映射 https://www.360docs.net/doc/566033084.html,/dispbbs.asp?boardID=3&RootID=103261&ID= 103261 4、S12EEPROM的使用、 INITRG,INITRM,INITEE寄存器的说明https://www.360docs.net/doc/566033084.html,/dispbbs.asp?boardID=3&RootID=102260&ID= 102260 5.INITRM寄存器的使用 https://www.360docs.net/doc/566033084.html,/dispbbs.asp?boardID=3&RootID=103214&ID= 103214 二、编程技巧

飞思卡尔单片机复习题

复习题: 1.根据总线时钟频率会计算TCNT计数时钟周期的最大值?最小值?溢出周期最大值? 如:fbus=2.4576MHz,值分别为多少?若fbus=8MHz呢? 2.熟悉LED共阴极共阳字型码的计算。 3.熟悉A W60各输入输出端口功能。 4. 不带缓冲和带缓冲的PWM有什么差异性? 5.为什么要将某些寄存器名和寄存器位在头文件中进行宏定义? 6.简述中断的作用与处理过程。 7.AW60 MCU都有哪些中断源? 8.为了实现对键盘的编程,如何区分按键是否真正地被按下,还是抖动?如何处理重键问题? 9.为了实现对键盘的编程,如何识别键盘上的按键? 10.实现计数与定时的基本方法有哪些?比较它们的优缺点。 11.比较AW60定时器模块实现输出比较功能与PWM功能的异同点。 12.为什么要对采集的数据进行滤波,有哪些滤波方法? 13.什么是输出比较?主要用途是什么? 14.什么是中断?什么是中断向量?什么是中断向量地址?GP32一共有多少个中断源? 15.什么是LED静态扫描、LED动态扫描? 16.请描述键盘逐行逐列扫描法原理。判断是否有键按下通常有哪两种方法?各有何优缺点?17.键盘设计思路中是如何获取按键的行列位置信息的?以3*3键盘为例。 18.LED和LCD各有何特点? 19.什么是脉宽调制波?脉宽调制输出功能主要用途是什么? 20.微控制器的片外晶体振荡器的频率是不是越高越好?为什么? 21.简述定时接口的基本原理。 22.如果系统中需要9个按键,那么矩阵式键盘接口方案应如何设计?并编写键盘初始化子程序及读取键值子程序,键值存入A中,若无键按下,为$FF。 23.设计并编程:仿照本章给出的定时器1通道0输入捕捉中断里程,捕捉两路输入信号,分别用相应的指示灯指示。 24.使用中断方式,对通道0输入的模拟信号连续采样8次,送入缓冲区。 25.用AW60不带缓冲的输出比较功能产生周期约为1S的方波。设内部总线时钟频率为32.768KHz。26.根据P178页码图9-3硬件连接图,编写程序完成在四个8段数码管上显示8字循环的程序。27.根据P178页码图9-3硬件连接图,编写程序完成在四个8段数码管上的4个8段abcdefgh 轮流点亮。 28.编写一个子程序对T1CH0初始化,使T1CH0产生20ms定时中断,并编写T1CH0中断服务程序使PTC0输出周期为1S的方波。设fbus=8MHz。 29.复习所有的实验。 30.复习所有的例题、作业题。 题型:选择题(30分)、问答题(40分)、编程题(30分) 1

基于飞思卡尔单片机的智能汽车设计毕业设计(论文)

基于飞思卡尔单片机的智能汽车设计 摘要 本智能车系统设计以 MC9S12DG128B 微控制器为核心,通过一个CMOS 摄像头检测模型车的运动位置和运动方向,使用LM1881视频分离芯片对图像进行处理,用光电传感器检测模型车的速度并使用PID 控制算法调节驱动电机的转速和舵机的方向,完成对模型车运动速度和运动方向的闭环控制。为了提高智能车的行驶速度和可靠性,采用了自制的电路板,在性能和重量上有了更大的优势,对比了各种方案的优缺点。实验结果表明,系统设计方案可行 关键词:MC9S12DG128,CMOS 摄像头,PID

The Research of Small and Medium-sized Electric Machines in Fuan City Author:Yao fang Tutor:Ma shuhua Abstract Fujian Fuan City industry of electric motor and electrical equipment is the one of the most representative phenomenon of industry cluster in Fujian Province mechanical industry. Its output value of small and medium-sized electric machines accounts for 20% of the whole province’s electrical equipment indu stry. The output amount of small and medium-sized electric machines from this region takes up 1/3 of that of the whole nation. Fuan electric motor and electrical equipment industry plays a significant role in the development of local national economy, being considered to be the main growth point of local economy and called "the Chinese electric motor and electrical equipment city ". This paper launched a research on small and medium- sized electric machines in Fuan city from two angles. The first one inferred the situation of Fuan electric machine industrial cluster as well as the analysis of the temporary existed problems, and then propose a few of suggestions on the part of local government. The second part focus on the improvement of the competitiveness of Fuan electric machine enterprises, through the application of Michael Porter's Five Forces Model into the local industry of electric machine, consequently carried out some strategies local enterprises should take. Key Words: small and medium-sized electric machines, Five Forces Model, industrial cluster

飞思卡尔技术报告

K60模块分配 K60的简介,我们本次使用了以下模块。 1. FTM模块:K60中集成3个FTM模块,而今年我们选用两个B车进行追踪循迹。B车模使用单电机、单舵机,另外需要一个编码器。所以对3个FTM模块进行如下配置:FTM0用以产生300Hz PWM信号控制舵机,FMT1用以产生18.5KHz PWM信号控制电机,FTM2用以采集编码器数据。 2. 定时器模块:K60中有多个定时器模块,我们使用了其中2个。其一用以产生5ms 中断,处理相关控制程序。另一个用以超声波模块的计时。 3. SPI模块:我们使用了K60的一个SPI模块,用以和无线射频模块NRF24L01P通信。 4.外部中断:我们使用了三个外部中断。第一个是PORTA的下降沿中断,用以响应干簧管检测到磁铁。第二个是PORTD的跳变沿中断,用以响应超声波模块的输出信号。最后一个是PORTE的下降沿中断,用以响应NRF24L01P模块的相关操作。 数据采集算法 传感器是智能车的眼睛,它们给智能车循迹和追踪提供了必不可少的信息。因此,在智能车软件设计中必须保证数据采集算法的稳定性,同时兼顾其快速性。本车比赛,我们的智能车主要采集以下传感器的数据:电感传感器电路板、编码器、超声波、干簧管。下面主要详述超声波模块、电感传感器电路板的数据采集。 1 .超声波模块数据采集 我们使用的超声波模块的DO引脚输出50Hz的矩形波信号,通过高电平的时间向单片机传递数据。本超声波传感器的高电平时间为声波单程传输的时间,通过这个时间可计算出两车之间的距离。 我们使用外部中断和计时器结合的方式测量高电平时间。首先配置PORTD11为跳变沿中断。中断被触发时,如果PORTD11为高电平则开始计时,如果PORTD11为低电平则停止计时并记录时间间隔。 2. 电感传感器电路板的数据采集 电感传感器电路板通过输出电压的大小反应响应位置和方向的磁场强度。本次比赛中,我们使用了10个电感分布在6个不同位置,因此每个周期都要采集10路ADC数据,每路ADC数据采集32次进行平均滤波。K60芯片中有两路ADC模块,为了最大程度的减少采集数据的时间,我们采用两个ADC模块并行采集的方法。 首先,将10路ADC分为两组,第一组6个使用ADC0模块采集,第二组4个使用ADC1模块采集,两个ADC模块同时采集数据。以第一组为例,依次采集6路ADC 数据,循环32次。当两个ADC模块都完成任务时,ADC转换结束。最后进行平均滤波。 控制算法 1.定位算法 A.两个电感定位算法 在电磁组算法设计中,“差比和”(即用连个电感数据的差除以它们的和)是一个简单易用的定位算法,但是我们测量发现“差比和”算法得出的偏差距离用着较大非线性。如下图所示,其横轴为实际偏差(单位mm),其纵轴为“差比和”得出的偏差。可以发现,在实际偏差较小时,“差比和”算出的偏差变化较快,实际偏差较大时“差比和”算出的偏差变化较缓。

飞思卡尔单片机知识点

1、单片机组成:1> CPU 2> 存储器3>I/O ; 2、存储器包括2大类:ROM , RAM 3、标准ASCII码使用(1)个字节表示字符; 4、BCD码是用()进制表示的()的数据; 5、HCS08QG8的最小系统包括(电源电路,复位电路,下载口,(内部时钟)); 6、QG8管脚数量(16)、只能输入的是(PTA5)、只能输出的是(PTA4)、程序下载的是、接外部时钟的是; 7、QG8的管脚可以作为数字输入输出、也可以作为模拟输入,可以作为模拟输入的有(); 8、QG8管脚复用优先级最低的功能是(I/O); 9、QG8存储器配置中,不同资源的分界线……; 10、CPU寄存器有(A, HX, PC, CCR, SP); 11、可以执行位操作的地址范围(0X0000~0X005F); 12、有地址的寄存器分成了(3)块(0页,高页,非易失); 13、如何在C语言中定义常数(数据类型变量名;),如何指定变量的地址(数据类型变量名@ 地址;); 14、堆栈的管理者是寄存器(SP); 15、SP的复位缺省值是(0X00FF); 16、堆栈对数据的操作特点是(向上生长型:先压后涨、先减后弹); 17、堆栈一般在RAM的高地址区域还是低地址区域?高地址区 18、内部时钟源包括哪4大部分? 19、外部时钟分哪2大类;振荡器,整形外部时钟 20、内部时钟中FLL固定倍频(512倍频); 21、ICS的7种工作模式(FEI, FEE, FBI, FBILP, FBE, FBELP, stop); 22、ICS的内部参考时钟是可以校准、微调的,调整的寄存器名(ICSTRM);该寄存器的数值越大,输出时钟频率越(低); 23、FLASH是按页管理的,页大小(512)字节,每页分(8)行; 24、高页寄存器位于FLASH的最后一页的(第六行/0xFFB0~0xFFBF)位置; 25、FLASH的最后一页最后一行是(中断向量); 26、FLASH块保护寄存器(FPROT);块加密寄存器(FOPT);对应的非易失寄存器分别是(NVOPT, NVPROT); 27、FLASH操作的一般过程是(); 28、FLASH操作的有效命令有(空检查,字节编程,突发模式编程,页擦除,全部ROM 擦除); 29、记录程序运行状态的CPU寄存器是(CCR); 30、指令系统包括6大类指令,分别是(算术运算指令、数据传送指令、数据和位操作、逻辑运算、程序控制、堆栈处理); 31、寻址方式是指(CPU访问操作数和数据的方法); 32、寻址方式包括7大类16种,分别是: INH IMM DTR EXT IX,IX1,IX2,SP1,SP2,IX+,IX1+ REL IMD, DD,IX+D,DIX+ 33、8指令模板和6指令模板分别是(); 34、QG8是高电平复位还是低电平复位?低电平 35、QG8数据存储器RAM的大小为(512)字节; 36、上电复位期间将管脚(A4)设置为(低)电平可以进入调试模式 37、QG8的存储器结构为冯·诺伊曼还是哈佛结构?冯诺依曼

飞思卡尔硬件和部分软件部分笔记

常见稳压芯片和电路图 Modified by Taiyou 2011-1-27 硬件部分 一、总体模块框图 1、基本模块包括电源模块、测速模块、驱动模块、道路识别模块等,再加上调试模块部分,调试模块部分可单独设计,调试完后拆下,框图如下: 2、此外,还可以包括车速,车架速度、电池电压和舵机位置检测等电路,增加模型车运行参数检测,提高模型车控制性能,增加调试电路方便现场调试。下面的第二图为硬件模块与上面层的关系。 二、具体电路图 1、电源模块 主要包括以下几个部分的电源:

1)5V电压。主要为单片机、信号调理电路以及部分接口电路提供电源,电压要求稳定、 噪声小,电流容量大于500mA。 补充,一般在输出端并联一个大电容来解决稳定性问题 2)6V电压。主要是为舵机提供工作电压,实际工作时,舵机所需要的工作电流一般在几 十毫安左右,电压无需十分稳定。 3)7.2V电压。这部分直接取自电池两端电压,主要为后轮电机驱动模块提供电源。 4)12V电压。如果采用CCD/CMOS图像传感器来进行道路检测,则需要12V工作电压。 5)2V电压。为红外发光管提供工作电压,可以采用开关电源从电池降压而得,这样可以 提高红外检测电路的电源利用效率。需要根据红外发射管的参数确定该电压值。 补充,此电路为光电组所需电压,我们不需要。 除此之外,如果使用了其的芯片和传感器,它们的工作电压可能不在上述之内,还需要通过专门的稳压电路提供相应的工作电压。例如采用飞思卡尔公司的MC7260加速度传感器进行车轮打滑检测,该传感器需要3.3V的工作电压。 补充,由于今年增加了坡度的控制,我们队考虑了增加坡度检测方面的传感器。 降压稳压电路可以采用可以采用串联稳压可开关稳压两种芯片。开关稳压芯片的工作效率高,但有较高的电源噪声,耗电量比较大的电路适于采用开关稳压电路。例如采用大电流红外检测电路,由于红外发射管数量较多,总的消耗电流很大,采用开关电源将电池电压将至2V左右,作为红外发射管的工作电压,此时每个红外发射管工作时只需串联很小的限流电阻甚至不用串联电阻,采用这种方法,可大大提高电源利用效率。 稳压电路的设计需要简单可靠,在满足电压波动范围的要求下应尽量简化电路设计,例如舵机电源在4.5V~6V的范围内,电流100mA左右,可以从7.2V的电池电压通过串联两只硅二极管获得。此外,通过实验可发现,组委会所提供的舵机可以直接工作在7.2V的电压下,此时舵机的响应速度也会提高,所以可以直接使用电池电压作为舵机的电源。 如果采用CCD或CMOS摄像头作为道路传感器,它们工作电压在9~12V范围内,此工作电压高于电池的电压,需要借助于斩波升压电路获取,可以采用专门升压芯片进行设计,也可以利用单片机PWM输出端口控制大功率晶体管进行斩波升压。有些CMOS摄像头工作电压在6~9V之间,所以也可以直接使用电池电压提供电源,所以选择CMOS摄像头可以简化电源电路的设计。 消除电源中的噪声并减少电压波动,需要在各级电源模块中安装滤波电容,包括容量小的高频滤波电容以及大容量的电解电容。由于存在电机驱动,为了避免电机在启动和制动过程产生的冲击电流对电源的影响,应尽量加大电池两端的电容容量,但不要超过大赛规则允许的电容容量限制。 另一本书上的版本(2.5V、5V、6.5V、7.2V、12V): 1)采用稳压芯片LM2576将电源电压稳压到5V后,给单片机系统电路、车速检测

飞思卡尔S12系列寄存器和中断讲解

S12的输入/输入端口(I/O口) I/O端口功能 可设置为通用I/O口、驱动、内部上拉/下拉、中断输入等功能。 设置I/O口工作方式的寄存器有: DDR、IO、RDR、PE、IE和PS。 DDR:设定I/O口的数据方向。 IO :设定输出电平的高低。 RDR:选择I/O口的驱动能力。 PE:选择上拉/下拉。 IE:允许或禁止端口中断。 PS:1、中断允许位置位时,选择上升沿/下降沿触发中断;2、中断禁止时且PE有效时,用于选择上拉还是下拉。 I/O端口设置 1、A口、B口、E口寄存器 (1)数据方向寄存器DDRA、DDRB、DDRE DDRA、DDRB、DDRE均为8位寄存器,复位后其值均为0。 当DDRA=0、DDRB=0、DDRE=0 时A口、B口和E口均为输入口。 否则,A口、B口、E口为输出口。当DDRA、DDRB、DDRE的任何一 位置1时,则该位对应的引脚被设置为输出。 例如,将A口设置为输出口,则其C语言程序的语句为:DDRA=0xff;(2)A口、B口、E口上拉控制寄存器PUCR PUCR为8位寄存器,复位后的值为0。当PUPAE、PUPBE、PUPEE被设置为1时,A口、B口、E口具有内部上拉功能;为0时,上拉无效。当A口、B口、E口为地址/数据总线时,PUPAE和PUPBE无效。 (3)A口、B口、E口降功率驱动控制寄存器RDRIV RDRIV为8位寄存器,复位后的值为0,此时,A口、B口、E口驱动保持全功率;当RDPA、RDPB、RDPE为1时,A口、B口、E口输出引脚的驱动功率下降 (4)数据寄存器PORTA、PORTB、PORTE PORTA、PORTB、PORTE均为8位寄存器,复位后的值为0,端口引脚输出低电平;要使引脚输出高电平,相应端口对应位应该置1。 由于PE0是/XIRQ、PE1是IRQ,因此,PE0和PE1只能设置为输入。

飞思卡尔智能车比赛个人经验总结

先静下心来看几篇技术报告,可以是几个人一起看,边看边讨论,大致了解智能车制作的过程及所要完成的任务。 看完报告之后,对智能车也有了大概的了解,其实总结起来,要完成的任务也很简单,即输入模块——控制——输出。 (1)输入模块:各种传感器(光电,电磁,摄像头),原理不同,但功能都一样,都是用来采集赛道的信息。这里面就包含各种传感器的原理,选用,传感器电路的连接,还有传感器的安装、传感器的抗干扰等等需要大家去解决的问题。 (2)控制模块:传感器得到了我们想要的信息,进行相应的AD转换后,就把它输入到单片机中,单片机负责对信息的处理,如除噪,筛选合适的点等等,然后对不同的赛道信息做出相应的控制,这也是智能车制作过程中最为艰难的过程,要想出一个可行而又高效的算法,确实不是一件容易的事。这里面就涉及到单片机的知识、C语言知识和一定的控制算法,有时为了更直观地动态控制,还得加入串口发送和接收程序等等。 (3)输出模块:好的算法,只有通过实验证明才能算是真正的好算法。经过分析控制,单片机做出了相应的判断,就得把控制信号输出给电机(控制速度)和舵机(控制方向),所以就得对电机和舵机模块进行学习和掌握,还有实现精确有效地控制,又得加入闭环控制,PID算法。 明确了任务后,也有了较为清晰的控制思路,接下来就着手弄懂每一个模块。虽然看似简单,但实现起来非常得不容易,这里面要求掌握电路的知识,基本的机械硬件结构知识和单片机、编程等计算机知识。最最困难的是,在做的过程中会遇到很多想得到以及想不到的事情发生,一定得细心地发现问题,并想办法解决这些问题。 兴趣是首要的,除此之外,一定要花充足的时间和精力在上面,毕竟,有付出就会有收获,最后要明确分工和规划好进度。

飞思卡尔HC12系列单片机USBDM烧录操作指导

飞思卡尔HC12系列单片机USBDM烧录操作指导 步骤一 将USBDM烧录器连接到电脑的USB口,然后,双击桌面的“hiwave.exe”图标,出现图1的窗口。 图1 假如USBDM没有连接或者连接不良,会出现如下图2的窗口,关掉程序,检查连接,再启动程序,直到出现图1的窗口。

步骤二. 将USBDM连接到需要烧录的仪表上,点击图1的“OK”按钮,将窗口最大化,然后看显示器的右下角,见图3所示,有“ACKN SYNC STOPPED”,表示连接正常。假如出现图4的窗口,表示BDM没有和仪表连接上,检查下载线。点击Cancel按钮。直到出现图3的“ACKN SYNC STOPPED”状态。 图3 图4 步骤三 点击图5的菜单栏的“TBDML HCS12”,然后点击“Load”,出现目标文件选择的窗口。见图6

图6 选择烧录的目标文件,目标文件的后缀名为“.abs”, 这里举例 1:选择DM281HZ-V1.2.abs, 2:勾选Automatically erase and program into FLASH and EEPROM 3:不勾选V erify memory image after loading code,为了节省烧录时间,不勾选这个选项。 3: 勾选Run after successful load.(可以在程序烧完的时候,自动的运行程序,看仪表是否能工作,可以作为仪表的第一次粗测) 4:点击“打开” 5:等待烧录完成, 图7,正在擦除……

图8,正在编程…… 图8 6:如果在完成编程后,仪表没有自动的进入工作状态,有以下几种可能: a.仪表有问题 b.烧录时出现问题,这个问题可以通过配置烧录选项来排除,见图6, 可以勾选选项V erify memory image after loading code ,在编程后会进行程序校验,如果校验错误表示烧录出现问题,一般来说出现烧录错误的几率很小,但也不排除。为了在批量烧录的时候,节省时间,没有选择校验。 c.烧录文件选择错误 7:如果仪表正常,拔掉USBDM和仪表的下载线,直接换上新的仪表,重复步骤三。 给程序建立快捷方式,方便操作 由于hiwave.exe程序在桌面没有快捷方式,可以自己建立一个快捷方式。 1. 打开路径C:\Program Files\Freescale\CodeWarrior for S12(X) V5.0\Prog,找到“hiwave.exe”文件 (如果CodeWarrior不是安装在C盘,则请按照…Freescale\CodeWarrior for S12(X) V5.0\Prog 寻找。)2.在文件上点击右键选择“发送到”—选择“桌面快捷方式”,就可以在桌面看到一个“hiwave.exe”程 序文件的快捷图标。以后再启动程序的时候,只需点击桌面的这个图标即可。 图1

飞思卡尔智能车程序

Main.c #include /* common defines and macros */ #include /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12db128b" #include "define.h" #include "init.h" // variable used in video process volatile unsigned char image_data[ROW_MAX][LINE_MAX] ; // data array of picture unsigned char black_x[ROW_MAX] ; // 0ne-dimensional array unsigned char row ; // x-position of the array unsigned char line ; // y-position of the array unsigned int row_count ; // row counter unsigned char line_sample ; // used to counter in AD unsigned char row_image ; unsigned char line_temp ; // temperary variable used in data transfer unsigned char sample_data[LINE_MAX] ; // used to save one-dimension array got in interruption // variables below are used in speed measure Unsigned char pulse[5] ; // used to save data in PA process Unsigned char counter; // temporary counter in Speed detect Unsigned char cur_speed; // current speed short stand; short data; unsigned char curve ; // valve used to decide straight or turn short Bounds(short data); short FuzzyLogic(short stand); /*----------------------------------------------------------------------------*\ receive_sci \*----------------------------------------------------------------------------*/ unsigned char receive_sci(void) // receive data through sci { unsigned char sci_data; while(SCI0SR1_RDRF!=1); sci_data=SCI0DRL; return sci_data; } /*----------------------------------------------------------------------------*\ transmit_sci \*----------------------------------------------------------------------------*/ void transmit_sci(unsigned char transmit_data) // send data through sci { while(SCI0SR1_TC!=1); while(SCI0SR1_TDRE!=1);

相关文档
最新文档