ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:21.48KB ,
资源ID:6059551      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6059551.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(nRF51822外部中断学习总结.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

nRF51822外部中断学习总结.docx

1、nRF51822外部中断学习总结最近要用nRF51822进行项目的多任务调度,其中不可避免的要用到要用到nRF51822的相关中断首先,nRF51822是基于Cortex-M0架构的MCU,根据nRF51822的软件开发包中的core-m0.h文件夹,可以找到51822的相关中断编号定义(Interrupt Number Definition)objcview plaincopy1. /*-InterruptNumberDefinition-*/2. 3. typedefenum4. /*-Cortex-M0ProcessorExceptionsNumbers-*/5. Reset_IRQn=

2、-15,/*!1ResetVector,invokedonPowerupandwarmreset*/6. NonMaskableInt_IRQn=-14,/*!2NonmaskableInterrupt,cannotbestoppedorpreempted*/7. HardFault_IRQn=-13,/*!3HardFault,allclassesofFault*/8. SVCall_IRQn=-5,/*!11SystemServiceCallviaSVCinstruction*/9. DebugMonitor_IRQn=-4,/*!12DebugMonitor*/10. PendSV_IR

3、Qn=-2,/*!14Pendablerequestforsystemservice*/11. SysTick_IRQn=-1,/*!15SystemTickTimer*/12. /*-nRF51SpecificInterruptNumbers-*/13. POWER_CLOCK_IRQn=0,/*!0POWER_CLOCK*/14. RADIO_IRQn=1,/*!1RADIO*/15. UART0_IRQn=2,/*!2UART0*/16. SPI0_TWI0_IRQn=3,/*!3SPI0_TWI0*/17. SPI1_TWI1_IRQn=4,/*!4SPI1_TWI1*/18. GPI

4、OTE_IRQn=6,/*!6GPIOTE*/19. ADC_IRQn=7,/*!7ADC*/20. TIMER0_IRQn=8,/*!8TIMER0*/21. TIMER1_IRQn=9,/*!9TIMER1*/22. TIMER2_IRQn=10,/*!10TIMER2*/23. RTC0_IRQn=11,/*!11RTC0*/24. TEMP_IRQn=12,/*!12TEMP*/25. RNG_IRQn=13,/*!13RNG*/26. ECB_IRQn=14,/*!14ECB*/27. CCM_AAR_IRQn=15,/*!15CCM_AAR*/28. WDT_IRQn=16,/*!

5、16WDT*/29. RTC1_IRQn=17,/*!17RTC1*/30. QDEC_IRQn=18,/*!18QDEC*/31. LPCOMP_COMP_IRQn=19,/*!19LPCOMP_COMP*/32. SWI0_IRQn=20,/*!20SWI0*/33. SWI1_IRQn=21,/*!21SWI1*/34. SWI2_IRQn=22,/*!22SWI2*/35. SWI3_IRQn=23,/*!23SWI3*/36. SWI4_IRQn=24,/*!24SWI4*/37. SWI5_IRQn=25/*!25SWI5*/38. IRQn_Type;39. 在进行中断处理时,一

6、般都要按照这个步骤:1、对要用到的中断初始化;2、对用到的中断进行使能;3、对中断进行优先级设置1、中断初始化nRF51822的外部I/O(暂时理解的程度以及用过的中断只有I/O中断,其他中断没有实践过)中断是基于任务和事件模式的。按照nRF51822用户手册,每个GPIOTE通道的以下输入条件可以产生一个事件(在此可将事件理解为一个中断):上升沿、下降沿或者任何变化。因此,在进行中断初始化的时候,首先要将相应的中断输入I/O引脚设置为输入模式。然后通过CONFIGn设置GPIOTE通道的模式MODE(任务或者事件)、关联任务OUTn或者事件INn的引脚PSEL,触发方式POLARITY。例如

7、下面是将ROCKER_INTERRUPT引脚初始化为事件下降沿触发的事件IN0。objcview plaincopy1. NRF_GPIOTE-CONFIG0=(GPIOTE_CONFIG_POLARITY_HiToLoGPIOTE_CONFIG_POLARITY_Pos)2. |(ROCKER_INTERRUPTGPIOTE_CONFIG_PSEL_Pos)3. |(GPIOTE_CONFIG_MODE_EventINTENSET=GPIOTE_INTENSET_IN0_SetGPIOTE_INTENSET_IN0_Pos;/IN02、中断使能在中断初始化中仅仅是对事件n的使能,在此要对相应

8、的中断进行使能。类比于Cortex-M3架构,在MDK内与NVIC相关的寄存器,MDK为其定义了如下的结构体NVIC(Nested Vectored Interrupt Controller)嵌套中断向量控制器objcview plaincopy1. /*ingroupCMSIS_core_register2. defgroupCMSIS_NVICNestedVectoredInterruptController(NVIC)3. briefTypedefinitionsfortheNVICRegisters4. 5. */6. 7. /*briefStructuretypetoaccessth

9、eNestedVectoredInterruptController(NVIC).8. */9. typedefstruct10. 11. _IOuint32_tISER1;/*!Offset:0x000(R/W)InterruptSetEnableRegister*/12. uint32_tRESERVED031;13. _IOuint32_tICER1;/*!Offset:0x080(R/W)InterruptClearEnableRegister*/14. uint32_tRSERVED131;15. _IOuint32_tISPR1;/*!Offset:0x100(R/W)Interr

10、uptSetPendingRegister*/16. uint32_tRESERVED231;17. _IOuint32_tICPR1;/*!Offset:0x180(R/W)InterruptClearPendingRegister*/18. uint32_tRESERVED331;19. uint32_tRESERVED464;20. _IOuint32_tIP8;/*!Offset:0x300(R/W)InterruptPriorityRegister*/21. NVIC_Type;22. 23. /*endofgroupCMSIS_NVIC*/ISER1:中断使能寄存器。由前边可以看到

11、,nRF51的寄存器编号为0-25,在这里ISER1为32位寄存器,总共可以表示32个中断,bit0-bit25分别对应中断0-25(其实后来发现在NVIC_EnableIRQ()函数中是将1左移IRQn位之后又与0x1F,也就是空出了低五位,所以在这里应该是对应的高地址,而把低位给空出来的)。要使能某个中断,必须设置相应的ISER位为1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、I/O口映射等设置才算是一个完整的中断设置)。此处是按照STM32中断设置理解的。ICER1:中断除能寄存器,和ISER的作用恰好相反,用来清除某个中断的使能的。专门设置一个ICER来清除中断位,而不是

12、向ISER写0来清除,这是因为NVIC的这些寄存器都是写1有效的,写0无效的。ISPR1:中断挂起控制寄存器。通过置1可以将正在进行的中断挂起,而执行同级或者更高级别的中断。ICPR1:中断解挂控制寄存器。通过置1可以将挂起的中断解挂。IP8:中断优先级控制寄存器组。这个寄存器组相当重要。中断分组与这个寄存器密切相关。在这里插入一下中断优先级的理解。因为以前都是用的STM32,在这里就按照Cortex-M3架构来理解。Cortex-M3中有两个优先级的概念抢占优先级和响应优先级,有人把响应优先级称作“亚优先级”和“副优先级”,每个中断源都需要被指定这两种优先级。具有高抢占优先级的中断可以在具有

13、低抢占优先级的中断处理过程中被响应,即中断嵌套。当两个中断源的抢占优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个(在原子教你玩STM32中说在抢占优先级相同的中断,高优先级的响应优先级不可打断低响应优先级的中断,有待考证);如果他们的抢占优先级和响应优先级相等,则根据他们在中断表中的排位顺序来决定先处理哪一个。在STM32中需要用NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGr

14、oup)先对中断优先级进行分组,这个分组在一个程序中只能设定一次,是在中断与复位控制寄存器SCB-AIRCR中设置的,也就是分组之后所有的中断只能按照这个分组方式进行设定抢占优先级和响应优先级。在对中断优先级进行分组设置之后,要对每个中断的中断源优先级进行设置,也就是设置中断优先级控制寄存器IP,中断源优先级具体设置了该中断源的优先级别。在此先说一下STM32中断优先级设置的步骤:系统运行开始的时候设置中断分组,确定组号,也就是确定抢占优先级和子优先级的分配位数,调用函数为NVIC_PriorityGroupConfig();设置用到的中断的中断优先级别,对每个中断调用函数为NVIC_Init

