飞思卡尔HC12系列中断模块讲解
第二章 HC12系列MCU组成及工作原理

第二章 HC S12系列MCU组成及工作原理本章介绍MCU的组成,包括CPU的结构、工作原理、寄存器、内部存储器组织,同时介绍MCU内部的时钟产生及其分配逻辑、复位与中断的工作过程及其作用、运行模式与外部存贮器的管理等,尤其是各种特殊模式、多复位源、低速时钟等。
HCS12系列各型号虽然核心部分相同,但集成外设不尽相同,本章及后续章节除特别说明外均指HCS12系列的DP256。
2.1 HC S12系列MCU的结构组成及引脚分配HC S12的D子系列的器件引脚兼容,功能设置稍有不同。
其中型号中数字9表示内部程序存储器为FLASH,否则为ROM。
有80和112个管脚的两种封装形式,主要区别在于各型号的功能优势不同,比如MC9S12DP256B有5个CAN而MC9S12DB128B只有1个CAN 等。
2.1.1 组成框图图2-1为MC9S12系列MCU的结构组成,图中左、右分别为核心与外设部分,左边如果去掉顶部的三种存储器,剩下的就是一个带有调试接口和运行监视功能的标准CPU的增强版,其中的A口、B口作为分时复用的地址/数据总线,E口的部分口线作为控制总线,在系统扩展时使用;如果包括顶部的FLASH/ROM、RAM、EEPROM等存储器,完整的左半部分就是一个没有定时器和串行接口的简化的单片微控制器。
右半部分含有八种外设,其中的ATD、ECT、SPI、BDLC、CAN等接口是许多单片机中所没有的。
此外每一种接口还具有双重功能,即通用I/O功能和特殊接口功能,在单片模式下,甚至A口、B口和E口的一部分也可以用作通用I/O接口。
如果所有接口工作在通用I/O方式下,那么I/O引脚将达到91个,这些双重功能的I/O口本身及其控制逻辑完全集成在MCU内部,其体积、功耗、可靠性、应用简单方便程度都与用户扩充的I/O口有着重要区别。
单线背景调试模式(BDM)和运行监视部分分别用于OCD方式开发支持和保证运行安全,其中BDM方式和时钟监视部分更是它的特色。
HCS12

定时器模块1:输出比较定时器延时,中断点亮led灯#include <hidef.h> /* common defines and macros */#include <mc9s12db128.h> /* derivative information *///void interrupt 8 aabreak(void); //此行可以注释掉*******unsigned int flag=0;void main(void) {EnableInterrupts;TFLG1=0x01; //清中断标志位DDRB=0xff;PORTB=0xff; //将B口定义为输出,首先输出全0TSCR1=0x80; //定时器使能,正常工作TSCR2=0x01; //将定时器进行128分频最高位不要开******** TIE=0x01; //定时器0的中断使能TIOS=0x01; //将定时器设置为输出比较状态TCTL2=0x00; //定时器与引脚断开TFLG1=0x01; //清中断标志位TC0=0x00f0; //给定时器赋值for(;;);}#pragma CODE_SEG NON_BANKEDvoid interrupt 8 aabreak(void)//中断号要正确,是中断8 (从0通道开始算起的){TFLG1=0x01; //清中断标志位if(flag==0) {PORTB=0xaa;flag=1;} else{PORTB=0x55;flag=0;}TC0=0x00f0; //给定时器赋值}2:输入捕捉PORTA输出脉冲,有定时器通道0对脉冲进行计数,结果从PORTB输出。
#include <hidef.h> /* common defines and macros */#include <mc9s12db128.h> /* derivative information */unsigned int number=0; //脉冲计数初值为0/***********初始化**********/void init(){EnableInterrupts;DDRA=0xff; //将A口定义为输出,用于输出脉冲DDRB=0xff; //B口用于输出脉冲值PORTB=0xff; //led灯全暗TIOS=0x00; //设置定时器通道0为输入捕捉TSCR1=0x80; //定时器使能TSCR2=0x01; //设置自由计数器2分频,且禁止定时器溢出中断TCTL4=0x02; //捕捉器仅下降沿捕捉TIE=0x01; //允许定时器通道0的中断TFLG1=0x01; //清除中断标志位}/*********用于产生脉冲*******/void pulse() {unsigned int i,j;PORTA=0xff; //将A口输出高电平for(i=0;i<10000;i++)for(j=0;j<100;j++) ; //延时PORTA=0x00; //使A口输出低电平}/********主函数*********/void main(void) {init();for(;;){pulse();}}/*******中断子函数******/#pragma CODE_SEG NON_BANKEDvoid interrupt 8 count() {TFLG1=0x01; //中断标志位清0number++; //计数值加1PORTB=~(number); //B口输出计数值}模数转换模块(硬件未完成,以后补充。
飞思卡尔单片机中断

