飞思卡尔PIT定时中断程序和脉冲计数

合集下载

飞思卡尔寄存器使用

飞思卡尔寄存器使用

飞思卡尔寄存器使⽤PLLSEL:选定锁环位 1 选定锁相环时钟0 选定外部时钟PSTP:选定伪停⽌位伪停⽌模式下振荡器(⼯作1)/(停⽌0)SYSWAI:选定时钟停⽌位等待模式下系统时钟(停⽌1)/(继续⼯作0)ROAWAI:等待模式下降低振荡器放⼤倍数位1 等待模式下降低振荡器放⼤倍数0 等待模式下振荡器正常放⼤倍数PLLWAI:等待模式下锁相环停⽌⼯作位1等待模式下锁相环停⽌⼯作0等待模式下锁相环正常⼯作CWAI:等待模式下内核时钟停⽌⼯作位1 等待模式下内核时钟停⽌⼯作0 等待模式下内核时钟正常⼯作RTIWAI:等待模式下实时时钟停⽌⼯作位1 等待模式下实时时钟停⽌⼯作0 等待模式下实时时钟正常⼯作COPWAI:等待模式下看门狗时钟停⽌⼯作位1 等待模式下看门狗时钟停⽌⼯作0 等待模式下看门狗时钟正常⼯作CME:时钟监控使能位。

PLLON:锁相环电路使能位。

AUTO:⾃动带宽控制位 1 选择⾼频带宽控制0 选择低频带宽控制ACQ:⾃动带宽控制滤波器选择位(当AUTO=1时,该位⽆意义)。

PRE:CPU 伪停⽌状态时,实时中断(RT1)允许位。

PCE:CPU 虚拟停⽌时,看门狗(COP)允许位。

SCEM:⾃给时钟⽅式使能位,默认为1,探测到外部晶振停振时进⼊⾃给时钟模式,为0时,禁⽌⾃给时钟模式,探测到外部晶振停振时复位。

时钟合成寄存器SYNR读写Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0Read 0 0SYN5 SYN4 SYN3 SYN2 SYN1 SYN0 WriteVCOFRQ[1:0](BIT7 BIT6)控制压控振动器VCO的增益,默认值为00,VCO的频率与VCOFRQ[1:0]对应表如下所⽰:读写Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Read/Write REFFRQ1 REFFRQ0 REFDV5 REFDV4 REFDV3 REFDV2 REFDV1 REFDV0 REFFRQ[1:0]默认值为00,表⽰参考时钟频率在1~2MHZ之间,要求的参考时钟频率与REFFRQ[1:0]的设置值如下表如⽰:读写Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0ReadRTIF PORF 0LOCKIFLOCK TRACKSCMIFSCMWriteRTIF:实时中断(RTI)标志位 1 发⽣实时中断0 未发⽣实时中断PROF:上电复位标志位 1 发⽣上电复位0 未发⽣上电复位LOCKIF:锁相环中断标志位1 锁相环锁定位发⽣变化时,产⽣中断请求0 锁相环锁定位未发⽣变化LOCK:锁相环频率锁定标志,为1表⽰时钟频率已稳定,锁相环频率已锁定。

飞思卡尔MC9S12XS128单片机各模块使用方法及寄存器配置

飞思卡尔MC9S12XS128单片机各模块使用方法及寄存器配置

飞思卡尔MC9S12XS128单片机各模块使用方法及寄存器配置手把手教你写S12XS128程序--PWM模块介绍该教程以MC9S12XS128单片机为核心进行讲解,全面阐释该16位单片机资源。

本文为第一讲,开始介绍该MCU的PWM模块。

PWM 调制波有8个输出通道,每一个输出通道都可以独立的进行输出。

每一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器和两个可供选择的时钟源。

每一个P WM 输出通道都能调制出占空比从0—100% 变化的波形。

PWM 的主要特点有:1、它有8个独立的输出通道,并且通过编程可控制其输出波形的周期。

2、每一个输出通道都有一个精确的计数器。

3、每一个通道的P WM 输出使能都可以由编程来控制。

4、PWM 输出波形的翻转控制可以通过编程来实现。

5、周期和脉宽可以被双缓冲。

当通道关闭或PWM 计数器为0时,改变周期和脉宽才起作用。

6、8 字节或16 字节的通道协议。

7、有4个时钟源可供选择(A、SA、B、SB),他们提供了一个宽范围的时钟频率。

8、通过编程可以实现希望的时钟周期。

9、具有遇到紧急情况关闭程序的功能。

10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。

1、PWM启动寄存器PWMEPWME 寄存器每一位如图1所示:复位默认值:0000 0000B图1 PWME 寄存器每一个PWM 的输出通道都有一个使能位P WMEx 。

它相当于一个开关,用来启动和关闭相应通道的PWM 波形输出。

当任意的P WMEx 位置1,则相关的P WM 输出通道就立刻可用。

用法:PWME7=1 --- 通道7 可对外输出波形PWME7=0 --- 通道7 不能对外输出波形注意:在通道使能后所输出的第一个波形可能是不规则的。

当输出通道工作在串联模式时(PWMCTL 寄存器中的CONxx置1),那么)使能相应的16位PWM 输出通道是由PWMEx 的高位控制的,例如:设置PWMCTL_CON01 = 1,通道0、1级联,形成一个16位PWM 通道,由通道 1 的使能位控制PWM 的输出。

飞思卡尔16位单片机9S12XS128使用和程序

飞思卡尔16位单片机9S12XS128使用和程序

