- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
西安工业大学电信学院嵌入式课件chapter_5(第5-8节)分析
5.8 向量中断控制器(VIC) 保护使能寄存器 保护使能寄存器(VICProtection): 位 [31:1] 0 功能 — 当该位为1时,只能在特权模式下访问VIC寄存器。 在某些场合可能需要禁止在用户模式下访问VIC寄存器,以提高软件的安全等级。 IRQ中断的设计实例 设置外部中断0产生向量IRQ中断后执行中断服务程序“IRQ_Eint0( )”。 ... PINSEL1 = (PINSEL10xFFFFFFFC)|0x01; VICIntSelect = 0 VICVectCntl0 = (0x20 | 14); VICVectAddr0 = (int)IRQ_Eint0; EXTINT = 0x01; VICIntEnable = (1 14); ... C代码: 1.设置引脚连接模块,将P0.16设置为外部中断功能; 步骤: 2.设置所有中断为IRQ中断; 3.将外部中断0(在中断源列表中序号14)设置到优先级0中,并使能IRQ中断; 4.将外部中断0的中断服务程序写入对应优先级的地址寄存器中; 5.清除外部中断0的标志后使能外部中断0; (1) (2) (3) (4) (5) (5) 0x0000 0000 0xFFFF FFFF 用户程序 中断服务程序 异常向量表 1.正在执行用户程序; ① 2.外部中断0发生中断; ② 3.VIC硬件将中断服务程序地址装入VICVectAddr寄存器; ④ 4.程序跳转至异常向量表中IRQ入口0x0018处; 5.执行指令跳转至VICVectAddr寄存器中的中断服务地址; ⑤ ⑥ 6.中断服务程序执行完毕,返回被中断的用户程序继续执行被中断的代码。 图示IRQ中断的发生过程 ③ IRQ_Eint0 ??? VICVectAddr0 VICVectAddr IRQ_Eint0 ⑤ LDR PC, [PC, #-0xff0] 0x0000 0000 0xFFFF FFFF 用户程序 中断服务程序 异常向量表 ① ② ④ ⑤ ⑥ 图示IRQ中断的发生过程 ③ IRQ_Eint0 ??? VICVectAddr0 VICVectAddr IRQ_Eint0 ⑤ LDR PC, [PC, #-0xff0] 注意: 任何IRQ中断产生之后,微控制器跳转到地址0x18执行代码,该地址处的指令为: LDR PC, [PC, #-0xff0] 在执行该指令时,PC指向当前指令后的第2条指令,即地址0x20。 该指令将内存地址: 0x20-0xFF0 = 0xFFFFF030 处的内容存入PC,该地址正是 VICVectAddr寄存器的地址。 所以一条ARM指令即可实现程序向中断服务程序的跳转。 5.8 向量中断控制器(VIC) 使用VIC的注意要点 如果在片内RAM中调试程序,并使用了中断,那么必须将存储器映射控制设置为内部RAM模式; 将多个中断源设置为FIQ,将增加中断响应延时,所以建议FIQ中断只有一个中断源; ADS1.2规定在定义中断服务函数时必须加入关键字“__irq”,保证函数返回时会切换处理器模式; 在退出中断服务程序时要清零相应外设的中断标志,以及VICVectAddr寄存器,为响应下次中断作好准备。 VIC相关启动代码分析 ... /* 初始化VIC */ VICIntEnClr = 0xffffffff; VICVectAddr = 0; VICIntSelect = 0; ... 在LPC2100、LPC2200的启动代码中包含有VIC初始化程序,默认是禁止所有中断。 TargetResetInit函数: InitStack ... MSR CPSR_c,#0xdf LDR SP,=StackUsr MOV PC,R0 在LPC2100、 LPC2200的启动代码中默认是关闭IRQ和FIQ中断的。如果用户需要使用这两个中断,则要设置CPSR寄存器的I位或F位,这需要在特权模式下处理。最简单的方法是在启动代码中设置(修改0xdf值)。 处理器各模式堆栈设置: CODE32 AREA vectors,CODE,READONLY ENTRY Reset LDR PC, ResetAddr LDR PC, UndefinedA
文档评论(0)