15、(NVIC_InitTypeDef *NVIC_InitStruct);而在nRF51822中,我现在还没有碰到中断优先级进行分组的情况,在此就先不写,如果将来用到,再进行相关补充首先是中断使能,和STM32中在初始化NVIC_InitStruct结构体的同时完成中断使能不同,nRF51822通过专门的函数NVIC_EnableIRQ(IRQn_Type IRQn)来实现响应中断使能,形参变量IRQn为要进行初始化的中断编号,在本博文的开头已经给出,在SDK的core-m0.h中定义,以下为中断使能函数。objcview plaincopy1. /*briefEnableExternalInt

16、errupt2. 3. Thefunctionenablesadevice-specificinterruptintheNVICinterruptcontroller.4. 5. paraminIRQnExternalinterruptnumber.Valuecannotbenegative.6. */7. _STATIC_INLINEvoidNVIC_EnableIRQ(IRQn_TypeIRQn)8. 9. NVIC-ISER0=(1ICER0=(1(uint32_t)(IRQn)&0x1F);22. 例如,要使能GPIOTE中断,则调用objcview plaincopy1. NVIC_EnableIRQ(GPIOTE_IRQn);3、中断优先级设置中断优先级设置源函数如下:objcview plaincopy1. /*briefSetInterruptPriority2. 3. Thefunctionsetsthepriorityofaninterrupt.4. 5. noteTheprioritycannotbesetforeverycoreinterrupt.6. 7. paraminIRQnInterruptnumber.8. paraminpriorityPrioritytoset.9. */10. _STATIC_INLINEvoidNVIC_SetPrior

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1