飞思卡尔16位单片机9S12XS128使用收藏最近做一个关于飞思卡尔16位单片机9S12XS128MAA的项目,以前未做过单片机,故做此项目颇有些感触。

现记录下这个艰辛历程。

以前一直是做软件方面的工作,很少接触硬件,感觉搞硬件的人很高深,现在接触了点硬件发现,与其说使用java,C#等语言写程序是搭积木,不如说搞硬件芯片搭接的更像是在搭积木(因为芯片是实实在在拿在手里的东西,而代码不是滴。

还有搞芯片内部电路的不在此列,这个我暂时还不熟悉)。

目前我们在做的这个模块,就是使用现有的很多芯片,然后根据其引脚定义,搭接出我们需要的功能PCB板,然后为其写程序。

废话不多说,进入正题。

单片机简介:9S12XS128MAA单片机是16位的单片机80个引脚,CPU是CPU12X,内部RAM 8KB,EEPROM:2KB,FLASH:128KB,外部晶振16M,通过内部PLL可得40M总线时钟。

9S12XS128MAA单片机拥有:CAN:1个,SCI:2个,SPI:1个,TIM:8个,PIT:4个,A/D:8个,PWM:8个下面介绍下我们项目用到的几个模块给出初始化代码1、时钟模块初始化单片机利用外部16M晶振,通过锁相环电路产生40M的总线时钟(9S12XS128系列标准为40M),初始化代码如下:view plaincopy to clipboardprint?/******************系统时钟初始化****************/void Init_System_Clock(){asm { // 这里采用汇编代码来产生40M的总线LDAB #3STAB REFDVLDAB #4STAB SYNRBRCLR CRGFLG,#$08,*//本句话含义为等待频率稳定然后执行下一条汇编语句,选择此频率作为总线频率BSET CLKSEL,#$80}}/******************系统时钟初始化****************/void Init_System_Clock(){asm { // 这里采用汇编代码来产生40M的总线LDAB #3STAB REFDVLDAB #4STAB SYNRBRCLR CRGFLG,#$08,*//本句话含义为等待频率稳定然后执行下一条汇编语句,选择此频率作为总线频率BSET CLKSEL,#$80}}上面的代码是汇编写的,这个因为汇编代码量比较少,所以用它写了,具体含义注释已经给出,主函数中调用此函数即可完成时钟初始化,总线时钟为40M.2、SCI模块初始化单片机电路做好了当然少不了和PC之间的通信,通信通过单片机串口SCI链接到PC 端的COM口上去。

飞思卡尔单片机中断

飞思卡尔单片机中断

在CW4.6环境下,中断编程主要有两种方式: 第一种是使用“interrupt‖关键字,―interrupt‖关键字是一个非标准ANSI-C的关键字,因此,它不能被所有ANSI-C编译器厂商所支持 。同样,对不同的编译器,interrupt‖关键字的用法可能会改变。“interrupt‖关键字同样会提示编译器下面的函数是一个中断服务例程。 例: void interrupt 20 SCI0_ISR(void); 其中,interrupt表示该函数为终端服务程序,后面的20表示中断号20,在这里SCI0的中断向量号就是20. 这种方法写起来非常简单,但是,在S12单片机实际使用中,中断号并没有在手册中给出,通常需要自己在中断向量表中从上往下 数出来,或者根据中断向量计算得到,很容易出错。 于是有了第二种方法: 在ISR程序之前,使用符号“#pragma TRAP_PROC‖,TRAP_PROC 提示编译器下面的函数是中断服务例程。编译器会用一个特 殊的中断返回指令来结束这个函数。 此时,中断函数的书写如下所示: #pragma TRAP_PROC void SCI0_ISR(void){ ...} 这时候编译器不知道这个ISR指向那个中断向量,我们需要在链接文件即:prm文件中指定之。 使用 VECTOR命令来实现中断向量与ISR程序的连接。 例:VECTOR 0 _Startup //这是系统默认prm文件中自带的,即复位后0号中断即复位中断的ISR为_Startup() 我们可以这样写: VECTOR 20 SCI0_ISR //指定中断号 或者 VECTOR ADDRESS 0xFFD6 SCI0_ISR //直接指定中断向量地址 注:使用#pragma TRAP_PROC与修改prm文件的方法,在中断服务子程序的结尾处必须要手动加入返回主程序的指令,包括取 出堆栈、中断返回两个步骤。 在S12单片机中,可以写作 asm { pula; rti;} 尾注: 两种方法所写的中断服务子程序必须被放在非分页存储区内,即non_blanked code seg. 其中一种常用的方法是在服务子程序前声明://下面代码放在NON_BANKED区 #pragma CODE_SEG NON_BANKED 在中断程序后声明://下面内容按默认放置 #pragma CODE_SEG DEFAULT Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale

5.3-PIT定时中断(数字秒表)

5.3-PIT定时中断(数字秒表)
递减计数器,用作精确计时。首先给计数器设定一个初值,每过一个总线周期,计数器进行
减一操作,当计数器减为0之后,触发中断,并再次载初值
连线:IRQ_A或者IRQ_B连接到IRQ上
实验中可将段选连接到PORTP,将片选连接到PORTT,连线关系如下:
12 11 10 9 8 7 6 5 4 3 2 1
~0xbf,~0x86,~0xdb,~0xcf,~0xe6,~0xed,~0xfd,~0x87,~0xff,~0xef};// 带小数点的0-9
const unsigned char WeiMa[]={0xf7,0xfb,0xfd,0xfe};
int ms,s,flag;
int status;//状态位 0表示启动秒表,1停止,2清零
{
PITTF_PTF0=1;
flag++;
if(flag==2) {
flag=0;
ms+=1;
if(ms==99) {
ms=0;
s+=1;
DDRT=0xff;
DDRP=0xff;
INIT_PLL();
LEDCPU_dir=0xff;
init_PIT();
IRQ_Init();
PITINTE_PINTE0=0; //关0通道定时器定时中断被使能
EnableInterrupts;
for(;;) {
status=1;
break;
case 1:
PITINTE_PINTE0=0; //关0通道定时器定时中断?
status=2;
break;
************************************************************/

飞思卡尔单片机中断

飞思卡尔单片机中断

中断嵌套与中断返回
中断嵌套处理
在中断处理过程中,如果再次触发其他中断,需要进行嵌套处理,确保每个中断都能得到及时响应。
中断返回
中断处理完成后,需要返回被中断的程序,继续执行后续操作。在返回过程中,需要注意恢复被中断 程序的现场状态。
04
中断应用实例
定时器中断
定时器中断概述
定时器中断的配置
定时器中断是由单片机内部的定时器产生 的中断,用于在设定的时间间隔内执行特 定的任务。
中断使能与中断屏蔽
中断使能
通过设置中断使能位,可以启用或禁用某个中断源的中断处理功能。
中断屏蔽
通过设置中断屏蔽位,可以禁止某些不希望处理的中断源产生中断。
03
中断处理程序
中断处理程序的编写
初始化中断向量表
根据需要,在程序中初始化中断向量表,以确定不同 中断源对应的处理函数。
编写中断处理函数
根据中断源的不同,编写相应的中断处理函数,实现 中断响应和处理。
硬件结构
01
02
03
中断控制器
中断控制器是单片机中断 系统的核心部件,负责管 理中断的响应、优先级和 向量。
中断源
中断源是指能够触发中断 的信号源,如定时器溢出 、串行通信接收到数据等 。
中断优先级和向量
中断优先级决定了中断的 优先级,而向量则是指中 断处理程序的入口地址。
中断源
定时器溢出
当定时器计数达到最大值时,会触发一个中断,用于定时器 溢出处理。
THANKS。
解决方法
解决中断丢失问题需要从以下几个方面入手:首先,检查中断优先级设置,确保优先级 正确且没有重叠;其次,优化ISR的编写,避免在ISR中执行耗时的操作,确保ISR简洁 高效;最后,如果问题依然存在,可以尝试在外部硬件上加装抗干扰措施,如滤波电容

飞思卡尔MC9S12单片机实验程序

飞思卡尔MC9S12单片机实验程序
DDRB=0xff; //B口用于输出脉冲值
PORTB=0xff; //led灯全暗
TIOS=0x00; //设置定时器通道0为输入捕捉
TSCR1=0x80; //定时器使能
TSCR2=0x01; //设置自由计数器2分频,且禁止定时器溢出中断
TCTL4=0x02; //捕捉器仅下降沿捕捉
TIE=0x01; //允许定时器通道0的中断
}
}
void main(void) {
DDRB=0xff;
PORTB=0x00;
for(;;)
{
fun();
}
}
SCI
#include <hidef.h>
#include <mc9s12db128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12db128b"
unsigned char pp=0xf0; //欲发送的数字
/*********串口初始化*********/
void init() {
DDRB=0xff;
PORTB=0xff; //开始led灯暗,即数据尚未接收
SCI0BD=52; //初始化波特率为9600
SCI0CR1=0x00; //八位无奇偶校验模式
SCI0CR2=0x2c; //接收中断允许
}
/**************写数据***********/
void interrupt 20 funck() {
unsigned char k;
k=read();
PORTB=~k;
}
SPI
不会,以后补充。
LED
#include <hidef.h> /* common defines and macros */

飞思卡尔万能初始化函数

飞思卡尔万能初始化函数

/*IQR.H *//*Designed by chen binbin *//*2011-1-26 18:39 *//*单片机外部接收中断用于计数或处理*//*实时事件 */#include <hidef.h> /* common defines and macros */#include<mc9s12xs128.h>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_BANKEDvoid 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 <hidef.h> /* common defines and macros */#include<mc9s12xs128.h>#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 位定时器初值设定。

飞思卡尔电机控制模块详解

飞思卡尔电机控制模块详解

M=2.一、关键点1、MC 模块驱动电机的PWM 波频率在20K 左右时效果比较好。

DITH 位等于0时,计算方法如下:DITH=1时,其中,左对齐和有对齐方式下 M=1,中间对齐是2、MC 模块定时计数器的中断最好禁止,如果开启,在相应的中断服务程序中至少要添加一条“清楚中断标志位”的指令。

3、电机控制模块共8个通道,每个通道有2个Pin 脚组成。

4、Fast 位控制精度,7位或者11位。

5、给周期寄存器写入数值,可启动 MC 计数器,写0关闭所有通道的计数器。

6、MCAM[1:0]写入0x00可关闭某个channel ,写入非零值不是启动MC 计数器,而是控制对齐方式。

为了精确周期寄存器的值应尽量大,Ftc 应尽量小。

二、寄存器寄存器讲解讲解讲解::1 MCCTL0 (Motor Controller Control Register 0)第7位保留;第6、5位是MCPRE[1:0]控制电机控制器定时计数器时钟f TC 预分频系数。

如下:第4位 MCSWAI 置1,等待模式中电机控制器正常运行,清0,在等待模式中电机控制模块时钟关闭。

第3位,FAST ,清0,电机控制器PWM 模块占空比寄存器分辨率设置为11位,置1,电机控制器PWM 模块占空比寄存器分辨率设置为7位。

第2位,DITH ,清零,电机控制器dith 特性禁止,置1电机控制器dith 特性使能。

第1位保留;第0位MCTOIF ,为1表示,电机控制模块定时计数器溢出;为0,表示自上次复位或清零以来,电机控制模块定时计数器没有发生溢出。

2 MCCTL1 (Motor Controller Control Register 1)第7位,RECIRC控制PWM波极性。

0表示—,1表示+ ;第6到第1位系统保留;第0位,MCTOIE,为0表示Motor Controller Timer Counter Overflow Interrupt禁止,为1标志使能。

XS128 PIT介绍(不错)

XS128 PIT介绍(不错)

飞思卡尔XS128系列(三)PIT后面仔细搜索,DG128和XS128区别还真的蛮大的,相对于平时使用来说,主要在ECT和AD这两块地方,像定时器模块这部分,查了很多资料,最后发现XS128没有DG128所具有的MDC 模数递减计数器模块,相对应的是PIT定时模块,还有比如没有了模糊指令的硬件支持,没有了i2c模块等等。

言归正传,开始讲PIT,讲PIT,我准备先简单讲讲寄存器,之前不讲主要是基本上买的到的书都是DG128的,里面关于IO口的寄存器和PWM的寄存器都是完全可以照搬的,而这一章的东西照搬是要出问题的。

核心内容就在这张图上:相信大家都明白总线的概念,在图中可以看到6个定时器模块,Micro Timer 0、Micro Timer 1、Timer 0、Timer 1、Timer 2、Timer 3,其中前两个是8位的,后四个是16位的。

从图中可以看出PIT模块是以总线时钟(Bus Clock)为基准时钟的,总线时钟通过8位Micro Timer 0和Micro Timer 1倍频形成两个基时钟,即Micro Timer Base 0和Micro Timer Base 1,这两个基时钟通过16位Timer给PIT提供时钟(通过寄存器PITMUX设置)。

原理讲完了,其实相对于PIT模块是一个24位的定时器(51单片机最多也就16位),这个计数范围还是蛮大的。

下面是一些寄存器的解释,解释完还是看代码吧。

S12PIT24B4CV1是一个模数递减计数器。

首先给计数寄存器设定一个初值,每经过一个总线周期,计数器进行一次减一操作,当计数器自减溢出时,触发中断。

因为总线周期是已知的,即可以通过计数器自减实现定时。

在XS128PIT模块中,需要用到得是如下几个寄存器。

1)、PIT Contorl and force Lad Micro TimerRegister(PITCFLMT)该寄存器用于PIT模块的使能设置和工作方式设置。

xs128单片机的简单定时中断

xs128单片机的简单定时中断

基于飞思卡尔xs128单片机的简单定时中断(PIT)2009-10-08 21:47:40刚开始接触这款单片机,由于看的书基本上都是以dg128为原型来讲解的,故很多东西都是按照dg128的情况来移植到xs128上的,导致出了很多错误。

像定时器模块这部分,查了很多资料,最后发现xs128没有dg128所具有的MDC模数计数器模块,相对应的是定时模块PIT,然后在网上疯狂的找了很多资料,总结下来,自己花了一晚上弄了个最最简单的定时中断程序,实现1秒钟LED灯的闪烁。

PIT说明:S12PIT24B4CV1是一个模数递减计数器。

首先给计数寄存器设定一个初值,每经过一个总线周期,计数器进行一次减一操作,当计数器自减溢出时,触发中断。

因为总线周期是已知的,即可以通过计数器自减实现定时。

在XS128PIT模块中,需要用到得是如下几个寄存器。

1)、PIT Contorl and force Lad Micro Timer Register(PITCFLMT)该寄存器用于PIT模块的使能设置和工作方式设置。

通常设置该寄存器中的PITE为即可,即PITCFLMT_PITE=1,使PIT使能。

2)、PIT Channel Enable Register(PITCE)该寄存器用于对PIT模块中的4个通道使能进行设置。

如果使用某个通道时,对对应位进行置一即可,即PITCE_PCEx=1,其中x代表通道序号,为0~3。

3)、PIT Micro Timer Load Register 0 to 1 (PITMTLD0-1)该寄存器用于设置PIT模块中的8位计数器初值,以实现24位的计数。

设定值为0到255范围。

4)、PIT Load Register 0 to 3(PITLD0-3)该寄存器用于设置PIT模块中的16位计数器初值,和8位计数器配合而成24位计数器。

设定值范围0-65535。

5)、PIT Multiplex Register(PITMUX)该寄存器对定时器通道的8位时基进行选择。

飞思卡尔中断设置方式

飞思卡尔中断设置方式

中断的关闭与开放开放MC56F8257中某个模块中断,通常需要开放总中断及模块中断来实现。

这两部分缺一不可,并且开放总中断在前,开放模块中断在后。

同理,关闭MC56F8257中某个模块中断,需要关闭总中断及模块中断来实现,先关闭模块中断,再关闭总中断;如果允许中断嵌套情况,不需关闭总中断。

开放MC56F8257总中断,通过清中断控制寄存器(INTC_CTRL)的INT_DIS位;关闭总中断,需置该位即可,具体代码如下:#define EnableInterrupt() INTC_CTRL&=~INTC_CTRL_INT_DIS_MASK#define DisableInterrupt() INTC_CTRL|=INTC_CTRL_INT_DIS_MASK开放或关闭模块中断,需设置模块内部的控制寄存器的相应位。

如开放QSCI模块的接收中断0,需置位QSCI控制寄存器1(QSCIx_CTRL1)中的RFIE位;关闭该中断,清RFIE 位即可,具体代码如下:#define EnableQSCIReInt(0) QSCI_C1(0)|=(QSCI1_CTRL1_RFIE_MASK)#define DisableQSCIReInt(0) QSCI_C1(0)&=(QSCI1_CTRL1_RFIE_MASK)中断优先级的设置DSP56800E内核支持5级中断:LP、0、1、2和3,其优先级别依次升高。

最低优先级LP只能由系统SWILP指令产生;0~2优先级用户可以编程设置,主要用于外设和外部中断请求;级别3是最高优先级且不可屏蔽。

具体设置某个中断源的中断优先级,可通过设置中断优先级寄存器(INTC_IPR0~INTC_IPR7)中的相应位。

如设置QSCI中断优先级,通过设置中断优先级寄存器(INTC_IPR2)中的QSCI0_RCV位实现,该位具体含义见表1所示。

从表1看出,QSCI中断可配置三个不同级别,即优先级0、1和2。

飞思卡尔单片机中断(一)2024

飞思卡尔单片机中断(一)2024

飞思卡尔单片机中断(一)引言:飞思卡尔单片机中断是一种重要的编程技术,它允许在程序执行过程中暂停当前任务,响应外部事件或触发条件,并执行预定的中断服务程序。

