飞思卡尔单片机中断
- 格式:ppt
- 大小:1.33 MB
- 文档页数:26
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程序已通过本人亲自验证,可实现相关功能,对代码中有疑问的朋友欢迎在主页区留言交流。
本教程试图用最少的时间教你飞思卡尔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。
中断的关闭与开放开放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. 中断优先级的设置方法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。
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。
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清零。
自定义中断向量的情况说明#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()函数的绝对地址约束存在二义性。