飞思卡尔xs128单片机的简单定时中断

合集下载

飞思卡尔单片机中断

飞思卡尔单片机中断

在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

飞思卡尔单片机中断

飞思卡尔单片机中断

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

XS128单片机实验中断扫描控制循环速度

XS128单片机实验中断扫描控制循环速度

XS128单片机实验:中断扫描控制循环速度PORTA端口与1个8位拨码开关连接,PORTB端口与8只LED连接,IRQ引脚与一个按键链接,按键按下为低电平。

要求中断源触发,8位拨码开关控制8只LED灯的循环点亮速度。

///////////////////////////////////////////////// ///////////////////////////////////////////////// ///////////////////////////////////////////////// 有一个现象一直困扰着我,当中断按键按下时,程序会整个中断,BDM下载器仿真环境停止;这个原因已经找到了,因为,E0口是非屏蔽中断,E1口是可屏蔽中断,所以要接E1口。

///////////////////////////////////////////////// ///////////////////////////////////////////////// ///////////////////////////////////////////////// /#include ;/* common defines and macros */#include "derivative.h"/* derivative-specific definitions */#include "WQ.h"uchar IRQ_flag;/************************************************ *****************//功能:中断触发后实现流水灯的速度控制//This is the fourth program of mine//we use the interrupt to control the led************************************************* ****************//**********************IRQ 中断服务子程序***********************/#pragma CODE_SEG __NEAR_SEG NON_BANKEDvoid interrupt 6 IRQ_INT (void){IRQ_flag =1;}#pragma CODE_SEG DEFAULTvoid main(void) {uchar loop_index,loop_time;DDRA = 0X00;//A口做输入口;DDRB = 0XFF;//B口做输出口;loop_time = PORTA;loop_index=0;IRQ_flag=0;EnableInterrupts; //允许可屏蔽中断while(1){if(IRQ_flag) {IRQ_flag=0;loop_time=PORTA;}switch(loop_index){case 0:PORTB = 0xFE; break; case 1:PORTB = 0xFD; break;case 2:PORTB = 0xFB; break;case 3:PORTB = 0xF7; break; case 4:PORTB = 0xEF; break; case 5:PORTB = 0xDF; break; case 6:PORTB = 0xBF; break; case 7:PORTB = 0x7F; break;}loop_index++;if(loop_index==8) {loop_index =0;}delay_1(loop_time);}}。

飞思卡尔16位单片机9S12XS128使用(一些初始化)

飞思卡尔16位单片机9S12XS128使用(一些初始化)

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

现记录下这个艰辛历程。

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

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

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

废话不多说,进入正题。