本文将介绍飞思卡尔单片机中断的基本概念和使用方法。

正文:一、中断的基本概念1. 中断的定义和作用2. 中断向量表的概念和作用3. 中断优先级的设置方法4. 中断服务程序的编写规范5. 中断相关的特殊寄存器和标志位二、中断的种类和触发方式1. 内部中断和外部中断的区别2. 边沿触发和电平触发的区别3. 外部中断的触发源选择方法4. 外部中断的初始化配置5. 中断使能和禁止的控制方法三、中断的编程方法1. 中断源的初始化与配置2. 中断服务程序的编写和触发3. 中断嵌套和优先级的处理方法4. 保存和恢复现场的操作5. 中断的屏蔽和清除方法四、中断应用实例1. 外部中断的按键检测与响应2. 定时器中断的使用与定时任务处理3. 串口通信中断的接收和发送处理4. ADC采样中断的数据处理与转换5. PWM输出中断的周期控制和占空比调节五、中断的注意事项和常见问题1. 中断与任务之间的协作与竞争关系2. 中断响应时间和延迟的优化方法3. 中断嵌套引起的问题和解决方案4. 中断服务程序的限制和要求5. 中断与低功耗模式的关系和影响总结:飞思卡尔单片机中断是一种强大的编程技术,它可以提高单片机系统的实时性和响应能力。

通过本文的介绍,我们了解到了中断的基本概念和使用方法,以及中断在各种应用场景中的应用实例。

在使用中断时,我们需要注意一些常见问题和注意事项,以确保系统的稳定性和可靠性。

飞思卡尔单片机中断(两篇)

飞思卡尔单片机中断(两篇)

引言概述飞思卡尔单片机中断是指在特定的条件下,单片机的运行被打断,转而执行特定的处理程序。

在飞思卡尔单片机的开发中,中断是非常重要的一部分,它可以提高系统的响应速度和实时性。

本文将详细介绍飞思卡尔单片机中断的相关知识。

正文内容一、中断的基本概念和原理1. 中断的定义:中断是指在特定的条件下,程序的执行被打断,转而执行事先定义好的处理程序。

2. 中断的分类:外部中断和内部中断。

外部中断是由外部设备引发的,例如按键、定时器等;内部中断是由单片机内部的某个事件引发的,例如指令执行完成、通信完成等。

3. 中断的触发方式:电平触发和边沿触发。

电平触发是指当外部信号保持一定电平时触发中断;边沿触发是指在信号的上升沿或下降沿触发中断。

二、飞思卡尔单片机中断的使用方法1. 中断的初始化:对中断控制寄存器进行设置,使能相应的中断源。

2. 中断的优先级设置:多个中断源同时触发时,可以通过设置优先级来确定执行顺序。

3. 中断服务程序的编写:根据不同的中断源,编写相应的中断服务程序,完成特定的处理。

4. 中断的开启和关闭:根据需要,可以在程序中开启或关闭特定的中断。

三、飞思卡尔单片机中断优化技巧1. 中断嵌套:可以在一个中断中触发另一个中断,提高系统的实时性和处理效率。

2. 临界区保护:在关键代码段加入关中断代码,保护临界区避免竞态条件的发生。

3. 中断延时处理:在某些特定情况下,需要延时处理中断,可以使用延时函数或软件延时方式实现。

四、飞思卡尔单片机中断的常见问题和解决方法1. 中断误触发问题:可能是由于外部干扰、软件错误等原因导致中断被误触发,可以通过加入滤波电路、改进软件设计等方式解决。

2. 中断处理时间过长问题:中断处理程序执行时间过长会导致系统响应变慢,可以通过优化中断程序、减少中断次数等方式解决。

3. 中断嵌套问题:如果中断嵌套层次太多,可能会导致系统死锁或无法预测的结果,可以通过合理设计中断嵌套层次、减少中断嵌套次数来解决。

飞思卡尔定时中断程序3

飞思卡尔定时中断程序3

2D64定时器中断和频率捕捉中断冲突问题一、首先大致功能:1:四路频率捕捉中断,要求可同时输入四路,也可任意输入一路、两路或者三路(10~2.5KHz)。

