《嵌入式操作系统及ARM Cortex-MO》课件第四章.pptx

《嵌入式操作系统及ARM Cortex-MO》课件第四章.pptx

  1. 1、本文档共60页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

第四章 异常与中断管理; 本章将介绍LPC824微控制器的异常与中断处理方法,重点介绍S断、多速率定时器中断和外部中断的响应

方法,其他异常与中断的管理方ys法Ti与ck之定类时似器。中在启动文件startup_LPC82x.s中定义了中断向

量表,以汇编语言的格式为各个异常和中断分配了地址标号,如表4-1所示。

表4-1异常与中断向量的地址标号;

表4-1中用汇编语言表示的各个异常与中断的地址标号,也用作C语言的异常与中断服务函数名,例

如,SysTick定时中断的中断服务函数为“voidSysTick_Handler(void)”。; LPC824微控制器的异常就是Cortex-M0+的6个异常,即Reset、NMI、HardFault、SVCall、

PendSV和SysTick,见1.6节表1-11。其中,Reset、NMI和HardFault异常的优先级依次为-3、-2

和-1。SVCall、PendSV和SysTick异常的优先级可以配置为0、1、2或3,由系统异常优先级寄

存器SHPR2和SHPR3设定,见表1-1。

LPC824异常的管理方法为:首先,配置异常,或称为初始化异常,异常是不能关闭的,所以,初

始化异常是指设定异常产生的方式;然后,编写异常服务函数,在异常服务函数中添加对异常的

响应处理。下面以SysTick异常(习惯上称SysTick定时器中断)为例,介绍异常的程序设计方法。

在项目ZLX01中,main函数实现LED灯闪烁的方式为:在无限循环体中,重复执行“延时约1秒

再使LED灯闪烁”的操作。这种方式的缺点在于用户需要的LED灯闪烁功能只占用极少的CPU时

间,而绝大部分CPU工作时间被延时函数占用,无法执行其他的操作。为了消除延时函数的影响,

现在可用SysTick定时器中断服务实现LED灯闪烁功能,使得main函数的无限循环体中不再需要

延时函数。

在项目ZLX01的基础上,新建项目ZLX02,保存在目录“D:\ZLXLPC824\ZLX02”中,此时的项

目ZLX02与ZLX01完全相同(注意:工程文件名也相同)。新建文件systick.c和systick.h(这两

个文件均保存到D:\ZLXLPC824\ZLX02\BSP目录下),并修改原来的main.c、includes.h和

bsp.c文件,这些文件的代码和说明如程序段4-1至程序段4-5所示,项目ZLX02实现的功能如图

4-1所示。;

图4-1 项目ZLX02的功能框图

; 程序段4-1systick.c文件

1 //Filename:systick.c

2

3 #includeincludes.h

4

5 voidSysTickInit(void)

6 {

7 SysTick->LOAD=300000-1;

8 SysTick->VAL=0;

9 SysTick->CTRL=(1uL<<0)|(1uL<<1)|(1uL<<2);

10 }

11

第5~10行的SysTickInit函数用于初始化SysTick定时器。第7~9行的SysTick结构体指针

定义在LPC82x.h中,这里的“SysTick->LOAD、SysTick->VAL和SysTick->CTRL”分别对应

着表1-6中的SysTick重装值寄存器SYST_RVR、SysTick当前计数值寄存器SYST_CVR和SysTick

控制与状态寄存器SYST_CSR。根据1.5节可知,当LPC824工作在30MHz时钟下时,第7行将

SYST_RVR设置为300000-1,SysTick定时器减计数到0的定时周期为100ms,即SysTick定时器中

断频率为100Hz。第8行清零SysTick定时器的当前计数值,当SysTick定时器启动后,SYST_RVR

的值自动装入SYST_CSR中。第9行打开SysTick定时器中断,并启动SysTick定时器。

; 12 voidSysTick_Handler(void)

13 {

14 staticInt32Ui=0;

15 i++;

16 if(i>=100)

17 {

18 LEDBlink();

19 i=0;

20 }

21 }

第12~21行的SysTick_Handler函数为SysTick定时器中断服务函数,函数名必须为

SysTick_Handler(由表4-1中查得)。第14行定义静态变量i,每次SysTick中断到来后,i的值自

增1(第15行),当i的值大于或等于100时(第16行为真),第18行调用LEDBlink函数使LED灯D9闪

烁,然后,第19行清零i。因此,每

文档评论(0)

酱酱 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档