在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
飞思卡尔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 EEPROM3:不勾选V erify memory image after loading code,为了节省烧录时间,不勾选这个选项。
3: 勾选Run after successful load.(可以在程序烧完的时候,自动的运行程序,看仪表是否能工作,可以作为仪表的第一次粗测)4:点击“打开”5:等待烧录完成,图7,正在擦除……图8,正在编程……图86:如果在完成编程后,仪表没有自动的进入工作状态,有以下几种可能:a.仪表有问题b.烧录时出现问题,这个问题可以通过配置烧录选项来排除,见图6,可以勾选选项V erify memory image after loading code ,在编程后会进行程序校验,如果校验错误表示烧录出现问题,一般来说出现烧录错误的几率很小,但也不排除。
为了在批量烧录的时候,节省时间,没有选择校验。
飞思卡尔单片机中断

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

HCS12微控制器系列教程---第一讲:PWM 模块介绍该教程以MC9S12DG128单片机为核心进行讲解,全面阐释该16位单片机资源。
本文为第一讲,开始介绍S12 MCU的PWM模块。
PWM 调制波有8 个输出通道,每一个输出通道都可以独立的进行输出。
每一个输出通道都有一,一个周期控制寄存器和两个可供选择的时钟源。
每一个PWM 输出个精确的计数器(计算脉冲的个数)通道都能调制出占空比从0—100% 变化的波形。
PWM 的主要特点有:1、它有8 个独立的输出通道,并且通过编程可控制其输出波形的周期。
2、每一个输出通道都有一个精确的计数器。
3、每一个通道的PWM 输出使能都可以由编程来控制。
4、PWM输出波形的翻转控制可以通过编程来实现。
5、周期和脉宽可以被双缓冲。
当通道关闭或PWM计数器为0时,改变周期和脉宽才起作用。
6、8 字节或16 字节的通道协议。
,他们提供了一个宽范围的时钟频率。
7、有4 个时钟源可供选择(A、SA、B、SB)8、通过编程可以实现希望的时钟周期。
9、具有遇到紧急情况关闭程序的功能。
10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。
HCS12微控制器系列教程---第二讲:PWM 寄存器简介1、PWM启动寄存器PWMEPWME 寄存器每一位如图1所示:复位默认值:0000 0000B图1 PWME 寄存器每一个PWM 的输出通道都有一个使能位PWMEx 。
它相当于一个开关,用来启动和关闭相应通道的PWM 波形输出。
当任意的PWMEx 位置1,则相关的PWM输出通道就立刻可用。
用法:PWME7=1 --- 通道7 可对外输出波形PWME7=0 --- 通道7 不能对外输出波形注意:在通道使能后所输出的第一个波形可能是不规则的。
当输出通道工作在串联模式时(PWMCTL寄存器中的CONxx置1),那么)使能相应的16位PWM 输出通道是由PWMEx的高位控制的,例如:设置PWMCTL_CON01 = 1,通道0、1级联,形成一个16位PWM 通道,由通道1 的使能位控制PWM 的输出。
飞思卡尔十二位单片机HCS12(9S12)