2、将捕捉到的频率通过四路PWM依次输出,要求实时、稳定、输入多少输出就为多少(误差:千分之二)。

3:定时器中断,1毫秒中断一次。

利用定时器屏蔽10Hz(100ms)以下的频率或者无频率输入时,置为0,屏蔽输出。

二、调试过程1、开始使用定时器中断和频率捕捉中断,频率捕捉中断开通方法:初始化四路全部开通,进入第一路捕捉中断,开通第二路捕捉中断,关闭第一路捕捉中断进入第二路捕捉中断,开通第三路捕捉中断,关闭第二路捕捉中断进入第三路捕捉中断,开通第四路捕捉中断,关闭第三路捕捉中断进入第四路捕捉中断,开通第一路捕捉中断,关闭第二路捕捉中断形成一个环状,只有当频率全部有输入时才能采集正常,有任意一路没有输入时都将停止中断的执行。

存在问题,当四路频率全部输入时,捕捉正常,但当只有一路或者两路或者三路输入时,能进入中断的那几路也只能响应一次中断。

程序如下:#pragma CODE_SEG __NEAR_SEG NON_BANKEDinterrupt void MDC_ISR() //定时器1ms中断一次{CpuCounter++; //工作指示灯计数器,500ms翻转一次if(ptflag0==1) //10Hz以下或者无输入时计数,进入捕捉中断标志和计数清零,中断结束时打开标志{ptcount0++;}if(ptflag1==1){ptcount1++;}if(ptflag2==1){ptcount2++;}if(ptflag3==1){ptcount3++;}if(ptcount0>100) //10Hz以下或者无输入时不允许输出 {ptcount0=0; //计数清零flagECT0=0; //标志清零fin1=0; //频率置为0PTH_PTH7=0; //指示灯熄灭PWME=PWME&0xfc; //不允许输出}if(ptcount1>100){ptcount1=0;flagECT1=0;fin2=0;PTH_PTH6=0;PWME=PWME&0xf3;}if(ptcount2>100){ptcount2=0;flagECT2=0;fin3=0;PTH_PTH5=0;PWME=PWME&0xcf;}if(ptcount3>100){ptcount3=0;flagECT3=0;fin4=0;PTH_PTH4=0;PWME=PWME&0x3f;}if(CpuCounter>=500) //处理器工作指示灯{cpuflag=1;CpuCounter=0;}MCFLG_MCZF=1;}interrupt void PT3_isr(){DisableInterrupts; //总中断关闭ptflag3=0; //清除无输入或者10Hz以下频率标志ptcount3=0; //清除无输入或者10Hz以下频率计数器TIE_C0I = 1; //开放ECT0局部中断TFLG1_C3F=1; //中断标志寄存器对C3F清零//newcount3=TC3; //读一次TCxif(TC3>TC3H){count3=TC3-TC3H;}else{count3=65535-TC3H+TC3;}if((count3>148)&&(count3<37450)) //10~2.5KHz有效,其余无效 {flagECT3=1; //输出标志置一PWME=PWME|0xc0; //允许输出}else //无效不允许输出{flagECT3=0; //输出标志清零fin4=0;PTH_PTH4=0;PWME=PWME&0x3f; //不允许输出}ptflag3=1; //打开无输入或者10Hz以下频率标志ptcount3=0; //清除无输入或者10Hz以下频率计数器 EnableInterrupts; //总中断开启TIE_C3I = 0; //关闭ECT3局部中断}interrupt void PT2_isr(){DisableInterrupts;ptflag2=0;ptcount2=0;TIE_C3I = 1; //开放ECT3局部中断TFLG1_C2F=1; //中断标志寄存器对C2F清零//newcount2=TC2;if(TC2>TC2H){count2=TC2-TC2H;}else{count2=65535-TC2H+TC2;}if((count2>148)&&(count2<37450)) //570 ->7hz{flagECT2=1;PWME=PWME|0x30;}else{flagECT2=0;fin3=0;PTH_PTH5=0;PWME=PWME&0xcf;}ptflag2=1;ptcount2=0;EnableInterrupts;TIE_C2I = 0; //关闭ECT2局部中断}interrupt void PT1_isr(){DisableInterrupts;ptflag1=0;ptcount1=0;TIE_C2I = 1; //开放ECT2局部中断TFLG1_C1F=1; //中断标志寄存器对C1F清零//newcount1=TC1;if(TC1>TC1H){count1=TC1-TC1H;}else{count1=65535-TC1H+TC1;}if((count1>148)&&(count1<37450)) //570 ->7hz {flagECT1=1;PWME=PWME|0x0c;}else{flagECT1=0;fin2=0;PTH_PTH6=0;PWME=PWME&0xf3;}ptflag1=1;ptcount1=0;EnableInterrupts;TIE_C1I = 0; //关闭ECT1局部中断}interrupt void PT0_isr(){DisableInterrupts;ptflag0=0;ptcount0=0;TIE_C1I = 1; //开放ECT1局部中断TFLG1_C0F=1; //中断标志寄存器对C0F清零//newcount0=TC0;if(TC0>TC0H){count0=TC0-TC0H;}else{count0=65535-TC0H+TC0;//溢出}if((count0>148)&&(count0<37450)) //570 ->7hz {flagECT0=1;PWME=PWME|0x03;}else{flagECT0=0;fin1=0;PTH_PTH7=0;PWME=PWME&0xfc;}ptflag0=1; //ptcount0=0;EnableInterrupts;TIE_C0I = 0; //关闭ECT0局部中断}#pragma CODE_SEG DEFAULTvoid main(void){InitPort();InitECT();InitPWM();InitMDC();EnableInterrupts;for(;;){if(cpuflag==1){PORTK_BIT1=~PORTK_BIT1;cpuflag=0;}siout(); //PWM输出show(); //显示函数}}//void InitMDC(void){MCCTL=0xEF;MCCNT=750; //定时1ms=750*16/(24/2) }//初始化ECTvoid InitECT(){TIOS=0; //0:设置为输入捕捉 1:设置为输出比较TFLG1=0xff; //定时器中断寄存器1 ,写1清零。