单片机简介:9S12XS128MAA单片机是16位的单片机80个引脚,CPU是CPU12X,内部RAM8KB,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?1/******************系统时钟初始化****************/2void Init_System_Clock()3{4 asm { // 这里采用汇编代码来产生40M的总线5 LDAB #36 STAB REFDV78 LDAB #49 STAB SYNR10 BRCLR CRGFLG,#$08,*//本句话含义为等待频率稳定然后执行下一条汇编语句,选择此频率作为总线频率11 BSET CLKSEL,#$8012 }13}上面的代码是汇编写的,这个因为汇编代码量比较少,所以用它写了,具体含义注释已经给出,主函数中调用此函数即可完成时钟初始化,总线时钟为40M.2、SCI模块初始化单片机电路做好了当然少不了和PC之间的通信,通信通过单片机串口SCI链接到PC端的COM口上去。

飞思卡尔MC9S12XS128(定时器)ECT寄存器详解

飞思卡尔MC9S12XS128(定时器)ECT寄存器详解

1、定时器IC/OC功能选择寄存器TIOSIOS[7..0]IC/OC功能选择通道0 相应通道选择为输入捕捉(IC)1 相应通道选择为输出比较(OC)2、定时器比较强制寄存器 CFORCFOC[7..0]设置该寄存器某个FOCn位为1将导致在相应通道上立即产生一个输出比较动作,在初始化输出通道时候非常有用。

【说明】这个状态和正常状态下输出比较发生后,标志位未被置位后的情况相同。

3、输出比较7屏蔽寄存器 OC7MOC7M[7..0]OC7(即通道7的输出比较)具有特殊地位,它匹配时可以直接改变PT7个输出引脚的状态,并覆盖各个引脚原来的匹配动作结果,寄存器OC7M决定哪些通道将处于OC7的管理之下。

OC7M中的各位与PORTT口寄存器的各位一一对应。

当通过TIOS将某个通道设定为输出比较时,将OC7M中的相应位置1,对应的引脚就是输出状态,与DDR中的对应位的状态无关,但OC7Mn并不改变DDR相应位的状态。

【说明】OC7M具有更高的优先级,它优于通过TCTL1和TCTL2寄存器中的OMn和OLn设定的引脚动作,若OC7M中某个位置1,就会阻止相应引脚上由OM和OL设定的动作。

4、输出比较7数据寄存器 OC7DOC7D[7..0]OC7M对于其他OC输出引脚的管理限于将某个二进制值送到对应引脚,这个值保存在寄存器OC7D中的对应位中。

当OC7匹配成功后,若某个OC7Mn=1,则内部逻辑将OC7Dn送到对应引脚。

OC7D中的各位与PORTT口寄存器的各位一一对应。

当通道7比较成功时,如果OC7M中的某个位为1,OC7D中的对应位将被输出到PORTT的对应引脚。

【总结】通道7的输出比较(OC7)具有特殊的位置,在OC7Mn和OC7Dn两个寄存器设置以后,OC7成功输出后将会引起一系列的动作。

比如:OC7M0=1,则通道0处在OC7的管理下,在OC7成功后,系统会将OC7D0的逻辑数据(仅限0或者1)反应在PT0端口上。

飞思卡尔2014mc9s12xs128学习及智能车制作笔记

飞思卡尔2014mc9s12xs128学习及智能车制作笔记

S128学习笔记(一)GPIO 模块S128 IO操作主要有三个寄存器数据寄存器(PORTX)数据方向寄存器(DDRX) 上拉上拉电阻控制寄存器PUCR)一. GPIO概述通用I/O:GPIO(General Purpose I/O),是I/O的最基本形式,它是一组输入或输出引脚,有时也称为并行I/O(parallel I/O)。

作为普通输入引脚,MCU内部程序可以读取该引脚,知道该引脚是“1”(高电平)或“0”(低电平),即开关量输入。

作为普通输出引脚,MCU内部程序由该引脚输出“1”(高电平)或“0”(低电平),即开关量输出。

大多数通用I/O引脚可以通过编程来设定工作方式为输入或输出,称之为双向通用I/O。

2. I/O口的使用方法MC9S12DG128 MCU有10个普通I/O口,分别是A口、B口、E口、H口、J口、K口、M 口、P口、S口、T口。

这些引脚中的大部分具有双重功能,其中A、B、E、K口只用做GPIO 功能,这里仅讨论它们编程方法。

使用这些I/O口主要设置如下寄存器:1)数据方向寄存器(Data Direction Register x,DDRx)DDRx的第7~0位分别记为DDRx7~DDRx0,这些位分别控制着x口引脚PORTx7~PORTx0是输入还是输出,若DDRxn=0,则引脚PORTAxn为输入,若DDRxn=1,则引脚PORTxn为输出。

复位时DDRx为$00。

(注:x代表A、B、E、K口中的某一个,n表示某一位)2)数据寄存器(Port x I/O Register,PORTx)PORTx的第7~0位分别记为PORTx7~PORTx0。

若A口的某一引脚PORTxn被定义。

成输出,程序使x口I/O寄存器PORTx的相应位PORTxn=0,则引脚PORTxn输出“低电平”;程序使PORTxn=1,则引脚PORTxn输出“高电平”。

若x口的某一引脚PORTxn被定义成输入,程序通过读取x口I/O寄存器PORTx,获得输入情况,0表示输入为“低电平”,1表示输入为“高电平”。

XS128智能车程序流程

XS128智能车程序流程

XS128智能车整体程序流程图
初始化过程电机启动前2s内完成工作
初始化完成工作
1、初始化锁相环倍频72MHz;
2、设定5个中断优先级分别是SCI0(串口接收中断)、PIT0(速度采集中断)、
TIM0(图像采集行[HREF]中断)、TIM1(图像采集场[VSYNC]中断)、PIT2(启动定时中断);
3、完成舵机初始化设初值为中间值并启动;
4、完成电机初始化设初值为0不启动(在启动定时中断服务程序中启动);
5、完成串口初始化、不启动接收中断
6、完成速度采集初始化、不启动中断
7、完成图像采集初始化、启动场中断,进入场中断服务程序后启动行中断
8、完成参数读入初始化、在PORTA端口读入;
9、完成启动定时初始化、启动定时中断;
10、开启中断使能。

