您好,欢迎光临本网站![请登录][注册会员]  
文件名称: 六、认识PIC32的定时器与中断体系.pdf
  所属分类: C
  开发工具:
  文件大小: 133kb
  下载次数: 0
  上传时间: 2019-09-03
  提 供 者: weixin_********
 详细说明: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最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 输入关键字,在本站1000多万海量源码库中尽情搜索: