文件名称:
六、认识PIC32的定时器与中断体系.pdf
开发工具:
文件大小: 133kb
下载次数: 0
上传时间: 2019-09-03
详细说明:
PIC32 的中断,按照中断向量入口,可以分为,单中断向量入口和多中断向量入口。实例中我们使用一个定时器让L1快闪,一个定时器让L2慢闪。定时时间为(PR2+1)*256*(140)us=04
IFSObits .T2IF=0
∥中断标志位清0
IPC2 bits. T2IP=1;∥中断优先级设置为1(最低)
TMR3=0
PR3=62499
T3CON=0X8070;使能T3,256分频,内部定时器模式
∥定时时间为(PR3+1)*256*(40)s=0.4
IFS0bits.T3IF=0;中断标志位清0
IPC3bits tiP=3
∥中断优先级设置为3
IECObits T2IE=1;∥使能定时器2中断
IEC0 bits .t3E=1;∥(能定时器3中断
whilc(1);
在上面的例子中,一个中断优先级设置为1,一个中断优先级设置为3,那中断如何声
明呢,按照范例给出的办法,或者可以声明为void_ISR(0.ipl3) InterruptHandler(void)。
但如果大家按照书本上写的声明为void_ISR(0,ipll) InterruptHandler(void),这种方式将
导致总线错误,ISR程序无法执行,有兴趣的可以通过 MPLAB DE的SIM功能验证一下。
看到这里,大家可能觉得要结束了。不过随着笔者对相关文档的阅读,却发现,单中断
向量的中断服务程序应该如此声明更合适
void ISR SINGLEO InterruptHandler(void)
我们提供的程序,最后就采取了此方法,由于后续的所有代码不打算用单中断向量入口
方式,对此种方式的研究到此为止,包括此方式下的中断嵌套,不再研究。
2、多中断向量入口方式
接下来实现的功能不变,只是换一种方式实现。采取此种方式,就要先介绍一下中断优
先级。与PIC的16BII(比如PIC24F)比较,PIC32的中断优先级依然是从0到7级,主循
环可以设置一个优先级,默认是0,只有中断源的优先级高于主循环,默认卜是设置成1到
,才可以打断主循环,进入屮断服务子程序。同一优先级,可以靠子优先级决定同时发生
中断吋谁先响应,主优先级和了优先级致,还有独一无二的自然优先级决定哪个中断源先
进入中断服务程序。那低级优先级中断时高优先级可否打段,可以,但有技巧,这个放到下
点介绍。现在依旧实现第一点范例的功能,换一种形式。这里我们将依旧采用T2,T3,
不过为了以小区别,这次由T3控制RB3,T2掉制RB2。
#include
#includc
unsigned int T2 count.T3 count;/定义2个32位计数器
/注意,优先级别关键字ipl3,必须与主程序中定义的中断优先级致
void ISRC TIMER 3 VECTOR, ipl3) T3IsrDEAL(void
IFSObits. T3IF=0
T3count +
if(T3 count--8)定时时间为8*04-32s
T3count=O
LATBINV=0x0008;∥翻转LATB3
∥注意,优先级別关键字jpll,必须与主程序中定义的中断优先级一致
void ISR( TIMER 2 VECTOR, ipll) T2ISRDEAL(void
IFSObits. T2IF=0
T2count ++
if(T2 count=-2)定时时间为2*04=0.8s
Recount=0
LATBINV=0x0004;/翻转LATB2
int main(void)
DDPCONbitsITAGEN=0;止JTAG口,与PIC24不同,只能在代码中禁止
INTEnable SystemMulti VectoredIntO;∥设置为多向量中断
CM2CON=0
ODCBCLR-0X000F;写1,对 odcb bite0-3清0,其它位维持现状
ADIPCFGSET=0X000F;写1,对ADC1 pfg bite0-3置1,其它位维持现状
LATBSET= OXOOOF
∥写1,对 latB bite0~3置1,其它位维持现状
TRISBCLR=OXOOOF
∥写1,对 trisb bi0-3清0,其它位维持现状;
TMR2=0
PR2=62499
T2CON=08070;
∥使能T2,256分频,内部定时器模式
∥定时时间为(PR2+1)*256*(140us=0.4
IFSObits T2IF=0
∥中断标志位清0
IPC2bits. T2IP=1
∥中断优先级设置为1(最低)
TMR3=0
PR3=62499:
T3CON=0X8070:
∥使能T3,256分频,内部定时器模式
∥定时时间为(PR3+1)*256*(140us=0.4s
IFSObits t3IF=0
∥中断标志位清0
IPC3bits. tiP=3
∥中断优先级设置为3
IECObits T2IE= 1
∥使能定时器2屮断
IECObits T3E=1
∥使能定时器3中断
while(1);
需要提醒的是,向量号,比如 TIMER2 VECTOR,请到MCC32的芯片头文件中找,
比如p32mx40f512hh。人家看到没有,两种方式,初使化仅仅是更改一行系统宏。而多向
量的写法更加的清晰,与PIC的16BIT的写法是很接近的。
3、在多中断向量入口方式下实现中断嵌套
所谓中断嵌套,也就是高优先级打算低优先级,这里的优先级指的是主优先级,如果主
优先级一致,即使子优先级更髙,也不能打断已经响应的同一主优先级的中断源。我们写个
很无聊的程序来证明。我们先触发一个定时器中断,优先级比较低,中断服务子程序则是直
接一个死循环,即永不退出,然后,我们看看一个高优先级屮断的定时器,怎么打断它
在上一个程序的基础上,仪仪把T2的中断服务程序做如下修改。
void ISR TIMER 2 VECTOR, ipll) T2IsRDEAL(void
asm( eI
);∥无需要打开,即可实行中断嵌套
hilc(1)
∥不做任何事情,看T3是否打断它
IFSObits T2IF=0: //
经过实际测试,笔者发现了一个有趣的事实,即,我们不需要手动使能,T3也可打断
T2,让T3的闪灯程序执行下去。现在证实,PIC32就和PIC16BIT一样,在中断嵌套上是
很方便的。实际提供的代码,为了加快演示速度,T3定时时间以及控制的LED做了些调整。
4、中断设置的些高级技巧
如果需要中断紧急,则可把函数安排在向量入口,即节约一条跳转指令的时间,对于多
中断向量,语法为 void ISR AT VECtOR( vectornumber, ipl lever) ISRDEAL(void);对于单
中断向量,语法为void_ ISR SINGLE AT VECTOR( ISRDEAL(void
当然,为了配合 AT VERTOR关键字,必须提前设置向量间隔。因为这时候的屮断向
量入口地址不再是·条简单的眺转指令。具体方法,请参考 MASTER2009培训会上,PIC32
部分的章节。由于开发进度的关系,笔者暂时不亲自验证这一功能
5、中断保护与还原
放到这甲才说,原因是,如果你不使用RTOS,你不需要关心,MCC32编译器会帮你
完成这一切,什么时候需要关心,等你用RTOS的时候。这里笔者就不介绍了。有兴趣的可
以找一下RTOS针对PIC32的移植,里面有详细的描述,不过,你要对着MIPS汇编稍微查
卜指令集。目前,uC/OS-I,以及 FREERTOS针对PIC32的相关移植均可以找到。需要
提醒的是, uC/OS-I并非商业免费。
6、中断的优越性
似乎这个应该放在本章节的前面比较合适。不过看了前儿点,相信大家对PIC32的中断
体系有所了解。PIC32的中断的一个重要性能就是中断延迟,从中断标志位置1,到转入中
断向量处,这个时间PC32只需要4个TCY,比起ARM7是快了很多。至于其它的,就暂
时不赘述,前面已经描述得差不多了。
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.