启动定时中断服务程序中完成工作
1)根据电机启动前摄像头适应场地采集的图像计算出的图像二值化阈值并设定
阈值;并根据路径识别给出电机目标值
2)关闭启动定时中断;
3)启动速度采集控制中断;
4)启动串口接收中断;
5)启动电机。

系统初始化部分列表
小车启动后程序运行流程
1.进入图像场中断
2.。

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位时基进行选择。

飞思卡尔9S12XS128 单片机教程

飞思卡尔9S12XS128 单片机教程

9S12XS128 单片机开发工具包清华Freescale MCU/DSP 应用开发研究中心9S12XS128单片机开发工具包 (1)概述 (3)9S12XS128单片机 (3)9S12XS128开发工具包组件 (3)9S12XS128开发板及与PC 通信 (4)9S12XS128 开发板 (4)开发板的硬件连接 (5)PC机的设置 (6)监控程序及监控命令详解 (8)命令详解 (8)复位、中断向量表 (12)用户可以使用的RAM空间 (12)编译器CodeWarrior for HCS12 使用方法入门 (13)建立工程文件 (13)编写main.c 程序 (15)定义存储空间分配 (17)应用程序的编译 (18)向开发板下载程序 (20)运行应用程序 (21)概述这里描述的是一套9S12XS128 系列单片机开发系统套件。

以后的更新的版本见清华Freescale单片机应用开发研究中心的网站:。

开发系统主要由两个部分组成,分别是调试下载用的TBDML和开发用目标板。

其中TBDML的使用请参见文档“BDM for S12(TTBDM)用户手册V 34.pdf”。

目标板是有异步串行口的驱动的基本系统。

针对9S12XS128 芯片我们编写了9S12XS128目标板监控程序,可以方便地完成应用系统的开发。

用户可以在此基础上设计自己所需的目标母板,完成项目的初期开发。

应用软件完成后,用开发工具板擦除监控程序,下载最终的应用程序。

9S12XS128 单片机S12XS 16 位微控制器系列针对一系列成本敏感型汽车车身电子应用进行了优化。

S12X 产品满足了用户对设计灵活性和平台兼容性的需求,并在一系列汽车电子平台上实现了可升级性、硬件和软件可重用性、以及兼容性。

S12XS 系列可以经济而又兼容地扩展至带XGate 协处理器的S12XE 系列单片机,从而为用户削减了成本,并缩小了封装尺寸。

S12XS系列帮助设计者迅速抓住市场机遇,同时还能降低移植成本。

飞思卡尔中断设置方式

飞思卡尔中断设置方式

中断的关闭与开放开放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。

MC9S12XS128之实时中断RTI

MC9S12XS128之实时中断RTI

有些东西看过了之后不及时巩固的话,过一段时间就忘得差不多了,前段时间看了实时中断RTI,趁着还有一些余热,赶紧记下来。

之前一些以为实时中断只有在运用嵌入式实时操作系统时才会用到的,觉得是很高级的东西,所以一直没信心,不敢去看。

实时中断其实并不复杂,简单地说,就是一个定时模块,定时溢出,产生中断。

功能跟PIT差不多,都能用定时。

不过既然有了PIT可以定时了,为什么还要多此一举弄多一个实时中断RTI 呢?因为,PIT 时钟电路每固定一段时间都必须更新一次时间信息,这个更新的责任就落在MCU身上了。

对于那种比较繁重的系统而言,“进行一次更新”会耗费许多的资源。

RTI 专注于记时工作,使MCU可以空出来处理其它的工作。

外部晶振时钟可以直接“驱动”RTI。

RTI定时不会很准,因为它没有经过复杂的时钟处理,然后经过性价比极高的配置之后,可以变为a*2^b倍数。

因为a*2^b不能是任意数整数,不能配成你想要的任何频率,所以说RTI定时不会很准,不过它用起来还是很灵活的。

现在说一下RTI 是如何配置的:第一步,实时中断RTI 在默认情况下是关闭的,怎样才能让RTI 工作呢?这就用到实时中断控制寄存器RTICTL 了。

RTICTL是一个八位寄存器,第七位没定义,只用到低七位[RTR6~RTR0]。

当RTR[6:4]=000时,实时中断被禁止,只要当RTR[6:4] 不全为0时,实时中断就开启了。

同时实时中断的溢出周期也是由该寄存器配置的。

RTI 的参考时间是外部晶振的时钟OSCCLK。

