- 1、本文档共60页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)