PIT(周期性中断时钟)

PIT(周期性中断时钟)

第十二章:1、简介:PIT是由一系列24位时钟组成,可以用于触发外围模块或者周期性中断2、寄存器:PITCFLMT:PIT Control and Force Load Micro Timer RegisterPITE:PITE位决定PIT模块是否使能,PITE=1使能,PITE=0不使能;若PITE=0,则PIT 模块不使能+PITTF寄存器中的中断标志位被清除,当PITE=1,独立时钟使能位设置PCE,启动递减时钟。

PIYSWAI:use in wait modePITFRZ:use in Freeze modePFLMT[1:0]:这两位只有在对应的micro timer活动和PITE=1时有效,写入1到PFLMT的对应位会将对应的8-bit micro timer load register装载入8-bit micro timer down-counter中。

写入0无反应,读该寄存器总返回0.。

Note: A micro timer force load affects all timer channels that use the corresponding micro time base不太懂…PITFLT: PIT Force Load Timer Register这些位仅在对应的定时通道(PCE=1)和PITE=1时有效,对应位写入1,将16-bit timer load register装载入16-bit timer down-counter中,写入0无效,任何时候读取返回0PITCE:PIT Channel Enable Register用于使能PIT通道0-3。

如果PCE被清除,对应的中断标志位PITTF寄存器也会被清除。

如果PITE=1,且PCEx=1,则对应的16位通道会载入初始计数值并开始递减计数PCEx=1,对应的通道使能;PCEx=0,禁止PITMUX: PIT Multiplex Register对应的16位时钟与micro time时基的关系PMUXx=0——对应的16位时钟与micro timer时基0一起计数PMUXx=1——对应的16位时钟与micro timer时基1一起计数不太明白…PITINTE:PIT Interrupt Enable RegisterPINTEx=1,对应定时器中断使能,PINTEx=0,对应定时器中断禁止PITTF:PIT Time-Out Flag Register当对应的16位递减时钟和所选择的8位micro timer递减到0时,PTFx=1,写入1可清除,写入0无效,如果标志位置位和清除发生在同一个时钟周期,标志位不能清除!!!若PIT 模块或者对应时钟通道被禁止,标志位被清除。

单片机飞思卡尔PIT模块.

单片机飞思卡尔PIT模块.

