LPC2103 怎么开stm32关全局中断断

LPC2103学习之外部中断
> LPC2103学习之外部中断
LPC2103学习之外部中断
今天下午学习了LPC2103的外部中断,相对来说比较简单。只是几个寄存器的操作。本文引用地址:LPC2103有三个外部中断源。分别是外部中断0(EINT0),外部中断1(EINT1),外部中断2(EINT2)。另外LPC2103的10个捕获输入也可以作为外部中断输入,跟外部中断不同之处就是不能将掉电模式下的CPU唤醒。下面的图展示了LPC2103的外部中断系统的结构,看到这个结构,对寄存器的操作一下也明白了不少。下面是4个跟外部中断有关的寄存器下面是寄存器的具体介绍,首先是外部中断标志寄存器EXINT。其中需要我们注意的是相应中断使标志位置1时,我们需要向相应寄存器位写1以清除标志位。而且在电平触发方式下,只有引脚处于无效状态时才又可能将标志位清除。比如设置的为高电平触发,则直到相应引脚变为低电平时我们才能将标志位清0.具体寄存器说明如图:外部中断唤醒寄存器EXTWAKE.EXTWAKE寄存器中的位允许相应的外部中断将处理器从掉电模式下唤醒。且实现掉电唤醒不需要在向量中断控制器中使能相应的中断。这样做的好处是允许外部中断唤醒处理器,但不产生中断。具体寄存器说明如图:外部中断模式寄存器EXTMODE。此寄存器主要用来选择中断方式是电平触发还是边沿触发。注意的是只有选择用作EINT功能的引脚,并通过VICIntEnable使能相应中断,才能产生外部中断。具体寄存器说明如图:外部中断极性寄存器EXTPOLAR此寄存器主要是与上面的模式寄存器相配合,准确描述出中断信号波形。具体寄存器说明如图:下面的图展示的是外部中断触发设置下面说下外部中断引脚设置中需注意到的两点:1 如果要产生外部中断,除了设置相应的引脚模块外,还需要设置VIC模块,否则外部中断就只能反映在EXTINT寄存器中。2 若使器件进入掉电模式并通过外部中断唤醒,软件应正确设置引脚外部中断功能。下面图展示的就是外部中断与向量中断控制器(VIC)的关系由图可知,外部中断0~2分别对应VIC通道的14~16。其中VICIntEnable控制通道的中断使能,VICIntSelect用以分配通道中断。当为1时,对应中断被分配为FIQ,为0时则为IRQ。另外分配为IRQ时,还需要设置对应的通道控制寄存器VICVectorCntln和地址寄存器VICVectAddrn。下面两图为电平中断与边沿中断的设置,以外部中断EINT0举例说明。参考资料《EasyARM2103教材》
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一LPC2103之中断向量控制器
Vectored Interrupt Controller (VIC)
ARM7TDMI内核具有两个中断输入,分别为IRQ中断和FIQ中断。中断向量控制器不是ARM设计的,ARM只提供以上两个中断输入接口,中断向量控制器是由各个厂商根据自己的实际情况设计的。下面介绍的是lpc2000系列的中断向量控制器。
中断向量控制器的作用是允许哪些中断源可以产生中断、可以产生哪类中断、产生中断后执行哪段服务程序。
允许中断源产生中断由寄存器VICIntEnable和VICIntEnClr控制,前者使能中断,后者禁止中断。VICIntEnable寄存器中每一位控制着一个中断源,各中断源的位置与中断源列表所示相同。向某位写入1时,允许对应的中断源产生中断。(这一部分中的寄存器操作和此寄存器相类似,后面不再叙述)VICIntSelect为选择IRQ或FIQ寄存器。相应位写0为IRQ,写1为FIQ。
中断输入请求可以在VIC中被设置为以下三类:
1、FIQ中断:具有最高优先级;
使用时最好至多设置一个中断源为FIQ,因为设置多个FIQ中断,在发生中断后要在程序中查找中断源,降低了效率。
2、向量IRQ中断:具有中等优先级;
VIC最多支持32个向量IRQ中断,这些中断被分为32个优先级,并且为每个优先级指定一个服务程序入口地址。在发生向量IRQ中断后,相应优先级的服务程序入口地址被装入向量地址寄存器VICVectAddr中,通过一条ARM指令即可跳转到相应的服务程序入口处,所以向量IRQ中断具有较快的中断响应。
3、非向量IRQ中断:具有最低优先级;
任何中断源都可以设置为非向量IRQ中断。它与向量IRQ中断的区别在于前者不能为每个非向量IRQ中断源设置服务程序地址,而是所有的非向量IRQ中断都共用一个相同的服务程序入口地址。当有多个中断源被设置为非向量IRQ中断时,需要在用户程序中识别中断源,并分别作出处理。所以非向量IRQ中断响应延时相对较长。
向量IRQ中断相关寄存器。
VICVectCntl0~15和VICVectAddr0~15两类寄存器与向量IRQ中断设置有关,前者为中断源分配向量IRQ中断的优先级,后者为该中断优先级设置服务程序入口地址。寄存器名称最后的数字同时也代表该寄存器控制的向量IRQ中断的优先级,数值越小优先级越高。注意:如果将同一个中断源分配给多个使能的向量IRQ中断,那么该中断源发生中断时,会使用最高优先级(最低编号)的寄存器设置。
在发生向量IRQ中断后,VIC能将对应中断的服务程序地址存入VICVectAddr寄存器中。如果为非向量中断,将把VICDefVectAddr寄存器的值存入该寄存器。在异常向量表的IRQ异常入口处放置一条指令,将VICVectAddr寄存器的内容装入程序计数器(PC),就可以跳转到当前中断的服务函数。
这样的设计可以减小中断响应延时。
中断向量控制器Vectored Interrupt Controller (VIC)
控制32个中断请求输入,并且可编程的将这些中断分成三类:FIQ, vectored IRQ, and non-vectored IRQ
快速中断请求Fast Interrupt reQuest
(FIQ)有最高的优先级。如果有一个以上的请求被分配到FIQ,VIC将它们的请求相或以产生FIQ信号给ARM处理器。当只有一个中断请求分配给FIQ时,将会产生一个最短的可能的FIQ延时(即达到最快的中断请求时间),因为FIQ服务程序单单处理这个中断。但是如果多个中断分配给FIQ,FIQ服务程序必需读VIC寄存器以识别是哪个中断产生了FIQ请求。
IRQs处于中等优先级,但32个中断请求中只有16个可以分配到这个类中。32个中断请求中的任何一个都可以分配到16个vectored
IRQ slots中的任意一个。这些槽(slots)中的slot 0具有最高优先级而slot 15为最低优先级。
Non-vectored IRQs 处于最低优先级。
VIC将所有的Vectored IRQs和Vectored
IRQs请求相或后产生的IRQ信号传递给ARM处理器。IRQ服务程序通过读VIC的相关寄存器并开始跳转。如果vectored
IRQs产生请求,VIC将提供具有最高优先级的IRQs服务程序的地址,否则它会提供所有non-vectored
IRQs共用的默认程序地址。默认程序可以读出另一个VIC寄存器看看是哪个IRQs激活了。
&VIC中所有的寄存器都为字寄存器,即32bit,不支持字节和半字的读和写操作.&&
.最多32个中断请求输入
.16个向量IRQ中断
.16个优先级,可动态分配给中断请求.
.可产生软件中断
VICIRQStatus&&&
(*((volatile unsigned long *)
0xFFFFF000))&&&&&&&&&&&&&&&&&&&&&&&&&
// IRQ状态寄存器,该寄存器可以读出使能并且分配给IRQ的中断请求
VICFIQStatus&&&
(*((volatile unsigned long *)
0xFFFFF004))&&&&&&&&&&&&&&&&&&&&&&&&&
// FIQ状态寄存器,该寄存器可以读出使能并且分配给FIQ的中断请求
VICRawIntr&&&&&
(*((volatile unsigned long *)
0xFFFFF008))&&&&&&&&&&&&&&&&&&&&&&&&&&
//原始中断状态寄存器,不论使能和分类,该寄存器都可读出所有32个中断请求/软件中断的情况
VICIntSelect&&&
(*((volatile unsigned long *)
0xFFFFF00C))&&&&&&&&&&&&&&&&&&&&&&&&&&&
//中断选择寄存器,将32个中断分类为IRQ或者FIQ
VICIntEnable&&&
(*((volatile unsigned long *)
0xFFFFF010))&&&&&&&&&&&&&&&&&&&&&&&&&&
//中断使能寄存器
VICIntEnClr&&&&
(*((volatile unsigned long *)
0xFFFFF014))&&&&&&&&&&&&&&&&&&&&&&&&&&&
//中断清除寄存器,写1清除相应中断请求
VICSoftInt&&&&&
(*((volatile unsigned long *)
0xFFFFF018))&&&&&&&&&&&&&&&&&&&&&&&&&&&
//软件中断寄存器,该寄存器内容与32个来自各种外设功能的中断请求相或
#define VICSoftIntClear (*((volatile
unsigned long *)
0xFFFFF01C))&&&&&&&&&&&&&&&&&&&&&&&&&&&
//软件中断清除寄存器,相应位写1清除软件中断寄存器中的一位或多位
VICProtection&& (*((volatile
unsigned long *)
0xFFFFF020))&&&&&&&&&&&&&&&&&&&&&&&&&&
//保护使能寄存器,该寄存器允许允许在特权模式下限制访问VIC寄存器
#define VICVectAddr
&&&&(*((volatile
unsigned long *)
0xFFFFF030))&&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址寄存器,IRQ中断发生时,IRQ服务程序跳转到该寄存器读出的值
#define VICDefVectAddr&
(*((volatile unsigned long *)
0xFFFFF034))&&&&&&&&&&&&&&&&&&&&&&&&
//默认向量地址寄存器,该寄存器保存non-vectored
IRQs的中断服务程序(ISR)地址
VICVectAddr0&&&
(*((volatile unsigned long *)
0xFFFFF100))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址0寄存器,0-15分别保存16个vectored IRQ slots的中断服务程序(ISR)地址
VICVectAddr1&&&
(*((volatile unsigned long *)
0xFFFFF104))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址1寄存器
VICVectAddr2&&&
(*((volatile unsigned long *)
0xFFFFF108))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址2寄存器
VICVectAddr3&&&
(*((volatile unsigned long *)
0xFFFFF10C))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址3寄存器
VICVectAddr4&&&
(*((volatile unsigned long *)
0xFFFFF110))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址4寄存器
VICVectAddr5&&&
(*((volatile unsigned long *)
0xFFFFF114))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址5寄存器
#define VICVectAddr6&
&&(*((volatile unsigned long *)
0xFFFFF118))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址6寄存器
VICVectAddr7&&&
(*((volatile unsigned long *)
0xFFFFF11C))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址7寄存器
VICVectAddr8&&&
(*((volatile unsigned long *)
0xFFFFF120))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址8寄存器
VICVectAddr9&&&
(*((volatile unsigned long *)
0xFFFFF124))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址9寄存器
#define VICVectAddr10&&
(*((volatile unsigned long *)
0xFFFFF128))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址10寄存器
#define VICVectAddr11&&
(*((volatile unsigned long *)
0xFFFFF12C))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址11寄存器
#define VICVectAddr12&&
(*((volatile unsigned long *)
0xFFFFF130))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址12寄存器
#define VICVectAddr13&&
(*((volatile unsigned long *)
0xFFFFF134))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址13寄存器
#define VICVectAddr14&&
(*((volatile unsigned long *)
0xFFFFF138))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址14寄存器
#define VICVectAddr15&&
(*((volatile unsigned long *)
0xFFFFF13C))&&&&&&&&&&&&&&&&&&&&&&&&
//向量地址15寄存器
VICVectCntl0&&&
(*((volatile unsigned long *)
0xFFFFF200))&&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制0寄存器,向量控制寄存器0-15分别控制16个16 vectored IRQ slots
VICVectCntl1&&&
(*((volatile unsigned long *)
0xFFFFF204))&&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制1寄存器
VICVectCntl2&&&
(*((volatile unsigned long *)
0xFFFFF208))&&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制2寄存器
VICVectCntl3&&&
(*((volatile unsigned long *)
0xFFFFF20C))&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制3寄存器
VICVectCntl4&&&
(*((volatile unsigned long *)
0xFFFFF210))&&&&&&&&&&&&&&&&&&&
//向量控制4寄存器
VICVectCntl5&&&
(*((volatile unsigned long *)
0xFFFFF214))&&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制5寄存器
VICVectCntl6&&&
(*((volatile unsigned long *)
0xFFFFF218))&&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制6寄存器
VICVectCntl7&&&
(*((volatile unsigned long *)
0xFFFFF21C))&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制7寄存器
VICVectCntl8&&&
(*((volatile unsigned long *)
0xFFFFF220))&&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制8寄存器
VICVectCntl9&&&
(*((volatile unsigned long *)
0xFFFFF224))&&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制9寄存器
#define VICVectCntl10&&
(*((volatile unsigned long *)
0xFFFFF228))&&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制10寄存器
#define VICVectCntl11&&
(*((volatile unsigned long *)
0xFFFFF22C))&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制11寄存器
#define VICVectCntl12&&
(*((volatile unsigned long *)
0xFFFFF230))&&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制12寄存器
#define VICVectCntl13&&
(*((volatile unsigned long *)
0xFFFFF234))&&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制13寄存器
#define VICVectCntl14&&
(*((volatile unsigned long *)
0xFFFFF238))&&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制14寄存器
#define VICVectCntl15&&
(*((volatile unsigned long *)
0xFFFFF23C))&&&&&&&&&&&&&&&&&&&&&&&&&
//向量控制15寄存器
Vector Control registers 0-15 (VICVectCntl0-15 -
0xFFFF F200-23C)
Int_request/
Sw_int_assig
该数值对应的中断分配到该 vectored IRQ slot中
IRQslot_en
置1表示该vectored IRQ slot使能
Protection Enable register (VICProtection -
0xFFFF F020)
VIC_access
0——用户模式和特权模式下均可访问VIC寄存器
1——只有在特权模式下才可访问VIC寄存器
上面是一个用来介绍VIC及各种寄存器关系的图,因为博客里不能放太大的图,我只能将其缩小得几乎无法看见内容的大小了.
曾经有领导劝我心态要平和,不能以加班来证明工作的好坏,我真的虚心接受.其实我也不喜欢加班,只是太忙不得已而已.某事在人,成事在天,自己尽了力,就不用去管成与不成了,总觉得这不是我的作为.但也没有办法,古人说的话总是有几分道理的.
上面的图是针对lpc213x或者lpc214x而言的,看了一下lpc2400的英文文档,有些寄存器好像有些不一样.也就是说我下面写的寄存器的数量可能与我前一篇讲的不完全一致,我想细节不影响道理.我尽可能使用lpc2400的文档来学习,因为我手里的开发板就是这样型号的.
我们前面讲到,很多外设的地址都映射在APB地址段,而VIC的寄存器地址映射在AHB地址空间内.也就是说,它的地址是落在0xF000
0000 ~ 0xFFFF FFFF地址空间内.
.VICIRQStatus:IRQ状态寄存器.这个寄存器读出中断请求是否使能,被分类为IRQ.
.VICFIQStatus:FIQ状态寄存器.这个寄存器读出中断请求是否使能,被分类为FIQ.
.VICRawIntr:原始中断状态寄存器.这个寄存器读出32个原始的中断请求而不考虑它们的是否是软件中断使能和分类.
.VICIntSelect:中断选择寄存器.这个寄存器将32个中断请求分类为FIQ或者IRQ.
.VICIntEnable:中断使能寄存器.这个寄存器控制32个中断请求以及软件中断被使能为FIQ和IRQ
.VICIntEnClr:中断使能清除寄存器.这个寄存器清除一个或多个中断位.
.VICSoftInt:软中断寄存器.这个寄存器的内容与32个来自设备中断请求相"或"
.VICProtection:该寄存器运行特权模式下运行的软件对VIC寄存器进行有限的访问.
.VICSWPriorityMask:软件优先级掩码寄存器.可以使用掩码来河北中断等级.
.VICVectAddr0~VICVectAddr31:向量地址寄存器.设置32个IRQ slots的中断地址.
.VICVectPriority31:向量优先级寄存器.指定中断向量的优先级.
.VICAddress:向量地址寄存器.当IRQ中断产生时,此寄存器保存当前激活的中断向量的地址.
翻译过来的不知道是不是准确,要逐个看一下每种寄存器的详细说明才能知道它们的详细意义和使用方法.
说是快速学习,其实也不快,学这东西想快起来看了不太容易.
有很多中中断源都有可能产生中断,对于2400大概有下面的中断源
中断源&&&&&&&&&&&&&&&&&&&&&&&
WDT&&&&&&&&&&&&&&&&&&&&&&&&&&&0
--保留给软件中断&&&&&&&&&&&&&&
Core&&&&&&&&&&&&&&&&&&&&&
Core&&&&&&&&&&&&&&&&&&&&&
TIMER0&&&&&&&&&&&&&&&&&&&&&&&
TIMER1&&&&&&&&&&&&&&&&&&&&&&&
&&&&UART0&&&&&&&&&&&&&&&&&&&&&&&&
UART1&&&&&&&&&&&&&&&&&&&&&&&&
PWM0,PWM1&&&&&&&&&&&&&&&&&&&&
&&&&I2C0&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&SPI,SSP0&&&&&&&&&&&&&&&&&&&&&
&&&&SSP1&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&PLL&&&&&&&&&&&&&&&&&&&&&&&&&&&12
&&&&RTC&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&系统控制(外部中断)&&&&&&&&&&&
14,15,16,17
ADC0&&&&&&&&&&&&&&&&&&&&&&&&&
I2C1&&&&&&&&&&&&&&&&&&&&&&&&&
BOD&&&&&&&&&&&&&&&&&&&&&&&&&&
Ethernet&&&&&&&&&&&&&&&&&&&&&&21
USB&&&&&&&&&&&&&&&&&&&&&&&&&&
CAN&&&&&&&&&&&&&&&&&&&&&&&&&&
SD/MMC&&&&&&&&&&&&&&&&&&&&&&&
DMA&&&&&&&&&&&&&&&&&&&&&&&
2&&&&&&&&&&&&&&&&&&&&&&
3&&&&&&&&&&&&&&&&&&&&&&
2&&&&&&&&&&&&&&&&&&&&&&&
3&&&&&&&&&&&&&&&&&&&&&&&
I2C2&&&&&&&&&&&&&&&&&&&&&&&&&
I2S&&&&&&&&&&&&&&&&&&&&&&&&&&
我们先不来接触那些真正的接口,因为接触到真正接口的时候,如果没有这些概念,可能会很难理解.先这样浏览一下相关的知识,然后一点点的往更细致去研究,可能对理解问题更有好处.
&&ARM微控制器基础与实战&&中,对VIC使用有这样的一些事项:
如果在片内RAM当中运行代码并且引用程序需要调用中断,那么必须将中断向量重新映射到Flash地址0x0.这样做是因为所有的异常向量都位于地址0x0及以上.通过将寄存器MEMMAP(位于系统控制模块中)配置为RAM模式来实现这样一点.
虽然可以选择多个中断源来产生FIQ请求,但是只有一个专门的中断服务程序来服务响应所有的FIQ请求.因此,如果分配为FIQ的中断多于一个,FIQ中断服务程序就必须读取VICFIQStatus的内容来决定如何处理中断请求.不过还是建议只讲一个中断分配为FIQ,多个FIQ中断源会增加中断延迟.
在中断服务程序执行完后,对外设中断标志的清零会对VIC寄存器(VICRawIntr,VICFIQStatus,VICIRQStatus)当中的对应位产生影响.另外为了能够服务下次中断,必须在中断返回之前对VICVectAddr寄存器执行写操作.该写操作将清零内部中断优先级硬件当中对应的中断标志.
通常情况下要禁止VIC中断,必须清零VICIntEnClr寄存器(中断使能清除寄存器,清除一个或多个中断位)中的对应位,该操作时VICIntEnable寄存器对应位清零.这同样应用于VICSoftInt,VICSoftIntClear.VICSoftIntClear将会是VICSoftInt中对应位清零.例如:VICSoftInt=0x0000
0005并且必须将bit0清零,则使用VICSoftIntClear=0x即可实现操作.在执行VICSoftIntClear=0x0000
0001之前,要先执行VICSoftIntClear=0x0000
0000.记住.&
&&&&VICIntSelect寄存器按照上面图的顺序来选择哪一个是IRQ,哪个是FIQ,但对应的位为1时此中断为FIQ,否则则是IRQ,VICIntEnable也是按照这个顺序来决定哪个中断可以使能.
在21xx系列中有向量控制寄存器VICVectCntl0~VICVectCntl15分别代表16个优先级,即VICVectCntl0代码slot0优先级(最高优先级),VICVectCntl1代表slot1优先级.在VICVectCntl寄存器中,低五位代表的是哪一个中断,例如,如果VICVectCntl0=0x0F,则从上面图中的顺序知道,ENT1即外部中断1的优先级为最高.VICVectCntl中的第6位代表IRQ是否使能,1代表使能.而在2400系列中,使用VICVectPriority0~VICVectPriority31来装载上图中对于优先级.例如如果VICVectPriority31装载的数字为0x12,即十进制的18,按上图的顺序,则AD0的优先级为31,即最低优先级.VICVectAddr0~VICVectAddr15(在2400系列中是31),每个寄存器是与VICVectCntl(VICVectPriority)向对应的.如果没有设置这组寄存器,则在210x系列中使用VICDevVectAddr寄存器,在2400中暂时没找到对应的寄存器,不过没关系,我们后面研究得时候也许会涉及到,到时候再说.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。ARM LPC2103定时器中断方式寄存器设置
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
ARM LPC2103定时器中断方式寄存器设置
定时器查询方式定时器初始化:
1、设置定时器分频数,为(x+1)分频
2、匹配通道X中断并复位TxTC
3、比较值(1S定时值)
4、启动并复位TxTC
& & & &T1PR = 99; & & & & & & & & & & & & & & // 设置定时器0分频为100分频,得110592Hz
& & & &T1MCR = 0x03; & & & & & & & & & & & &// 匹配通道0匹配中断并复位T0TC
& & & &T1MR0 = ; & & & & & & & & // 比较值(1S定时值)
& & & &T1TCR = 0x03; & & & & & & & & & & & &// 启动并复位T0TC
& & & &T1TCR = 0x01;
& &研究了好长一段时间,LPC210X的定时器,查询方式定时很简单如上面,但中断方式要操作好多寄存器,太麻烦,一直是一头雾水。好不容易理出了思路,现将一段例程粘贴备忘。
#include &intrinsics.h&
#include &stdio.h&
#include &iolpc2103.h&
// OSC [Hz]
#define FOSC & & & & & &UL
// Core clk [Hz]
#define FCCLK & & & & & FOSC
// Per clk [Hz]
#define PCCLK & & & & & (FOSC/4)
// Timer tick per second
#define TICK_PER_SEC & &(4UL)
#define TIM_PER_S(Val) &(PCCLK/Val)
#define MAX_TICK_PER & &TIM_PER_S(20)
#define MIN_TICK_PER & &TIM_PER_S(5)
// Timer Delta period [ms]
#define DELTA_PER & & & (50UL)
#define TIM_DPER & & & &((PCCLK*DELTA_PER)/1000UL)
#define LED_MASK & & & &1&&18
/*************************************************************************
&* 函数名称:irq_handler
&* 入口参数:无
&* 返回参数:无
&* 描 & &述:IRQ handler
&*************************************************************************/
#pragma vector=IRQV
__irq __arm void irq_handler (void)
void (*interrupt_function)();
& vector = VICVectA & & //获得中断向量
& interrupt_function = (void(*)())
& if(interrupt_function != NULL)
& & interrupt_function(); &//调用中断指向的函数
& & VICVectAddr = 0; & & &//清除在VIC中的中断
/*************************************************************************
* 函数名称: Timer0Handler
&* 入口参数: 无
&* 返回参数: 无
&* 说 & &明: Timer 0 handler &
*************************************************************************/
void Timer0Handler (void)
& // clear interrupt flag
& T0IR_bit.MR0INT = 1;
& // Change patern
& if ((IOSET & LED_MASK) == 0)
& & IOSET = LED_MASK; & & &//关闭LED
& & IOCLR = LED_MASK;
& //pNextPattern = pNextPattern-&pNextP & & & &//调整当前的链表
& VICVectAddr = 0;
/*************************************************************************
&* 函数名称: VicInit
&* 入口参数: 无
&* 返回参数: 无
&* 说 & &明: Init VIC module
&*************************************************************************/
void VicInit (void)
& // Assign all interrupt chanels to IRQ
& VICIntSelect &= &0;
& // Diasable all interrupts
& VICIntEnClear = 0xFFFFFFFF;
& // Clear all software interrutps
& VICSoftIntClear = 0xFFFFFFFF;
& // VIC registers can be accessed in User or privileged mode
& VICProtection = 0;
& // Clear interrupt
& VICVectAddr = 0;
& // Clear address of the Interrupt Service routine (ISR) for non-vectored IRQs.
& VICDefVectAddr = 0;
& // Clear address of the Interrupt Service routine (ISR) for vectored IRQs.
& VICVectAddr0 &= VICVectAddr1 &= VICVectAddr2 &= VICVectAddr3 &=\
& VICVectAddr4 &= VICVectAddr5 &= VICVectAddr6 &= VICVectAddr7 &=\
& VICVectAddr8 &= VICVectAddr9 &= VICVectAddr10 = VICVectAddr11 =\
& VICVectAddr12 = VICVectAddr13 = VICVectAddr14 = VICVectAddr15 = 0;
& // Disable all vectored IRQ slots
& VICVectCntl0 &= VICVectCntl1 &= VICVectCntl2 &= VICVectCntl3 &=\
& VICVectCntl4 &= VICVectCntl5 &= VICVectCntl6 &= VICVectCntl7 &=\
& VICVectCntl8 &= VICVectCntl9 &= VICVectCntl10 = VICVectCntl11 =\
& VICVectCntl12 = VICVectCntl13 = VICVectCntl14 = VICVectCntl15 = 0;
/*************************************************************************
&* 函数名称: Init_timer0
&* 入口参数: 无
&* 返回参数: 无
&* 说 & &明: Init tiner0
&*************************************************************************/
void Init_timer0(void)
& // Init timer
& // Reset and stop timer0
& T0TCR = 2;
& // Set timer counters mode - clock by PCLK
& T0CTCR = 0;
& // Set timer prescaler
& T0PR &= 0;
& // Set timer period
& T0MR0 = PCCLK/TICK_PER_SEC;
& // Set mack action - interrupt by MACH0 enable, reset counter
& T0MCR = 3;
& // No external action
& T0EMR = 0;
& T0TCR = 2;
& T0CTCR = 0;
& T0PR = 0;
& T0MR0 = PCCLK/TICK_PER_SEC;
& T0MCR = 3;
& T0EMR = 0;
& // Assign to IRQ
& VICIntSelect_bit.TIMER0 = 0;
& // Set interrupt slots
& VICVectAddr0 = (unsigned int) Timer0H
& VICVectCntl0_bit.NUMBER = VIC_TIMER0;
& VICVectCntl0_bit.ENABLED = 1;
& // Timer 0 interrupt enable
& VICIntEnable_bit.TIMER0 = 1;
& // Enable timer0
& T0TCR = 1;
/*************************************************************************
&* 函数名称: Init_Gpio
&* 入口参数: 无
&* 返回参数: 无
&* 说 & &明: Init GPIO
&*************************************************************************/
void Init_Gpio(void)
& & // Init GPIO
& PINSEL0 = PINSEL1 = 0;
& // Disable fast IO
& SCS_bit.GPIO0M = 0;
& // Set pins connect to LEDs as outputs
& IODIR = LED_MASK;
& // All LEDs off
& IOCLR = LED_MASK;
/*************************************************************************
&* 函数名称: Init_pll
&* 入口参数: 无
&* 返回参数: 无
&* 说 & &明: Init PLL
&*************************************************************************/
void Init_pll(void)
& // Disable PLL
& PLLCON = 0;
& // Write Feed
& PLLFEED = 0xAA;
& PLLFEED = 0x55;
& // Set periphery divider /4
& APBDIV_bit.APBDIV &= 0;
& // Set MAM fully enable
& MAMCR_bit.MODECTRL = 0;
& MAMTIM_bit.CYCLES &= 3;
& MAMCR_bit.MODECTRL = 2;
/*************************************************************************
&* 函数名称: main
&* 入口参数: 无
&* 返回参数: 无
&* 描 & &述: main
&*************************************************************************/
void main(void)
& Init_pll();
& // Memory map init flash memory is maped on 0 address
#ifdef FLASH
& MEMMAP_bit.MAP = 1;
& MEMMAP_bit.MAP = 2;
& __disable_interrupt();
& VicInit();
& Init_Gpio();
& Init_timer0();
& __enable_interrupt();
& while(1)
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网 51hei.com , All Rights Reserved

我要回帖

更多关于 stm32 关闭全局中断 的文章

 

随机推荐