故,实时中断的溢出时钟周期=(RTR[3:0]+1) x (2的(RTR[6:4] + 9)次方)/OSCCLK。

第二步,要想在实时中断溢出时产生一个中断,则用到寄存器CRGINT 了。

当CRGINT_RTIE=1时,每个周期结束时,就会产生一个中断。

只要配置好上面说的两个寄存器,再写上相应的中断函数,实时中断就可以用了。

顺便提一下,实时中断RTI 的中断号是7 。

飞思卡尔单片机中断(一)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. 中断嵌套问题:如果中断嵌套层次太多,可能会导致系统死锁或无法预测的结果,可以通过合理设计中断嵌套层次、减少中断嵌套次数来解决。

飞思卡尔中断处理方法

飞思卡尔中断处理方法

飞思卡尔智能车总结之中断的处理方法对于我这个学计算机软件的人,来写单片机的程序,还真的是由不少困难。

最近一直在看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。

飞思卡尔定时中断程序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清零。

XS128-RTI实时中断

XS128-RTI实时中断

XS128之实时中断RTI有些东西看过了之后不及时巩固的话,过一段时间就忘得差不多了,前段时间看了实时中断RTI,趁着还有一些余热,赶紧记下来。

之前一些以为实时中断只有在运用嵌入式实时操作系统时才会用到的,觉得是很高级的东西,所以一直没信心,不敢去看。

实时中断其实并不复杂,简单地说,就是一个定时模块,定时溢出,产生中断。

功能跟PIT差不多,都能用定时。

不过既然有了PIT可以定时了,为什么还要多此一举弄多一个实时中断RTI 呢?因为,PIT 时钟电路每固定一段时间都必须更新一次时间信息,这个更新的责任就落在MCU身上了。

对于那种比较繁重的系统而言,“进行一次更新”会耗费许多的资源。

RTI 专注于记时工作,使MCU可以空出来处理其它的工作。

外部晶振时钟可以直接“驱动”RTI。

RTI定时不会很准,因为它没有经过复杂的时钟处理,然后经过性价比极高的配置之后,可以变为a*2^b倍数。

因为a*2^b不能是任意数整数,不能配成你想要的任何频率,所以说RTI定时不会很准,不过它用起来还是很灵活的。

现在说一下RTI 是如何配置的:第一步,实时中断RTI 在默认情况下是关闭的,怎样才能让 RTI 工作呢?这就用到实时中断控制寄存器 RTICTL 了。

RTICTL是一个八位寄存器,第七位没定义,只用到低七位[RTR6~RTR0]。

当RTR[6:4]=000时,实时中断被禁止,只要当RTR[6:4] 不全为0时,实时中断就开启了。

同时实时中断的溢出周期也是由该寄存器配置的。

RTI 的参考时间是外部晶振的时钟OSCCLK。

故,实时中断的溢出时钟周期=(RTR[3:0]+1) x (2的(RTR[6:4] + 9)次方)/OSCCLK。

第二步,要想在实时中断溢出时产生一个中断,则用到寄存器 CRGINT 了。

当CRGINT_RTIE=1时,每个周期结束时,就会产生一个中断。

只要配置好上面说的两个寄存器,再写上相应的中断函数,实时中断就可以用了。

xs128中断深入解析

xs128中断深入解析

中断函数为什么要加:#pragma CODE_SEG __NEAR_SEG NON_BANKED 这个声明?这个声明是干什么用的?2010-04-18 17:07这要还是要从FLASH分页和非分页的区别说起。

下面详细说一说,FLASH里非分页和分页的使用。

要明白一点,分页是不可见的,要用的时候PPAGE参与寻址。

FLASH里非分页工作机制FLASH一共为128K,一页是16K,那么应该有8页才是,但是实际只有6个分页。

有2个非分页放在4000-7FFF,和C000-FFFF两个逻辑地址窗里。

那么,当程序的寻址在64K之内(2^16=64K,16位机的寻址能力是64K)时,就不用分页了,直接使用那两个非分页的数据。

实际上,3E页 3F页是可见的,其实他们就是那2个非分页的映射。

因此,使用非分页FLASH,就不须设置PPAGE寄存器,直接使用逻辑地址即可。