Place your image on top of this gray box. If no graphic is applicable, delete gray box and notch-out behind gray box, from the Title Master
[6Mb]
HCS12 Technical Training Module 1 – System Overview, Slide 5
MOTOROLA and the Stylized M Logo are registered in the US Patent & Trademark Office. All other product or service names are the property of their respective owners. © Motorola, Inc. 2001.
4K BYTES EEPROM
12K SRAM
256K FLASEEPROM
PWM 8 CHAN
ECT SCI 8 0 CHAN
SCI 1
Internal Bus
SPI 2 SPI 1 or or PWM PWM SPI 0 CH CH 4-7 0-3 BKP INT MMI
CRG
HCS12 CPU
MOTOROLA and the Stylized M Logo are registered in the US Patent & Trademark Office. All other product or service names are the property of their respective owners. © Motorola, Inc. 2001.
飞思卡尔中断设置方式

中断的关闭与开放开放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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HCS12中断
默认状态::
•默认状态
在进入中断服务程序时,,I位自动置1,禁止其他可屏蔽中断
–在进入中断服务程序时
即使有优先级更高的中断请求,,也必须等当前中断服务程序执行完以后才–即使有优先级更高的中断请求
能响应
–优先级的作用只有在多个中断源同时请求中断时在能体现
–无法实现中断嵌套
位清零::
如果在进入中断服务程序时,,手动对I位清零
•如果在进入中断服务程序时
任何其他可屏蔽中断都可以被响应,,无论其优先级有多高
–任何其他可屏蔽中断都可以被响应
中断响应由时间控制,,可以实现中断嵌套
–中断响应由时间控制
–对中断执行无法预测
•HPRIO寄存器
中的中断向量的后八位,,可以改变该中断的优先级–写入HPRIO中的中断向量的后八位
同样,,优先级的作用只有在多个中断源同时请求中断时在能体现
–同样
中断优先处理机制
1.在中断服务程序中,首先对I为清零,即EnableInterrupts
2.选择优先级更高的中断源可以进入响应中断
3.设置优先等级
–两级
•一个中断源为低优先级,其他为高优先级
•在低优先级中断服务程序中,对I位清零
•在高优先级中断服务程序中,不清零
–多级
•利用局部的中断屏蔽位
•比如Timer Channel0 的中断屏蔽位TIE_C0I
优先机制–多级
•情况1:
–每个中断都单独发生,在一个中断程序执行时,没有其他中断
•情况2:
–在执行ECT1的中断服务程序时,ECT0请求中断
–ECT0中断服务程序将被执行
•情况3:
–在执行ECT2的中断服务程序时,ECT0请求中断
–ECT2的中断服务程序执行结束后,执行ECT0的中断服务程序•情况4:
–ECT1,ECT2同时请求中断
–ECT1的中断服务程序先执行,当EnableInterrupts后
–执行ECT2的中断服务程序
–ECT2的中断服务程序执行结束后,返回执行ECT1的中断服务程序
方案:优先机制–多级
•在ECT0中断服务程序中:
•在ECT1中断服务程序中(自定义优先级最低):
•在ECT2中断服务程序中(自定义优先级最高):
–用户程序
TIE_C1I = 0; //关闭ECT1局部中断TIE_C2I = 1; //开放ECT2局部中断EnableInterrupts; //开放全局中断…
TIE_C1I = 1; //开放ECT1局部中断TIE_C2I = 1; //开放ECT2局部中断
TIE_C0I = 1; //开放ECT0局部中断TIE_C2I = 1; //开放ECT2局部中断EnableInterrupts; //开放全局中断…
TIE_C0I = 1; //开放ECT0局部中断TIE_C2I = 1; //开放ECT2局部中断。