飞思卡尔单片机中断
飞思卡尔S12G系列芯片Demo程序之【按键中断实验】
![飞思卡尔S12G系列芯片Demo程序之【按键中断实验】](https://img.taocdn.com/s3/m/f7c996da4128915f804d2b160b4e767f5bcf805a.png)
1、按键中断#include <hidef.h>#include "derivative.h"#define LED PORTA#defineLED_dirDDRA#define KEY1PTIJ_PTIJ0#define KEY2PTIJ_PTIJ1#define KEY3 PTIJ_PTIJ2#define KEY4PTIJ_PTIJ3#define KEY1_dirDDRJ_DDRJ0#define KEY2_dir DDRJ_DDRJ1#define KEY3_dir DDRJ_DDRJ2#define KEY4_dir DDRJ_DDRJ3unsigned char data=0x01;unsigned char direction=1; //设置灯亮的方向,0向左,1向右。
unsigned char time=5; //设置灯闪的速度。
/*************************************************************/ /* 延时函数*/ /*************************************************************/ void delay(unsigned int n){unsignedinti,j;for(j=0;j<n;j++)for(i=0;i<40000;i++);}/*************************************************************/ /* 初始化LED灯*/ /*************************************************************/ voidinit_led(void){LED_dir=0xff; //设置为输出LED=~data; //点亮LED1}/*************************************************************/ /* 初始化按键*/ /*************************************************************/ voidinit_key(void){KEY1_dir =0; //设置为输入KEY2_dir=0;KEY3_dir=0;KEY4_dir=0;PPSJ = 0x00; //极性选择寄存器,选择下降沿;PIFJ = 0x0f; //对PIFJ的每一位写1来清除标志位;PIEJ = 0x0f; //中断使能寄存器;}/*************************************************************/ /* 按键中断函数*/ /*************************************************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKEDinterrupt void PTJ_inter(void){if(PIFJ != 0) //判断中断标志{PIFJ = 0xff; //清除中断标志if(KEY1 == 0) //按键1按下{time-=1;if(time==0)time=1;}if(KEY2 == 0){time+=1;if(time>10)time=10;}if(KEY3 == 0)direction=0;if(KEY4 == 0)direction=1;}}#pragma CODE_SEG DEFAULT/*************************************************************/ /* 主函数*/ /*************************************************************/ void main(void){DisableInterrupts;init_led();init_key();EnableInterrupts;for(;;){delay(time);if(direction==1){data=data<<1; //左移一位if(data==0)data=0x01;}else{data=data>>1; //右移一位if(data==0)data=0x80;}LED = ~data;}}2、按键中断#include <hidef.h>#include "derivative.h"#define LEDCPU PORTD_PD3#define LEDCPU_dirDDRD_DDRD3unsigned char single = 0;/*************************************************************/ /* 初始化锁相环*/ /* 使用外部晶振:16MHz */ /* 设置总线频率:16MHz */ /*************************************************************/ void INIT_PLL(void){CPMUPROT=0x26; //解除时钟配置保护CPMUCLKS_PSTP = 0; //禁止PLLCPMUCLKS_PLLSEL = 1; //设置PLLCLK为系统时钟CPMUOSC_OSCE=1; //使能外部晶振CPMUSYNR=0x01; //SYNDIV的值为1,CPMUREFDIV = 0x81; //REFDIV的值为1CPMUPOSTDIV=0x00;CPMUPLL=0x10; //锁相环调频启用,用以减少噪音while(CPMUFLG_LOCK==0); //等待PLLCLK锁定CPMUPROT=0x01; //使能时钟配置保护}/*************************************************************//* 初始化实时中断*//*************************************************************/void INIT_RTI(void){CPMUPROT=0x26; //解除时钟配置保护CPMUCLKS_RTIOSCSEL = 1; //RTI时钟源为晶振时钟CPMUINT = 0x80; //使能实时中断CPMURTI = 0x6f; //设置实时中断的时间间隔为32.768ms,根据机器周期求得CPMUPROT= 0x01; //使能时钟配置保护}/*************************************************************//* 实时中断函数(声明中断函数)*//*************************************************************/#pragma CODE_SEG __NEAR_SEG NON_BANKED/*中断函数置于非分页区内,由于飞思卡尔16位单片机的中断向量是16位所以中断函数只有被置于非分页区内才能被寻址到,这就是第一行的作用*///#pragma主要作用是设定编译器状态,指示编译器完成一些特定动作interrupt void RTI_inter(void){if(CPMUFLG_RTIF == 1)CPMUFLG_RTIF = 1;single +=1;if (single==15){LEDCPU = ~LEDCPU;single = 0;}}#pragma CODE_SEG DEFAULT/*后续代码置于默认区内,由于单片机内部非分页区大小有限,非中断函数一般置于分页区内,最后一行即为此作用*//*************************************************************//* 主函数*//*************************************************************/void main(void){DisableInterrupts;INIT_PLL();INIT_RTI();LEDCPU_dir = 1;LEDCPU = 0;EnableInterrupts;for(;;){}}以上Demo程序已通过本人亲自验证,可实现相关功能,对代码中有疑问的朋友欢迎在主页区留言交流。
飞思卡尔单片机中断
![飞思卡尔单片机中断](https://img.taocdn.com/s3/m/0cdfc56e0b1c59eef8c7b4fa.png)
在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
飞思卡尔单片机中断
![飞思卡尔单片机中断](https://img.taocdn.com/s3/m/61791484d4bbfd0a79563c1ec5da50e2534dd156.png)
中断嵌套与中断返回
中断嵌套处理
在中断处理过程中,如果再次触发其他中断,需要进行嵌套处理,确保每个中断都能得到及时响应。
中断返回
中断处理完成后,需要返回被中断的程序,继续执行后续操作。在返回过程中,需要注意恢复被中断 程序的现场状态。
04
中断应用实例
定时器中断
定时器中断概述
定时器中断的配置
定时器中断是由单片机内部的定时器产生 的中断,用于在设定的时间间隔内执行特 定的任务。
中断使能与中断屏蔽
中断使能
通过设置中断使能位,可以启用或禁用某个中断源的中断处理功能。
中断屏蔽
通过设置中断屏蔽位,可以禁止某些不希望处理的中断源产生中断。
03
中断处理程序
中断处理程序的编写
初始化中断向量表
根据需要,在程序中初始化中断向量表,以确定不同 中断源对应的处理函数。
编写中断处理函数
根据中断源的不同,编写相应的中断处理函数,实现 中断响应和处理。
硬件结构
01
02
03
中断控制器
中断控制器是单片机中断 系统的核心部件,负责管 理中断的响应、优先级和 向量。
中断源
中断源是指能够触发中断 的信号源,如定时器溢出 、串行通信接收到数据等 。
中断优先级和向量
中断优先级决定了中断的 优先级,而向量则是指中 断处理程序的入口地址。
中断源
定时器溢出
当定时器计数达到最大值时,会触发一个中断,用于定时器 溢出处理。
THANKS。
解决方法
解决中断丢失问题需要从以下几个方面入手:首先,检查中断优先级设置,确保优先级 正确且没有重叠;其次,优化ISR的编写,避免在ISR中执行耗时的操作,确保ISR简洁 高效;最后,如果问题依然存在,可以尝试在外部硬件上加装抗干扰措施,如滤波电容
飞思卡尔MC9S12XS128单片机中断优先级设置简易教程
![飞思卡尔MC9S12XS128单片机中断优先级设置简易教程](https://img.taocdn.com/s3/m/268042faf705cc1755270953.png)
本教程试图用最少的时间教你飞思卡尔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。
飞思卡尔单片机教程
![飞思卡尔单片机教程](https://img.taocdn.com/s3/m/1afc5b4b773231126edb6f1aff00bed5b9f37324.png)
注 : A/D模块的时钟频率要在500KHz和2MHz之间, 所以在选择分频因子时一定要注意。
采样时间选择
SMP [1 :0]
采样时间
00
2个 A/D时钟周期
01
4个A/D时钟周期
ATDclock= ( (BusClock) / (PRS+1) ) /2
10
8个A/D时钟周期
11
16个A/D时钟周期
设CCBCA = 000,转换序列从通道
0开始;ATD0DR0,
ATD0DR1,ATD0DR2存放转换结果
设CCBCA = 0 10,转换序列从通道 2开始。 仍然是ATD0DR0,
ATD0DR1,ATD0DR2存放转换结果
S8C 、S4C 、S2C 、S1C:定义转换队列的长度 。默认长度为4。 FIFO: 结果寄存器先进先出模式 。1=FIFO模式 ,转换结果是连续 存放的;0=非FIFO模式 ,转换结果放在对应的寄存器中。 FRZ1、FRZ0:背景调试冻结模式允许 。这两个控制位就决定了,
{ while (ATD1STAT0_SCF ==0) ;
ad_value [0] = ATD1DR0; ad_value [4] = ATD1DR4;//使用 PORTB= (byte) ad_value [4] ;
}}
void ATDInit(void)
{ATD1CTL2=0xC0;//AD模块上电,快速清零,无等待模式,禁止外部触发, 中断禁止 // ADPU AFFC AWAI ETRIGLE --- ETRIGP ETRIGE ASCIE ASCIF
PRS=3
ATD1CTL5=0xA4; //右对齐无符号 ,单通道采样 ,通道0
飞思卡尔中断设置方式
![飞思卡尔中断设置方式](https://img.taocdn.com/s3/m/9b64827acaaedd3383c4d3ff.png)
中断的关闭与开放开放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](https://img.taocdn.com/s3/m/b79fbc7086c24028915f804d2b160b4e767f8134.png)
飞思卡尔单片机中断(一)引言:飞思卡尔单片机中断是一种重要的编程技术,它允许在程序执行过程中暂停当前任务,响应外部事件或触发条件,并执行预定的中断服务程序。
本文将介绍飞思卡尔单片机中断的基本概念和使用方法。
正文:一、中断的基本概念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. 中断与低功耗模式的关系和影响总结:飞思卡尔单片机中断是一种强大的编程技术,它可以提高单片机系统的实时性和响应能力。
通过本文的介绍,我们了解到了中断的基本概念和使用方法,以及中断在各种应用场景中的应用实例。
在使用中断时,我们需要注意一些常见问题和注意事项,以确保系统的稳定性和可靠性。
飞思卡尔单片机中断(两篇)
![飞思卡尔单片机中断(两篇)](https://img.taocdn.com/s3/m/831b35bebb0d4a7302768e9951e79b896902686c.png)
引言概述飞思卡尔单片机中断是指在特定的条件下,单片机的运行被打断,转而执行特定的处理程序。
在飞思卡尔单片机的开发中,中断是非常重要的一部分,它可以提高系统的响应速度和实时性。
本文将详细介绍飞思卡尔单片机中断的相关知识。
正文内容一、中断的基本概念和原理1. 中断的定义:中断是指在特定的条件下,程序的执行被打断,转而执行事先定义好的处理程序。
2. 中断的分类:外部中断和内部中断。
外部中断是由外部设备引发的,例如按键、定时器等;内部中断是由单片机内部的某个事件引发的,例如指令执行完成、通信完成等。
3. 中断的触发方式:电平触发和边沿触发。
电平触发是指当外部信号保持一定电平时触发中断;边沿触发是指在信号的上升沿或下降沿触发中断。
二、飞思卡尔单片机中断的使用方法1. 中断的初始化:对中断控制寄存器进行设置,使能相应的中断源。
2. 中断的优先级设置:多个中断源同时触发时,可以通过设置优先级来确定执行顺序。
3. 中断服务程序的编写:根据不同的中断源,编写相应的中断服务程序,完成特定的处理。
4. 中断的开启和关闭:根据需要,可以在程序中开启或关闭特定的中断。
三、飞思卡尔单片机中断优化技巧1. 中断嵌套:可以在一个中断中触发另一个中断,提高系统的实时性和处理效率。
2. 临界区保护:在关键代码段加入关中断代码,保护临界区避免竞态条件的发生。
3. 中断延时处理:在某些特定情况下,需要延时处理中断,可以使用延时函数或软件延时方式实现。
四、飞思卡尔单片机中断的常见问题和解决方法1. 中断误触发问题:可能是由于外部干扰、软件错误等原因导致中断被误触发,可以通过加入滤波电路、改进软件设计等方式解决。
2. 中断处理时间过长问题:中断处理程序执行时间过长会导致系统响应变慢,可以通过优化中断程序、减少中断次数等方式解决。
3. 中断嵌套问题:如果中断嵌套层次太多,可能会导致系统死锁或无法预测的结果,可以通过合理设计中断嵌套层次、减少中断嵌套次数来解决。
飞思卡尔中断处理方法
![飞思卡尔中断处理方法](https://img.taocdn.com/s3/m/c3154502e87101f69e319553.png)
飞思卡尔智能车总结之中断的处理方法对于我这个学计算机软件的人,来写单片机的程序,还真的是由不少困难。
最近一直在看freescale的程序规范,真的是很纠结。
我全部的硬件编程经验不过是去年硬件小学期的vhdl 程序,在试验箱上捣鼓捣鼓程序逻辑,就这点。
本来就忘的差不多了,况且它与单片机的模式还有很多区别。
所以啊``忍之,忍之,全当自我挑战了。
机械部分和电路部分完成,接下来该做的软件调试和综合测试。
我得累了。
今天遇到了一个关于中断怎么写的问题,纠结了很久,总结一下:标准的程序段是这样的格式:[c-sharp]view plaincopyprint?1. #pragma CODE_SEG __NEAR_SEG NON_BANKED //中断函数置于非分页区内2. interrupt VectorNumber_Vtimch7 void ICU_Ch7Int(void)3. {4. TFLG1_C7F = 1; //清中断标志位5. }6. #pragma CODE_SEG DEFAULT //后续代码置于默认区域内一般是用上述方式声明中断函数。
由于飞思卡尔16位单片机的中断向量是16位,所以中断函数只有被置于非分页区内才能被寻址到,这就是第一行的作用。
第二行中“VectorNumber_Vtimch7”是中断号,它是由文件“MC9S12XS128.h”中定义的宏,这个中断号在它的技术手册中找到,但是我建议你采用这种宏的形式,因为这个宏不容易出错,可读性较高,比如“VectorNumber_Vtimch7”即为定时器(TIM)通道7(CH7)所对应的中断号。
中断函数名“ICU_Ch7Int”可任意取,没有影响。
由于单片机内部非分页区大小有限,非中断函数一般置于分页区内,最后一行即为此作用。
令:MC9S12XS128.h中的宏定义是这样的:[cpp]view plaincopyprint?1. /**************** interrupt vector numbers ****************/2. #define VectorNumber_Vsi 1193. #define VectorNumber_Vsyscall 1184. #define VectorNumber_VReserved118 1175. #define VectorNumber_VReserved117 1166. #define VectorNumber_VReserved116 1157. #define VectorNumber_VReserved115 1148. #define VectorNumber_VReserved114 1139. #define VectorNumber_VReserved113 11210. #define VectorNumber_VReserved112 11111. #define VectorNumber_VReserved111 11012. #define VectorNumber_VReserved110 10913. #define VectorNumber_VReserved109 10814. #define VectorNumber_VReserved108 10715. #define VectorNumber_VReserved107 10616. #define VectorNumber_VReserved106 10517. #define VectorNumber_VReserved105 10418. #define VectorNumber_VReserved104 10319. #define VectorNumber_VReserved103 10220. #define VectorNumber_VReserved102 10121. #define VectorNumber_VReserved101 10022. #define VectorNumber_VReserved100 9923. #define VectorNumber_VReserved99 9824. #define VectorNumber_VReserved98 9725. #define VectorNumber_Vatd0compare 9626. #define VectorNumber_VReserved96 9527. #define VectorNumber_VReserved95 9428. #define VectorNumber_VReserved94 9329. #define VectorNumber_VReserved93 9230. #define VectorNumber_VReserved92 9131. #define VectorNumber_VReserved91 9032. #define VectorNumber_VReserved90 8934. #define VectorNumber_VReserved88 8735. #define VectorNumber_VReserved87 8636. #define VectorNumber_VReserved86 8537. #define VectorNumber_VReserved85 8438. #define VectorNumber_VReserved84 8339. #define VectorNumber_VReserved83 8240. #define VectorNumber_VReserved82 8141. #define VectorNumber_VReserved81 8042. #define VectorNumber_VReserved79 7943. #define VectorNumber_VReserved78 7844. #define VectorNumber_VReserved77 7745. #define VectorNumber_VReserved76 7646. #define VectorNumber_VReserved75 7547. #define VectorNumber_VReserved74 7448. #define VectorNumber_VReserved73 7349. #define VectorNumber_VReserved72 7250. #define VectorNumber_VReserved71 7151. #define VectorNumber_VReserved70 7052. #define VectorNumber_Vpit3 6953. #define VectorNumber_Vpit2 6854. #define VectorNumber_Vpit1 6755. #define VectorNumber_Vpit0 6656. #define VectorNumber_Vhti 6557. #define VectorNumber_Vapi 6458. #define VectorNumber_Vlvi 6359. #define VectorNumber_VReserved62 6260. #define VectorNumber_VReserved61 6161. #define VectorNumber_VReserved60 6062. #define VectorNumber_VReserved59 5963. #define VectorNumber_VReserved58 5864. #define VectorNumber_Vpwmesdn 5765. #define VectorNumber_Vportp 5666. #define VectorNumber_VReserved55 5567. #define VectorNumber_VReserved54 5469. #define VectorNumber_VReserved52 5270. #define VectorNumber_VReserved51 5171. #define VectorNumber_VReserved50 5072. #define VectorNumber_VReserved49 4973. #define VectorNumber_VReserved48 4874. #define VectorNumber_VReserved47 4775. #define VectorNumber_VReserved46 4676. #define VectorNumber_VReserved45 4577. #define VectorNumber_VReserved44 4478. #define VectorNumber_VReserved43 4379. #define VectorNumber_VReserved42 4280. #define VectorNumber_VReserved41 4181. #define VectorNumber_VReserved40 4082. #define VectorNumber_Vcan0tx 3983. #define VectorNumber_Vcan0rx 3884. #define VectorNumber_Vcan0err 3785. #define VectorNumber_Vcan0wkup 3686. #define VectorNumber_Vflash 3587. #define VectorNumber_Vflashfd 3488. #define VectorNumber_VReserved33 3389. #define VectorNumber_VReserved32 3290. #define VectorNumber_VReserved31 3191. #define VectorNumber_VReserved30 3092. #define VectorNumber_Vcrgscm 2993. #define VectorNumber_Vcrgplllck 2894. #define VectorNumber_VReserved27 2795. #define VectorNumber_VReserved26 2696. #define VectorNumber_Vporth 2597. #define VectorNumber_Vportj 2498. #define VectorNumber_VReserved23 2399. #define VectorNumber_Vatd0 22 100. #define VectorNumber_Vsci1 21 101. #define VectorNumber_Vsci0 20 102. #define VectorNumber_Vspi0 19103. #define VectorNumber_Vtimpaie 18104. #define VectorNumber_Vtimpaaovf 17105. #define VectorNumber_Vtimovf 16106. #define VectorNumber_Vtimch7 15107. #define VectorNumber_Vtimch6 14108. #define VectorNumber_Vtimch5 13109. #define VectorNumber_Vtimch4 12110. #define VectorNumber_Vtimch3 11111. #define VectorNumber_Vtimch2 10112. #define VectorNumber_Vtimch1 9113. #define VectorNumber_Vtimch0 8114. #define VectorNumber_Vrti 7115. #define VectorNumber_Virq 6116. #define VectorNumber_Vxirq 5117. #define VectorNumber_Vswi 4118. #define VectorNumber_Vtrap 3119. #define VectorNumber_Vcop 2120. #define VectorNumber_Vclkmon 1121. #define VectorNumber_Vreset 0122.123. /**************** interrupt vector table ****************/ 124. #define Vsi 0x0000FF10125. #define Vsyscall 0x0000FF12126. #define VReserved118 0x0000FF14 127. #define VReserved117 0x0000FF16 128. #define VReserved116 0x0000FF18 129. #define VReserved115 0x0000FF1A 130. #define VReserved114 0x0000FF1C 131. #define VReserved113 0x0000FF1E 132. #define VReserved112 0x0000FF20 133. #define VReserved111 0x0000FF22 134. #define VReserved110 0x0000FF24 135. #define VReserved109 0x0000FF26 136. #define VReserved108 0x0000FF28 137. #define VReserved107 0x0000FF2A139. #define VReserved105 0x0000FF2E 140. #define VReserved104 0x0000FF30 141. #define VReserved103 0x0000FF32 142. #define VReserved102 0x0000FF34 143. #define VReserved101 0x0000FF36 144. #define VReserved100 0x0000FF38 145. #define VReserved99 0x0000FF3A 146. #define VReserved98 0x0000FF3C 147. #define Vatd0compare 0x0000FF3E 148. #define VReserved96 0x0000FF40 149. #define VReserved95 0x0000FF42 150. #define VReserved94 0x0000FF44 151. #define VReserved93 0x0000FF46 152. #define VReserved92 0x0000FF48 153. #define VReserved91 0x0000FF4A 154. #define VReserved90 0x0000FF4C 155. #define VReserved89 0x0000FF4E 156. #define VReserved88 0x0000FF50 157. #define VReserved87 0x0000FF52 158. #define VReserved86 0x0000FF54 159. #define VReserved85 0x0000FF56 160. #define VReserved84 0x0000FF58 161. #define VReserved83 0x0000FF5A 162. #define VReserved82 0x0000FF5C 163. #define VReserved81 0x0000FF5E 164. #define VReserved79 0x0000FF60 165. #define VReserved78 0x0000FF62 166. #define VReserved77 0x0000FF64 167. #define VReserved76 0x0000FF66 168. #define VReserved75 0x0000FF68 169. #define VReserved74 0x0000FF6A 170. #define VReserved73 0x0000FF6C 171. #define VReserved72 0x0000FF6E 172. #define VReserved71 0x0000FF70174. #define Vpit3 0x0000FF74 175. #define Vpit2 0x0000FF76 176. #define Vpit1 0x0000FF78 177. #define Vpit0 0x0000FF7A 178. #define Vhti 0x0000FF7C 179. #define Vapi 0x0000FF7E 180. #define Vlvi 0x0000FF80 181. #define VReserved62 0x0000FF82 182. #define VReserved61 0x0000FF84 183. #define VReserved60 0x0000FF86 184. #define VReserved59 0x0000FF88 185. #define VReserved58 0x0000FF8A 186. #define Vpwmesdn 0x0000FF8C 187. #define Vportp 0x0000FF8E 188. #define VReserved55 0x0000FF90 189. #define VReserved54 0x0000FF92 190. #define VReserved53 0x0000FF94 191. #define VReserved52 0x0000FF96 192. #define VReserved51 0x0000FF98 193. #define VReserved50 0x0000FF9A 194. #define VReserved49 0x0000FF9C 195. #define VReserved48 0x0000FF9E 196. #define VReserved47 0x0000FFA0 197. #define VReserved46 0x0000FFA2 198. #define VReserved45 0x0000FFA4 199. #define VReserved44 0x0000FFA6 200. #define VReserved43 0x0000FFA8 201. #define VReserved42 0x0000FFAA 202. #define VReserved41 0x0000FFAC 203. #define VReserved40 0x0000FFAE 204. #define Vcan0tx 0x0000FFB0 205. #define Vcan0rx 0x0000FFB2 206. #define Vcan0err 0x0000FFB4 207. #define Vcan0wkup 0x0000FFB6209. #define Vflashfd 0x0000FFBA 210. #define VReserved33 0x0000FFBC 211. #define VReserved32 0x0000FFBE 212. #define VReserved31 0x0000FFC0 213. #define VReserved30 0x0000FFC2 214. #define Vcrgscm 0x0000FFC4 215. #define Vcrgplllck 0x0000FFC6 216. #define VReserved27 0x0000FFC8 217. #define VReserved26 0x0000FFCA 218. #define Vporth 0x0000FFCC 219. #define Vportj 0x0000FFCE 220. #define VReserved23 0x0000FFD0 221. #define Vatd0 0x0000FFD2 222. #define Vsci1 0x0000FFD4 223. #define Vsci0 0x0000FFD6 224. #define Vspi0 0x0000FFD8 225. #define Vtimpaie 0x0000FFDA 226. #define Vtimpaaovf 0x0000FFDC 227. #define Vtimovf 0x0000FFDE 228. #define Vtimch7 0x0000FFE0 229. #define Vtimch6 0x0000FFE2 230. #define Vtimch5 0x0000FFE4 231. #define Vtimch4 0x0000FFE6 232. #define Vtimch3 0x0000FFE8 233. #define Vtimch2 0x0000FFEA 234. #define Vtimch1 0x0000FFEC 235. #define Vtimch0 0x0000FFEE 236. #define Vrti 0x0000FFF0 237. #define Virq 0x0000FFF2 238. #define Vxirq 0x0000FFF4 239. #define Vswi 0x0000FFF6 240. #define Vtrap 0x0000FFF8 241. #define Vcop 0x0000FFFA 242. #define Vclkmon 0x0000FFFC。
飞思卡尔S12系列寄存器和中断讲解
![飞思卡尔S12系列寄存器和中断讲解](https://img.taocdn.com/s3/m/1a4e1d0080eb6294dc886c2a.png)
S12的输入/输入端口(I/O 口)I/O端口功能可设置为通用I/O 口、驱动、内部上拉/下拉、中断输入等功能。
设置I/O口工作方式的寄存器有:DDR、10、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、DDREDDRA、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 口上拉控制寄存器PUCRPUCR 初:PUPKE —— ----- --------- -——RUPEE ——-————-——PUPBE PUR\EWrite: | | |PUCR为8位寄存器,复位后的值为 0。
当PUPAE、PUPBE、PUPEE被设置为1时,A 口、B 口、E 口具有内部上拉功能;为0时,上拉无效。
当A 口、 B 口、E 口为地址/数据总线时,PUPAE和PUPBE无效。
(3)A 口、B 口、E 口降功率驱动控制寄存器RDRIVRDRIV 篇眾?RDPK 口| | 良DPE 口口| 嵐DPB RDPARDRIV为8位寄存器,复位后的值为 0,此时,A 口、B 口、E 口驱动保持全功率;当 RDPA、RDPB、RDPE为1时,A 口、B 口、E 口输出引脚的驱动功率下降(4)数据寄存器PORTA、PORTB、PORTEPORTA、PORTB、PORTE均为8位寄存器,复位后的值为 0,端口引脚输出低电平;要使引脚输出高电平,相应端口对应位应该置1。
飞思卡尔定时中断程序3
![飞思卡尔定时中断程序3](https://img.taocdn.com/s3/m/e9b2dbd2240c844769eaeedc.png)
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模块.](https://img.taocdn.com/s3/m/00431b29ee06eff9aef807a6.png)
• • • • • 定时器简介 周期中断定时器简介(PIT) 周期中断定时器寄存器 PIT模块编程范例 时钟产生器模块
定时器简介 ——为什么使用定时器
时间延迟的产生和测量
外部信号周期和脉冲宽度的测量 事件计数器 事件发生时间比较器 波形发生器 周期性的中断产生 定时器实际上是计数器,它通过累计已知时间间隔的个数来 计算时间。被累计的时间间隔若是系统时钟,计数器就变成了定 时器。
1 时钟频率已稳定,锁相环频率已锁定 0 时钟频率未稳定,锁相环频率未锁定
时钟产生器模块 ——寄存器
5、时钟选择寄存器(CLKSEL)
地址:$39
PLLSEL:选定锁相环位 1 Bus Clock=PLLCLK/2 0 Bus Clock=OSCCLK/2
6、预分频寄存器POSTDIV
地址:$
POSTDIV[4..0] :预分频因子。POSTDIV 为默认时(后四位全0),fvoc =fpll。
定时器简介 ——怎样获得定时器
程序设计软件定时器
void delay(void) { unsigned int i,j; for(i=0;i<10;i++) for(j=0;j<10000;) j++; }
微处理器常常内置定时器(硬件定时器)
–MCS51单片机内有二个16位定时器、计数器 –MC9S12XS内置 RTI ( Real Time Interrupt) ECT – enhanced capture timer OC – Output comparer PWM – Pulse width modulationPeriod and pulse width measurement 四个24位PIT定时器
飞思卡尔MCU自定义中断向量程序设计
![飞思卡尔MCU自定义中断向量程序设计](https://img.taocdn.com/s3/m/f937fbf2998fcc22bcd10d28.png)
自定义中断向量的情况说明#pragma CODE_SEG NON_BANKED// 声明外部中断函数extern void Timer0_C0(void);extern void _Startup(void); //Startup routine */#pragma CODE_SEG NON_BANKED/* Interrupt section for this module. Placement will be in NON_BANKED area. */ __interrupt void UnimplementedISR(void) //定义在NON_BANKED区{asm BGND; // 空的中断函数}typedef void (*near tIsrFunc)(void); //定义了函数指针类型//定义一个函数指针数组中断表,从0xFF80地址开始装载各个中断函数的首地址const tIsrFunc _vect[] @0xFF80 = /* Interrupt table */{UnimplementedISR, /* vector 63 */UnimplementedISR, /* vector 62 */UnimplementedISR, /* vector 61 */UnimplementedISR, /* vector 60 */UnimplementedISR, /* vector 59 */UnimplementedISR, /* vector 58 */UnimplementedISR, /* vector 57 */UnimplementedISR, /* vector 56 */UnimplementedISR, /* vector 55 */UnimplementedISR, /* vector 54 */UnimplementedISR, /* vector 53 */UnimplementedISR, /* vector 52 */UnimplementedISR, /* vector 51 */UnimplementedISR, /* vector 50 */UnimplementedISR, /* vector 49 */UnimplementedISR, /* vector 48 */UnimplementedISR, /* vector 47 */UnimplementedISR, /* vector 46 */UnimplementedISR, /* vector 44 */ UnimplementedISR, /* vector 43 */ UnimplementedISR, /* vector 42 */ UnimplementedISR, /* vector 41 */ UnimplementedISR, /* vector 40 */ UnimplementedISR, /* vector 39 */ UnimplementedISR, /* vector 38 */ UnimplementedISR, /* vector 37 */ UnimplementedISR, /* vector 36 */ UnimplementedISR, /* vector 35 */ UnimplementedISR, /* vector 34 */ UnimplementedISR, /* vector 33 */ UnimplementedISR, /* vector 32 */ UnimplementedISR, /* vector 31 */ UnimplementedISR, /* vector 30 */ UnimplementedISR, /* vector 29 */ UnimplementedISR, /* vector 28 */ UnimplementedISR, /* vector 27 */ UnimplementedISR, /* vector 26 */ UnimplementedISR, /* vector 25 */ UnimplementedISR, /* vector 24 */ UnimplementedISR, /* vector 23 */ UnimplementedISR, /* vector 22 */ UnimplementedISR, /* vector 21 */ UnimplementedISR, /* vector 20 */ UnimplementedISR, /* vector 19 */ UnimplementedISR, /* vector 18 */ UnimplementedISR, /* vector 17 */ UnimplementedISR, /* vector 16 */ UnimplementedISR, /* vector 15 */ UnimplementedISR, /* vector 14 */ UnimplementedISR, /* vector 13 */ UnimplementedISR, /* vector 12 */ UnimplementedISR, /* vector 11 */ UnimplementedISR, /* vector 10 */Timer0_C0, /* vector 08 */UnimplementedISR, /* vector 07 */UnimplementedISR, /* vector 06 */UnimplementedISR, /* vector 05 */UnimplementedISR, /* vector 04 */UnimplementedISR, /* vector 03 */UnimplementedISR, /* vector 02 */UnimplementedISR, /* vector 01 */_Startup /* Reset vector */};在编译的时候,假如出现以下的错误提示ERROR: Vector allocated at absolute address 0xFFFE overlaps with sections placed in segment xxxx则说明_Startup()函数的绝对地址约束存在二义性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当同时有多个中断源请求中断时,中断向量地址最靠近 $FFFF的,将会首先被响应
TM
Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
• 如果在进入中断服务程序时,手动对I位清零:
• HPRIO寄存器
TM
Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
高优先级
中断 B
中断B请求 等 待 运 行 人 人 平 等
中断 A
运 行
程序
运行
等 待
等 待
运 行
低优先级
中断A请求
TM
Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
TM
Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
在可屏蔽中断服务程序中EnableInterrupts
高优先级
中断 B
中断A请求 运 行 等 待 运 行 长 幼 不 分
中断 A
运 行 中断B被挂起
程序
运 行
低优先级
等
待
ቤተ መጻሕፍቲ ባይዱ
运 行
中断B请求
TM
Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
优先机制 - 两级
例如: 中断向量地址 $FFF0 – FFF1 为低优先级 其他的中断为高优先级 在$FFF0 – FFF1 中断服务程序中,EnableInterrupts(I位清零) 其他的中断包括自己都可以在中断服务程序执行时,被响应 在其他的中断服务程序中,I位不清零(默认) 只有当前中断服务程序执行完后,才能响应其他的中断请求
优先机制 – 多级
自定义优先级 中断向量地址 中断源 CCR屏蔽位 局部屏蔽位 HPRIO
1 中
$FFEE, $FFEF
ECT 通道0
I
TIE_C0I
$EE
0 低
$FFEC, $FFED
ECT 通道1
I
TIE_C1I
$EC
2 高
$FFEA, $FFEB
ECT 通道2
I
TIE_C2I
$EA
要求: 在低优先级的中断服务程序中,高优先级的中断请求可以被响应 HPRIO = 0xEA: ECT0,1,2同时请求中断时,CPU将会首先响应通道2 默认时, CPU将会首先响应通道0
TM
Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
优先机制 – 多级
• 情况 1:
每个中断都单独发生,在一个中断程序执行时,没有其他中断
• 情况 2:
在执行ECT1的中断服务程序时,ECT0请求中断 ECT0中断服务程序将被执行 • 情况 3: 在执行ECT2的中断服务程序时,ECT0请求中断 ECT2的中断服务程序执行结束后,执行ECT0的中断服务程序 • 情况 4: ECT1,ECT2同时请求中断 ECT1的中断服务程序先执行,当EnableInterrupts后 执行ECT2的中断服务程序 ECT2的中断服务程序执行结束后,返回执行ECT1的中断服务程序
采用中断优先处理机制
高优先级
中断 B
运 行 中断B返回 运 行 等 待 运 行
中断 A
等 级 森 严
中断B请求
程序
运 行
低优先级
等
待
运 行
中断A请求
TM
Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
TM
Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
HCS12中断 • 默认状态:
在进入中断服务程序时,I位自动置1,禁止其他可屏蔽中断 即使有优先级更高的中断请求,也必须等当前中断服务程序执行完 以后才能响应 优先级的作用只有在多个中断源同时请求中断时在能体现 无法实现中断嵌套
任何其他可屏蔽中断都可以被响应,无论其优先级有多高 中断响应由时间控制,可以实现中断嵌套 对中断执行无法预测 写入HPRIO中的中断向量的后八位,可以改变该中断的优先级 同样,优先级的作用只有在多个中断源同时请求中断时在能体现
TM
Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
HCS12默认中断处理机制
TM
Freescale Semiconductor Confidential and Proprietary Information. Freescale™ and the Freescale logo are trademarks of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © Freescale Semiconductor, Inc. 2005.
中断优先处理机制
1. 在中断服务程序中,首先对I为清零,即EnableInterrupts
2. 选择优先级更高的中断源可以进入响应中断
3. 设置优先等级
两级 > 一个中断源为低优先级,其他为高优先级 > 在低优先级中断服务程序中,对I位清零 > 在高优先级中断服务程序中,不清零 多级 > 利用局部的中断屏蔽位 > 比如Timer Channel0 的中断屏蔽位 TIE_C0I