这点我们可以从以下看出:/* non-paged FLASHs */ROM_4000 = READ_ONLY 0x4000 TO 0x7FFF;ROM_C000 = READ_ONLY 0xC000 TO 0xFEFF;PLACEMENTNON_BANKED, INTO ROM_C000/*, ROM_4000*/;很直观地看出,把这两个可以直接使用逻辑地址的页面设为NON_BANKED, 那么中断函数放在NON_BANKED里,就可以把函数放在64K的寻址程序段中。

这么一来,进中断就方便多了,效率也高很多。

MC9SDG128B的中断编程主要有两种方式第一种是使用符号“TRAP_PROC”,TRAP_PROC 提示编译器下面的函数是中断服务例程。

编译器会用一个特殊的中断返回指令来结束这个函数(对大多数处理器来说,一般是RTI指令).第二种是使用“interrupt”关键字,“interrupt”关键字是一个非标准ANSI-C的关键字,因此,它不能被所有ANSI-C编译器厂商所支持。

MC9S12XS128 中 PIT (周期中断定时器) 的使用

MC9S12XS128 中 PIT (周期中断定时器) 的使用
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}
/*-----------------PIT0初始化------------------*/
那么如何通过编程来实现 PIT 来定时呢?在 数据手册的 363 页给出了 汇编代码的实现,当初我使用的时候已经把汇编转化成 C 语言了。
下面简单地来说下 PIT 的编程过程->:
1、8-Bit Micro Timer 0 跟 8-Bit Micro Timer 1 从 Bus Clock 里面获取时钟信号,通过编程 PITMTLDX 这
在 MC9S12XS128 这款单片机中 没有像 51 或者 AVR 那样的递减计数器,即在一个计时计数器中装一个数,单片机 让这个数在一定的时钟周期性 减 1 ,直道这个数减到 0 为止来实现多少时间的定时。当寄存器的值变为0时又重新装入数来再计时,装数有自动装载和手动装载两种,学过 51 跟 AVR 的朋友应该明白这两种模式。虽然 MC9S12XS128 这款单片机没有这样的定时器,但是它提供了 PIT 定时器,即 Periodic Interrupt Timer (S12PIT24B4CV1),即周期性中断定时器。PIT 分为 PIT0、PIT1、PIT2、PIT3 ,它们均是以中断的方式来实现定时的,具体能够实现多大范围的定时可参考 datasheet . PIT0、PIT1、PIT2、PIT3 对应的中断向量号分别为 66、67、68、69。还要注意 PIT 是没有外部引脚的。
void Pit0_Init(void)

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

飞思卡尔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。

改进版:飞思卡尔MC9S12XS128(64pin)引脚功能说明