定时器简介 ——定时器的主要性能参数
位数 加1或是减1 时钟 重装载
周期中断定时器简介(PIT)
4路24位定时器, 每路可以分别 打开或关闭 1~2^24个总线 周期定时 产生中断信号
周期中断定时器寄存器
1、PIT控制寄存器及强制载入微定时器寄存器 PITCFLMT
地址:$0340
PITE:PIT模块使能位 0 禁止PIT 1 使能PIT PITSWAIT:等待模式PIT停止控制位 0 在等待模式下PIT正常运行 1 在等待模式下PIT时钟产生器停止 PITFRZ:冻结模式PIT计数器冻结控制位 0 在冻结模式下PIT正常运行 1 在冻结模式下PIT计数器失去作用 PFLMT[1..0]:PIT强制载入微定时器模数值控制位 1 相应的8位微定时器模数值被载入8位微定时器递减计数器中 0 强制载入无效
PIoid interrupt 66 PIT0(void) { vTmpPIT++; if(vTmpPIT==10) { PORTB=~PORTB;//输出取反 vTmpPIT=0; } PITTF_PTF0=1;//清中断标志位 }
主程序
void main(void) { pllclk(); initIOBoutput(); initPIT(); EnableInterrupts; for(;;) {} /* wait forever */
1 时钟频率已稳定,锁相环频率已锁定 0 时钟频率未稳定,锁相环频率未锁定
时钟产生器模块 ——寄存器
5、时钟选择寄存器(CLKSEL)
地址:$39
PLLSEL:选定锁相环位 1 Bus Clock=PLLCLK/2 0 Bus Clock=OSCCLK/2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三轴移动,不可能没有编码器,编码器的脉冲是把一个圆周分成若干等分,一般是几百到几十万。每转过一个角度,就输出一个脉冲。把编码器输出接到计数器上,输入160个脉冲就停止,这个脉冲才是计量运动位置的脉冲。不过注意,现在编码器一般都是双线四分精度输出,用两根信号线输出达到四倍精度。TI的DSP有一个四倍精度编码器输入接口,Freescale 的应该也有,你查查手册看看有没有相应的功能
REFDV=0x80 | 0x01;
//SYNR =1; //PLLCLK=2*fOSC*(SYNR + 1)/(REFDV + 1)
//REFDV=1;
POSTDIV=0x00; // 4:0, fPLLLeabharlann fVCO/(2xPOSTDIV)
// If POSTDIV = $00 then fPLL is identical to fVCO (divide by one).
该寄存器用于PIT模块的使能设置和工作方式设置。通常设置该寄存器中的PITE为即可,即PITCFLMT_PITE=1,使PIT使能。
2)、PIT Channel Enable Register(PITCE)
该寄存器用于对PIT模块中的4个通道使能进行设置。如果使用某个通道时,对对应位进行置一即可,即PITCE_PCEx=1,其中x代表通道序号,为0~3。
}
对PWM脉冲计数可能困难一些。因为计数器对脉冲宽度有一定要求,而PWM的脉冲占空比一般在0-100%之间可调,在占空比很低或者很高的时候计数都不准确。如果能够在PWM的脉宽中断服务程序里加上计数程序就准确了。但是对PWM脉冲计数并不能够告诉我们马达走了多远。因为同样一个PWM脉冲,脉宽比较宽的,马达会走得比较远,脉宽窄的,马达就走不了那么远。就算同样的脉宽,负载不同的时候马达转过的距离也不一样。所以用PWM脉宽的计数来计算马达走了多远是不可能的。
MCCTL = MCCTL|0X08 ; //把模数常数寄存器的值加载到模数计数器FLMC;
}
void main(void)
{
DisableInterrupts;
Start_PLL();
PACBInit();
MDCInit();
EnableInterrupts;
5)、PIT Multiplex Register(PITMUX)
该寄存器对定时器通道的8位时基进行选择。因为8位计数器只有两个,所以在将8位计数器和16位计数器连接时,可以选择不同的8位时基。
当设置为0时,对应通道选择时基0;置一时,对应通道选择时基1。
如PITMUX_PMUX0=1为通道0选择时基1。
PIT说明:
S12PIT24B4CV1是一个模数递减计数器。首先给计数寄存器设定一个初值,每经过一个总线周期,计数器进行一次减一操作,当计数器自减溢出时,触发中断。因为总线周期是已知的,即可以通过计数器自减实现定时。
在XS128PIT模块中,需要用到得是如下几个寄存器。
1)、PIT Contorl and force Lad Micro Timer Register(PITCFLMT)
飞思卡尔单片机定时器应用程序示例?
// 16位累加器测速程序(PACB累加器),PT0口输入脉冲
//每次记录脉冲时间可修改宏:TIME_INTER
//
///////////////////////////////////////////////////////////////////
PITLD0=PITTIME-1;//16位定时器初值设定。PITTIME*0.005MS
PITINTE_PINTE0=1;//定时器中断通道0中断使能
PITCFLMT_PITE=1;//定时器通道0使能
}
void main(void) {
/* put your own code here */
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区
void interrupt 66 PIT0(void)
{
count++;
if(count==200)
{
PORTB=~PORTB;//输出取反
count=0;
}
PITTF_PTF0=1;//清中断标志位
3)、PIT Micro Timer Load Register 0 to 1 (PITMTLD0-1)
该寄存器用于设置PIT模块中的8位计数器初值,以实现24位的计数。设定值为0到255范围。
4)、PIT Load Register 0 to 3(PITLD0-3)
该寄存器用于设置PIT模块中的16位计数器初值,和8位计数器配合而成24位计数器。设定值范围0-65535。
setbusclock();
PORTB_init();
PIT_init();
EnableInterrupts;
for(;;) {
_FEED_COP(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
代码如下:
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define PITTIME 1000//设定为5ms定时
该寄存器为溢出标志位,当某一通道的8位计数器和16位计数器递减到0时,该位置一。给改位写1则清除该标志位。
可以通过查询该位来判断定时是否完成。
程序中要注意的问题:
1、头文件derivative.h中包含为:
#include <MC9S12XS128.h>
#pragma LINK_INFO DERIVATIVE "MC9S12XS128"
#define TIME_INTER 1000 //1000个ms=1s
unsigned int Get_pulse;
void Start_PLL(void) //busCLK=32M
{
REFDV=0x01; // PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
6)、PIT Interrupt Enable Register(PITINTE)
该寄存器为中断使能寄存器,为不同的PIT通道中断使能。设定为0时,相应通道中断禁止。置一时,相应通道使能。
如PITINTE_PINTE0=1时,PIT通道0定时中断使能,当计数器递减溢出时,申请中断。
7)、PIT Time-Out Flag Register(PITTF)
_asm(nop); // BUS CLOCK=16M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
void PORTB_init(void)//IO口初始化,B口为输出
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
{
DDRB=0xFF;
PORTB=0x00;
}
void PIT_init(void)//定时中断初始化函数 5MS定时中断设置
{
PITCFLMT_PITE=0; //定时中断通道0关
PITCE_PCE0=1;//定时器通道0使能
PITMTLD0=160-1;//8位定时器初值设定,160分频,在32MHzBusClock下,为0.2MHz。即5us
for(;;)
{
}
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 26 MDC_ISR(void)
{
static unsigned int number_count;
MCFLG = 0x80;
这是Codewarrior5.0版本中的默认设置。
2、设置PLL时钟时SYNR和REFDV须按照给的程序当中来设置,若按照程序注释中来设置的话时钟将出现很大误差,原因我不知道,我是不断测试得到的。
3、具体的寄存器要根据给定的对应的头文件,不同的IDE版本中xs128的头文件可能不同,应根据实际情况来写。
MCCTL = 0Xe3; //允许中断,模数计数方式
//返回时重新加载所用的常数,分频常数为16
MCCTL = MCCTL|0X04; //模数计数器使能
MCCNT = 2000; //(1/32M)*16*2000= 1ms
uchar count=0;
void setbusclock(void) //32MHz 外部时钟16MHz
{
CLKSEL=0X00; // disengage PLL to system
PLLCTL_PLLON=1; // turn on PLL
相关文档
最新文档