改进版:飞思卡尔MC9S12XS128(64pin)引脚功能说明
DIR0
21
PE4
ECLK
端口E:通用I/O,总线时钟输出
DIR1
22
VSSX2
电源
23
VDDX2
电源
24
外部复位
25
VDDR
电源
26
VSS3
电源
27
VSSPLL
电源
28
EXTAL
外部时钟输入
29
XTAL
振荡器输出
30
VDDPLL
电源
31
PE1
端口E:通用I/O,可屏蔽中断输入
Keyon(启动)给定
AN5
45
PAD06
AN06
端口A/D:通用I/O,ATD模拟信号输入
46
PAD07
AN07
端口A/D:通用I/O,ATD模拟信号输入
预留输入给定
47
VDDA
电源
48
VRH
电源
49
VRL
VSSA
电源
50
PS0
RXD0
端口S:通用I/O,SCI0的RXD
SCI0_RXD
51
PS1
TXD0
端口S:通用I/O,SCI0的TXD
DIR5
57
PM3
端口M:通用I/O,SPI0的从机选择
DIR6
58
PM2
MISO0
端口M:通用I/O,SPI0的MISO
DIR7
59
PM1
TXCAN0
TXD1
端口M:通用I/O,CAN0的TX,SCI1的TXD
N_TX
60
PM0
RXCAN0
RXD1
端口M:通用I/O,CAN0的RX,SCI1的RXD
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt { PulseCnt++; TFLG1=0X01; PORTB=~PulseCnt; } #pragma CODE_SEG DEFAULT //在 PORTB 显示脉冲数 IC0_ISR(void)
基于飞思卡尔 xs128 单片机的简单定时中断(PIT)
刚开始接触这款单片机,由于看的书基本上都是以 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 位时基进行选择。因为 8 位计数器只有两个,所 以在将 8 位计数器和 16 位计数器连接时,可以选择不同的 8 位时基。 当设置为 0 时,对应通道选择时基 0;置一时,对应通道选择时基 1。 如 PITMUX_PMUX0=1 为通道 0 选择时基 1。 6)、PIT Interrupt Enable Register(PITINTE) 该寄存器为中断使能寄存器,为不同的 PIT 通道中断使能。设定为 0 时,相 应通道中断禁止。置一时,相应通道使能。 如 PITINTE_PINTE0=1 时, PIT 通道 0 定时中断使能, 当计数器递减溢出时, 申请中断。 7)、PIT Time-Out Flag Register(PITTF) 该寄存器为溢出标志位,当某一通道的 8 位计数器和 16 位计数器递减到 0 时,该位置一。给改位写 1 则清除该标志位。 可以通过查询该位来判断定时是否完成。
S12 系列的定时器模块是在标准定时器模块(Standard Timer Module,TIM)的 基础上增加了一些功能,称为增强型定时器模块(Enhanced Capture Timer Module,ECT).
ECT 功能:1)高速 I/O 口 2)一个 16 位自由运行计数器 3)八个 16 位输入捕捉(IC)/输出比较(OC) 通道 4)一个 16 位脉冲累加器 5)Байду номын сангаас个 16 位模数递减计数器(MDC)
void PIT_init(void)//定时中断初始化函数 5MS 定时中断设置 { PITCFLMT_PITE=0; //定时中断通道 0 关 PITCE_PCE0=1;//定时器通道 0 使能 PITMTLD0=160-1;//8 位定时器初值设定,160 分频,在 32MHzBusClock 下, 为 0.2MHz。即 5us PITLD0=PITTIME-1;//16 位定时器初值设定。PITTIME*0.005MS PITINTE_PINTE0=1;//定时器中断通道 0 中断使能 PITCFLMT_PITE=1;//定时器通道 0 使能 } void main(void) { /* put your own code here */ 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 定时 uchar count=0; void setbusclock(void) //32MHz 外部时钟 16MHz { CLKSEL=0X00; // disengage PLL to system PLLCTL_PLLON=1; // turn on PLL
#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区 void interrupt 66 PIT0(void) { count++; if(count==200) { PORTB=~PORTB;//输出取反 count=0; } PITTF_PTF0=1;//清中断标志位 }
程序中要注意的问题:
1、头文件 derivative.h 中包含为: #include <MC9S12XS128.h> #pragma LINK_INFO DERIVATIVE "MC9S12XS128" 这是 Codewarrior5.0 版本中的默认设置。 2、 设置 PLL 时钟时 SYNR 和 REFDV 须按照给的程序当中来设置,若按照程序 注释中来设置的话时钟将出现很大误差,原因我不知道,我是不断测试得到的。 3、具体的寄存器要根据给定的对应的头文件,不同的 IDE 版本中 xs128 的头文 件可能不同,应根据实际情况来写。
我想说说做智能车中应该能用到的功能 1、 输入捕捉: 4 个缓冲通道 IC0-IC3(引脚 PT0-PT3) , 4 个非缓冲通道 IC4-IC7 (引脚 PT4-PT7) 区别:缓冲和非缓冲都有一个捕捉寄存器,而 缓冲通道还有一个保持寄存器。
例程:利用 IC 对通道 0 的脉冲信号进行计数,并在 PORTB 端口显示脉冲 数 #include <hidef.h> #include <MC9S12XS128.h> #pragma LINK_INFO DERIVATIVE "mc9s12xs128" unsigned char PulseCnt; void main(void) { DDRB=0XFF; PORTB=0XFF; asm sei; TIOS=0X00; TSCR1=0X80; //设置 PORTB 为输出 //PORTB 端口的初始值 //关闭所有中断 //设置 ECT 通道 0 为 IC 工作方式 //定时器使能,正常工作
SYNR =0x40 | 0x03; REFDV=0x80 | 0x01; //SYNR =1; //PLLCLK=2*fOSC*(SYNR + 1)/(REFDV + 1) //REFDV=1;
POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV) // If POSTDIV = $00 then fPLL is identical to fVCO (divide by one). _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 口为输出 { DDRB=0xFF; PORTB=0x00; }
TSCR2=0X01; TCTL4=0X02; TIE=0X01; TFLG1=0X01; DLYCT=0X01; PulseCnt=0X00; asm cli; for(;;){} }
//禁止定时器溢出中断,预分频系数为 2 //捕捉下降沿 //允许 ECT 通道 0 中断 //清中断标志 //延迟 //计脉冲数变量初始值
相关文档
最新文档