![NVIC配置说明及例子代码汉化注释_第1页](http://file4.renrendoc.com/view/0ed3b3f7f6966b0da0be10142b6cc810/0ed3b3f7f6966b0da0be10142b6cc8101.gif)
![NVIC配置说明及例子代码汉化注释_第2页](http://file4.renrendoc.com/view/0ed3b3f7f6966b0da0be10142b6cc810/0ed3b3f7f6966b0da0be10142b6cc8102.gif)
![NVIC配置说明及例子代码汉化注释_第3页](http://file4.renrendoc.com/view/0ed3b3f7f6966b0da0be10142b6cc810/0ed3b3f7f6966b0da0be10142b6cc8103.gif)
![NVIC配置说明及例子代码汉化注释_第4页](http://file4.renrendoc.com/view/0ed3b3f7f6966b0da0be10142b6cc810/0ed3b3f7f6966b0da0be10142b6cc8104.gif)
![NVIC配置说明及例子代码汉化注释_第5页](http://file4.renrendoc.com/view/0ed3b3f7f6966b0da0be10142b6cc810/0ed3b3f7f6966b0da0be10142b6cc8105.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
STM32中Cortex-M3寄存器说明-NVIC寄存器组、系统控制SCB寄存器组、嘀嗒定时…在STM32中用到了Cortex-M3定义的三组寄存器,有关这三组寄存器的说明不在STM32的技术手册中,需要参考ARM公司发布的Cortex-M3TechnicalReferenceManual(r2p0。在STM32的固件库中定义了三个结构体与这三个寄存器组相对应,这三个结构体与ARM手册中寄存器的对应关系如下:一、NVIC寄存器组STM32的固件库中有如下定义:typedefstruct(vu32ISER[2];u32RESERVED0[30];vu32ICER[2];u32RSERVED1[30];vu32ISPR[2];u32RESERVED2[30];vu32ICPR[2];u32RESERVED3[30];vu32IABR[2];u32RESERVED4[62];vu32IPR[11];}NVIC_TypeDef;它们对应ARM手册中的名称为ISER=InterruptSet-EnableRegistersICER=InterruptClear-EnableRegistersISPR=InterruptSet-PendingRegisterICPR=InterruptClear-PendingRegisterIABR=ActiveBitRegisterIPR=InterruptPriorityRegisters每个寄存器有240位,以InterruptSet-EnableRegisters说明,ISER[0]对应中断源0~31,ISER[1]对应中断源32~63,STM32只有60个中断源,所以没有ISER[2:7]。参考STM32技术参考手册中的中断向量表,中断源的位置为:位置0-WWDG=WindowWatchdoginterrupt位置1-PVD=PVDthroughEXTILinedetectioninterrupt位置2-TAMPER=Tamperinterrupt位置58-DMA2_Channel3=DMA2Channel3globalinterrupt位置59-DMA2_Channel4_5=DMA2Channel4andDMA2Channel5globalinterrupts二、系统控制寄存器组STM32的固件库中有如下定义:typedefstruct(vuc32CPUID;vu32ICSR;vu32VTOR;vu32AIRCR;vu32SCR;vu32CCR;vu32SHPR[3];vu32SHCSR;vu32CFSR;vu32HFSR;vu32DFSR;vu32MMFAR;vu32BFAR;vu32AFSR;}SCB_TypeDef;/*SystemControlBlockStructure火/它们对应ARM手册中的名称为CPUID=CPUIDBaseRegisterICSR=InterruptControlStateRegisterVTOR=VectorTableOffsetRegisterAIRCR=ApplicationInterrupt/ResetControlRegisterSCR=SystemControlRegisterCCR=ConfigurationControlRegisterSHPR=SystemHandlersPriorityRegisterSHCSR=SystemHandlerControlandStateRegisterCFSR=ConfigurableFaultStatusRegistersHFSR=HardFaultStatusRegisterDFSR=DebugFaultStatusRegisterMMFAR=MemManageAddressRegisterBFAR=BusFaultAddressRegisterAFSR=AuxiliaryFaultStatusRegister三、系统时钟寄存器组STM32的固件库中有如下定义:typedefstruct(vu32CTRL;vu32LOAD;vu32VAL;vuc32CALIB;}SysTick_TypeDef;它们对应ARM手册中的名称为CTRL=SysTickControlandStatusRegisterLOAD=SysTickReloadValueRegisterVAL=SysTickCurrentValueRegisterCALIB=SysTickCalibrationValueRegisterSYSTICK我不得不说意法半导体确实有点风骚!甚至有点变态。我对ST文档STM32F10XXX参考手册的编辑水平真是不敢恭维。手册中好多说明都是含糊不清,甚至将好多对初学者来说很重要的地方都一笔带过,让人着实摸不着头脑。比如前面我说过的关于NVIC嵌套向量中断控制器的介绍,这部分我认为是非常重要的,但当你看完他这部分介绍,你根本不会设置中断服务程序,他有哪些寄存器都不知道,更别说去设置了,NVIC的详细介绍是在Cotex-M3中有详细的介绍,不多说。今天我们说的是systick定时器。systick定时器和我上面说的情况一样,在手册中根本没有介绍。我费了九牛二虎之力才在一个犄角格拉里找到systick定时器的英文版的说明。在Cotex-M3有介绍,为什么要找STM32的介绍,是因为功能设置上还有点区别。首先看一下systick定时器的作用,下面是Cotex-M3里的一段话:SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。Cortex-M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟(CM3处理器上的STCLK信号)。不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。(知道我为什么找ST关于systick的说明了吧)。下面介绍STM32中的systick,Systick部分内容属于NVIC控制部分,一共有4个寄存器,名称和地址分别是:STK_CSR,0xE000E010--控制寄存器STK_LOAD,0xE000E014--重载寄存器STK_VAL,0xE000E018--当前值寄存器STK_CALRB,0xE000E01C--校准值寄存器首先看STK_CSR控制寄存器:寄存器内有4个位t具有意义9130292&272625242322212019181716COUNTRessrvedFLAGrw151413121110987654321QCLK90TICKENReserv&dURGEINTABLErwIW第0位:ENABLE,Systick使能位(0:关闭Systick功能;1:开启Systick功能)第1位:TICKINT,Systick中断使能位(0:关闭Systick中断;1:开启Systick中断)第2位:CLKSOURCE,Systick时钟源选择(0:使用HCLK/8作为Systick时钟;1:使用HCLK作为Systick时钟)第3位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick已经数到了0,则该位为1。如果读取该位,该位将自动清零STK_LOAD重载寄存器:9130292B27262524232221201S1716RELCJAD[23:16]rwrwrwrwrwrwrwIW1514131211109876549210RELOAD[15:0]rwrwrwmrwrwiwrwrwrwrwrwrwrwSystick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD重载寄存器是个24位的寄存器最大计数0xFFFFFF。STK_VAL当前值寄存器:也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志。STK_CALRB校准值寄存器:31302928272625242322212019181716NOREFSKEWReservedTENMS[23:16]rrrrrrrrr「151413121110S876549210TENMS[15:0]rriirrr「r「r「rrri这个寄存器好像目前的水平我还用不到,大体意思明白点,把英文说明放这吧:位31NOREF:1二没有外部参考时钟(STCLK不可用)0二外部参考时钟可用位30SKEW:1二校准值不是准确的1ms0二校准值是准确的1ms位[23:0]:CalibrationvalueIndicatesthecalibrationvaluewhentheSysTickcounterrunsonHCLKmax/8asexternalclock.Thevalueisproductdependent,pleaserefertotheProductReferenceManual,SysTickCalibrationValuesection.WhenHCLKisprogrammedatthemaximumfrequency,theSysTickperiodis1ms.Ifcalibrationinformationisnotknown,calculatethecalibrationvaluerequiredfromthefrequencyoftheprocessorclockorexternalclock.SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。
下面我们就应用SysTick定时器来裸奔,把它作为一个定时器来用,还是老一套,在寄存器头文件中添加定义寄存器://*****************************************************************//*SystemTick-Register//*******************************************************************#defineSYSTICK_TENMS#defineSYSTICK_CURRENT#defineSYSTICK_RELOAD(*((volatile#defineSYSTICK_TENMS#defineSYSTICK_CURRENT#defineSYSTICK_RELOAD(*((volatileunsignedlong*)0xE000E018))(*((volatileunsignedlong*)0xE000E014))(*((volatileunsignedlong#defineSYSTICK_CSR*)0xE000E010))配置(*((volatileunsignedlongvoidSysTick_Configuration(void)(SYSTICK_CURRENT=0;//当前值寄存器SYSTICK_RELOAD=20000;//重装载寄存器,系统时钟20M中断一次1mSSYSTICK_CSR|=0x06;//HCLK作为Systick时钟,Systick中断使能位}中断处理:voidSysTick_Handler(void)//中断函数(externunsignedlongTimingDelay;//延时时间,注意定义为全局变量SYSTICK_CURRENT=0;if(TimingDelay!=0x00)TimingDelay--;}利用systick的延时函数:unsignedlongTimingDelay;//延时时间,注意定义为全局变量voidDelay(unsignedlongnTime)//延时函数(SYSTICK_CSR|=0x07;//使能SysTick计数器TimingDelay=nTime;//读取延时时间while(TimingDelay!=0);//判断延时是否结束SYSTICK_CSR|=0x06;//关闭SysTick计数器}intmain()(SystemInit0();〃系统(时钟)初始化stm32_GpioSetup();//GPIO初始化SysTick_Configuration();//配置systick定时器while(1)(GPIO_PORTB_ODR|=(1<<5);Delay(1000);//1SGPIO_PORTB_ODR&=~(1<<5);Delay(1000);//1S}}完成!Delay(1000);实现了1S的精确延时,利用Delay(unsignedlongnTime);配合systick定时器可以实现任意时间的精确延时,当然通过定时器TIMx也是可以这样做的,我只是用它来说明systick定时器的用法STM32入门教程系统时钟SysTick(一)背景介绍在传统的嵌入式系统软件按中通常实现Delay(N)函数的方法为:for(i=0;i<=x;i++);x---对应于对应于N毫秒的循环值对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行for循环时,要实现N毫秒的x值非常大,而且由于系统频率的宽广,很难计算出延时N毫秒的精确值。针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。(二)STM32SysTick介绍Cortex-M3的内核中包含一个SysTick时钟。SysTick为一个24位递减计数器,SysTick设定初值并使能后,每经过1个系统时钟周期,计数值就减1。计数到0时,SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(如果中断使能情况下)。在STM32的应用中,使用Cortex-M3内核的SysTick作为定时时钟,设定每一毫秒产生一次中断,在中断处理函数里对N减一,在Delay(N)函数中循环检测N是否为0,不为0则进行循环等待;若为0则关闭SysTick时钟,退出函数。注:全局变量TimingDelay,必须定义为volatile类型,延迟时间将不随系统时钟频率改变。(三)STSysTick库文件
使用ST的函数库使用systick的方法--失能SysTick计数器--失能SysTick中断--设置SysTick时钟源。--设置SysTick重装载值。--使能SysTick中断--开启SysTick计数器1、调用SysTick_CounterCmd()2、调用SysTick_ITConfig()3、调用SysTick_CLKSourceConfig()4、调用SysTick_SetReload()5、调用SysTick_ITConfig()6、调用SysTick_CounterCmd()(四)SystemTick工程实战外部晶振为8MHz,9倍频,系统时钟为72MHz,SysTick的最高频率为9MHz(最大为HCLK/8),在这个条件下,把SysTick效验值设置成9000,将SysTick--失能SysTick计数器--失能SysTick中断--设置SysTick时钟源。--设置SysTick重装载值。--使能SysTick中断--开启SysTick计数器/*Configurethesystemclocks*/RCC_Configuration();SysTick_Configuration();第一步:配置RCC寄存器和SysTick寄存器RCC_Configuration:配置RCC寄存器voidRCC_Configuration(void){/*RCCsystemreset(fordebugpurpose)*/RCC_DeInit();/*EnableHSE*/RCC_HSEConfig(RCC_HSE_ON);/*WaittillHSEisready*/HSEStartUpStatus=RCC_WaitForHSEStartUp();if(HSEStartUpStatus==SUCCESS){/*HCLK=SYSCLK*/RCC_HCLKConfig(RCC_SYSCLK_Div1);/*PCLK2=HCLK*/RCC_PCLK2Config(RCC_HCLK_Div1);/*PCLK1=HCLK/2*/RCC_PCLK1Config(RCC_HCLK_Div2);/*Flash2waitstate*/FLASH_SetLatency(FLASH_Latency_2);/*EnablePrefetchBuffer*/FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*PLLCLK=8MHz*9=72MHz*/RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);/*EnablePLL*/RCC_PLLCmd(ENABLE);/*WaittillPLLisready*/while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}/*SelectPLLassystemclocksource*/RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/*WaittillPLLisusedassystemclocksource*/while(RCC_GetSYSCLKSource()!=0x08){}}/*EnableGPIOAandAFIOclocks*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);}SysTick_Configuration:配置SysTickvoidSysTick_Configuration(void){/*SelectAHBclock(HCLK)asSysTickclocksource*/SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);/*SetSysTickPriorityto3*/NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick,3,0);/*SysTickinterrupteach1mswithHCLKequalto72MHz*/SysTick_SetReload(72000);/*EnabletheSysTickInterrupt*/SysTick_ITConfig(ENABLE);}第二步:配置SysTick中断函数这里我们定义了一个TestSig全局变量,用于我们使用Keil软件自带的逻辑分析仪来分析.volatilevu32TimingDelay=0;vu8TestSig=0;voidSysTickHandler(void){TimingDelay--;if(TimingDelay%2){TestSig=1;}else{TestSig=0;}}第三步:编写Delay延时函数Delay:系统延时函数,使用系统时钟操作.voidDelay(u32nTime){/*EnabletheSysTickCounter*/SysTick_CounterCmd(SysTick_Counter_Enable);TimingDelay=nTime;while(TimingDelay!=0);/*DisabletheSysTickCounter*/SysTick_CounterCmd(SysTick_Counter_Disable);/*CleartheSysTickCounter*/SysTick_CounterCmd(SysTick_Counter_Clear);}第四步:主函数中调用Delay在Mini-STM32开发板上有两个LED灯,分别是PA0,PA1.我们做个流水灯程序,让他们循环点亮.while(1){GPIO_SetBits(GPIOA,GPIO_Pin_0);Delay(100);GPIO_ResetBits(GPIOA,GPIO_Pin_0);Delay(100);GPIO_SetBits(GPIOA,GPIO_Pin_1);Delay(100);GPIO_ResetBits(GPIOA,GPIO_Pin_1);Delay(100);}(五)仿真调试把工程便宜通过后,进入软件仿真如下图所示:点击工程快捷菜单的逻辑分析仪在逻辑分析仪中我们点击Setup按键会弹出安装对话框.点右上方的"新建"图标,在菜单中输入"TestSig"这个全局变量.添加完之后就可以点Close了.如果您仿真完可以点击左下方的"KillAll"删除所有监视变量.全速运行后就可以看到下面的波形了哦如果你使用仿真器在Mini-STM32上调试的话你还可以看到两个LED在跑跑马灯程序了.到此我们这章节的教程就结束了,相信大家也掌握了SystemTick的用法了./********************(C)COPYRIGHT2008STMicroelectronics********************文件名称:stm32f10x_nvic.c程序作者:MCDApplicationTeam*程序版本:V2.0.2*编制日期:07/11/2008*功能描述:这个文件提供了所有NVIC的固件函数.“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““*********************************************************************************目前的固件的目的是为客户提供关于他们的产品的编码信息以便于节省他们时间。*结果,意法半导体将不会为此承担任何直接,间接或相应的损害赔偿方面的任何索赔要求,*例如固件或使用所作的客户编码中他涉嫌包含与他们的相关产品的信息。“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************************************/TOC\o"1-5"\h\z/*包涵的文件*/#include"stm32f10x_nvic.h"/*自用类型*//*自用定义*/#defineAIRCR_VECTKEY_MASK((u32)0x05FA0000)/*自用宏*//*自用变量*//*自用函数原型*//*自用函数*/3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名称:NVIC_DeInit*功能描述:复位NVIC外围设备寄存器为默认的复位值.*输入参数:无*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_DeInit(void){u32index=0;NVIC->ICER[0]=0xFFFFFFFF;NVIC->ICER[1]=0x0FFFFFFF;NVIC->ICPR[0]=0xFFFFFFFF;NVIC->ICPR[1]=0x0FFFFFFF;for(index=0;index<0x0F;index++){NVIC->IPR[index]=0x00000000;}}/********************************************************************************函数名称:NVIC_SCBDeInit*功能描述:复位SCB外围设备寄存器为默认的复位值.*输入参数:无*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_SCBDeInit(void){u32index=0x00;SCB->ICSR=0x0A000000;SCB->VTOR=0x00000000;SCB->AIRCR=AIRCR_VECTKEY_MASK;SCB->SCR=0x00000000;SCB->CCR=0x00000000;for(index=0;index<0x03;index++){SCB->SHPR[index]=0;}SCB->SHCSR=0x00000000;SCB->CFSR=0xFFFFFFFF;SCB->HFSR=0xFFFFFFFF;SCB->DFSR=0xFFFFFFFF;}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/*******************************************************************************函数名称:NVIC_PriorityGroupConfig*功能描述:配置优先级组:优先级和子优先级.*输入参数:NVIC_PriorityGroup:优先级组位的长度。这个参数允许的值:-NVIC_PriorityGroup_0:0位优先级;4位子优先级-NVIC_PriorityGroup_1:1位优先级;3位子优先级-NVIC_PriorityGroup_2:2位优先级;2位子优先级-NVIC_PriorityGroup_3:3位优先级;1位子优先级-NVIC_PriorityGroup_4:4位优先级;0位子优先级*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************************************/voidNVIC_PriorityGroupConfig(u32NVIC_PriorityGroup){/*Checktheparameters[检查参数]*/assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));/*SetthePRIGROUP[10:8]bitsaccordingtoNVIC_PriorityGroupvalue[依照NVIC_PriorityGroup的值设置PRIGROUP[10:8]的位]*/SCB->AIRCR=AIRCR_VECTKEY_MASK|NVIC_PriorityGroup;}/********************************************************************************函数名称:NVIC_Init*功能描述:通过NVIC_InitStruct中的指定参数来初始化外围设备.*输入参数:NVIC_InitStruct:一个指向包含指定NVIC外围设备配置信息的NVIC_InitTypeDef结构的指针。*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_Init(NVIC_InitTypeDef*NVIC_InitStruct){u32tmppriority=0x00,tmpreg=0x00,tmpmask=0x00;u32tmppre=0,tmpsub=0x0F;/*Checktheparameters[检查参数]*/assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_InitStruct->NVIC_IRQChannel));assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));if(NVIC_InitStruct->NVIC_IRQChannelCmd!=DISABLE){/*ComputetheCorrespondingIRQPriority[计算相应的终端优先级]*/tmppriority=(0x700-(SCB->AIRCR&(u32)0x700))>>0x08;tmppre=(0x4-tmppriority);tmpsub=tmpsub>>tmppriority;tmppriority=(u32)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority<<tmppre;tmppriority|=NVIC_InitStruct->NVIC_IRQChannelSubPriority&tmpsub;tmppriority=tmppriority<<0x04;tmppriority=((u32)tmppriority)<<((NVIC_InitStruct->NVIC_IRQChannel&(u8)0x03)*0x08);tmpreg=NVIC->IPR[(NVIC_InitStruct->NVIC_IRQChannel>>0x02)];tmpmask=(u32)0xFF<<((NVIC_InitStruct->NVIC_IRQChannel&(u8)0x03)*0x08);tmpreg&=-tmpmask;tmppriority&=tmpmask;tmpreg1=tmppriority;NVIC->IPR[(NVIC_InitStruct->NVIC_IRQChannel>>0x02)]=tmpreg;/*EnabletheSelectedIRQChannels[允许选择的中断通道]*/NVIC->ISER[(NVIC_InitStruct->NVIC_IRQChannel>>0x05)]=(u32)0x01<<(NVIC_InitStruct->NVIC_IRQChannel&(u8)0x1F);}else{/*DisabletheSelectedIRQChannels[禁止选择的中断通道]*/NVIC->ICER[(NVIC_InitStruct->NVIC_IRQChannel>>0x05)]=(u32)0x01<<(NVIC_InitStruct->NVIC_IRQChannel&(u8)0x1F);}}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名称:NVIC_StructInit*功能描述:给每一个NVIC_InitStruct成员填上默认值.*输入参数:NVIC_InitStruct:指向将被初始化的NVIC_InitTypeDef结构的指针.*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_StructInit(NVIC_InitTypeDef*NVIC_InitStruct){/*NVIC_InitStructmembersdefaultvalue[NVIC_InitStruct成员默认值]*/NVIC_InitStruct->NVIC_IRQChannel=0x00;NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority=0x00;NVIC_InitStruct->NVIC_IRQChannelSubPriority=0x00;NVIC_InitStruct->NVIC_IRQChannelCmd=DISABLE;}/********************************************************************************函数名称:NVIC_SETPRIMASK*功能描述:使能PRIMASK优先级:把执行的优先级提升为0.*输入参数:无*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_SETPRIMASK(void){__SETPRIMASK();}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名称:NVIC_RESETPRIMASK*功能描述:使PRIMASK优先级无效.*输入参数:无*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_RESETPRIMASK(void){__RESETPRIMASK();}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名称:NVIC_SETFAULTMASK*功能描述:使能FAULTMASK优先级:把执行的优先级提升为T.*输入参数:无*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_SETFAULTMASK(void){__SETFAULTMASK();}/********************************************************************************函数名称:NVIC_RESETFAULTMASK*功能描述:使FAULTMASK优先级无效。*输入参数:无*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_RESETFAULTMASK(void){__RESETFAULTMASK();}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名称:NVIC_BASEPRICONFIG*功能描述:执行优先级能够从15(可配置的最低优先级)改变为1.写入0将禁止优先级.*输入参数:无*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_BASEPRICONFIG(u32NewPriority){/*Checktheparameters[检查参数]*/assert_param(IS_NVIC_BASE_PRI(NewPriority));__BASEPRICONFIG(NewPriority<<0x04);}/********************************************************************************函数名称:NVIC_GetBASEPRI*功能描述:返回BASEPRI掩码值.*输入参数:无*输出参数:无*返回参数:返回BASEPRI寄存器值“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/u32NVIC_GetBASEPRI(void){return(__GetBASEPRI());}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名称:NVIC_GetCurrentPendingIRQChannel*功能描述:返回当前挂起的IRQ通道(channel)标识符.*输入参数:无*输出参数:无*返回参数:挂起IRQ通道的标识符.“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/u16NVIC_GetCurrentPendingIRQChannel(void){return((u16)((SCB->ICSR&(u32)0x003FF000)>>0x0C));}/********************************************************************************函数名称:NVIC_GetIRQChannelPendingBitStatus*功能描述:检查指定IRQ通道挂起位是否置位。*输入参数:NVIC_IRQChannel:要检查的的中断挂起位.*输出参数:无*返回参数:IRQ通道挂起位的新状态(SETorRESET).“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/ITStatusNVIC_GetIRQChannelPendingBitStatus(u8NVIC_IRQChannel){ITStatuspendingirqstatus=RESET;u32tmp=0x00;/*Checktheparameters[检查参数]*/assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));tmp=((u32)0x01<<(NVIC_IRQChannel&(u32)0x1F));if(((NVIC->ISPR[(NVIC_IRQChannel>>0x05)])&tmp)==tmp){pendingirqstatus=SET;}else{pendingirqstatus=RESET;}returnpendingirqstatus;}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名称:NVIC_SetIRQChannelPendingBit*功能描述:设置NVIC中断挂起位。*输入参数:NVIC_IRQChannel:指定了要置位的中断挂起位。*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_SetIRQChannelPendingBit(u8NVIC_IRQChannel){/*Checktheparameters[检查参数]*/assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));*(vu32*)0xE000EF00=(u32)NVIC_IRQChannel;}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名称:NVIC_ClearIRQChannelPendingBit*功能描述:清除NVIC中断挂起位。*输入参数:NVIC_IRQChannel:指定了要清除的中断挂起位。*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_ClearIRQChannelPendingBit(u8NVIC_IRQChannel){/*Checktheparameters[检查参数]*/assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));NVIC->ICPR[(NVIC_IRQChannel>>0x05)]=(u32)0x01<<(NVIC_IRQChannel&(u32)0x1F);}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名称:NVIC_GetCurrentActiveHandler*功能描述:返回当前活动处理程序(IRQ通道和系统处理程序)的标识符*输入参数:无*输出参数:无*返回参数:活动处理程序标识符“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************************************/u16NVIC_GetCurrentActiveHandler(void){return((u16)(SCB->ICSR&(u32)0x3FF));}/********************************************************************************函数名称:NVIC_GetIRQChannelActiveBitStatus*功能描述:检查指定IRQ通道活动位设置与否。*输入参数:NVIC_IRQChannel:指定了要检查的中断活动位.*输出参数:无*返回参数:IRQ通道活动位的新状态(SETorRESET)“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/ITStatusNVIC_GetIRQChannelActiveBitStatus(u8NVIC_IRQChannel){ITStatusactiveirqstatus=RESET;u32tmp=0x00;/*Checktheparameters[检查参数]*/assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));tmp=((u32)0x01<<(NVIC_IRQChannel&(u32)0x1F));if(((NVIC->IABR[(NVIC_IRQChannel>>0x05)])&tmp)==tmp){activeirqstatus=SET;}else{activeirqstatus=RESET;}returnactiveirqstatus;}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名称:NVIC_GetCPUID*功能描述:返回Cortex-M3核的ID号,版本号和实现细节。*输入参数:无*输出参数:无*返回参数:CPUID.“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************************************/u32NVIC_GetCPUID(void){return(SCB->CPUID);}/*******************************************************************************函数名称:NVIC_SetVectorTable*功能描述:设置向量表的位置和偏移量.*输入参数:⑴NVIC_VectTab指定中断向量表在RAM还是在FLASH存储器中.这个参数可以取下面的值之一:-NVIC_VectTab_RAM-NVIC_VectTab_FLASH(2)Offset:向量表的基址偏移,这个值一定要比0x0100高.*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_SetVectorTable(u32NVIC_VectTab,u32Offset){/*Checktheparameters[检查参数]*/assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));assert_param(IS_NVIC_OFFSET(Offset));SCB->VTOR=NVIC_VectTab|(Offset&(u32)0x1FFFFF80);}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/********************************************************************************函数名称:NVIC_GenerateSystemReset*功能描述:生成一个系统复位.*输入参数:无*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_GenerateSystemReset(void){SCB->AIRCR=AIRCR_VECTKEY_MASK|(u32)0x04;}/********************************************************************************函数名称:NVIC_GenerateCoreReset*功能描述:生成一个核(Core+NVIC)复位.*输入参数:无*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_GenerateCoreReset(void){SCB->AIRCR=AIRCR_VECTKEY_MASK|(u32)0x01;}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/*******************************************************************************函数名称:NVIC_SystemLPConfig*功能描述:选择系统进入低功耗模式的条件。*输入参数:(1)LowPowerMode:系统为进入低功耗模式的新模式.这个参数可以取下面的值之一:-NVIC_LP_SEVONPEND-NVIC_LP_SLEEPDEEP-NVIC_LP_SLEEPONEXIT(2)NewState:LP条件的新状态.这个参数可以是:ENABLE或DISABLE.*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_SystemLPConfig(u8LowPowerMode,FunctionalStateNewState){/*Checktheparameters[检查参数]*/assert_param(IS_NVIC_LP(LowPowerMode));assert_param(IS_FUNCTIONAL_STATE(NewState));if(NewState!=DISABLE){SCB->SCR|=LowPowerMode;}else{SCB->SCR&=(u32)(~(u32)LowPowerMode);}}/*******************************************************************************函数名称:NVIC_SystemHandlerConfig*功能描述:使能或关闭指定的系统处理程序。*输入参数:⑴SystemHandler:系统处理程序有效或无效..这个参数可以取下面的值之一:-SystemHandler_MemoryManage-SystemHandler_BusFault-SystemHandler_UsageFault(2)NewState:指定系统处理程序的新状态.这个参数可以是:ENABLE或DISABLE.*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_SystemHandlerConfig(u32SystemHandler,FunctionalStateNewState){u32tmpreg=0x00;/*Checktheparameters[检查参数]*/assert_param(IS_CONFIG_SYSTEM_HANDLER(SystemHandler));assert_param(IS_FUNCTIONAL_STATE(NewState));tmpreg=(u32)0x01<<(SystemHandler&(u32)0x1F);if(NewState!=DISABLE){SCB->SHCSR|=tmpreg;}else{SCB->SHCSR&=〜tmpreg;}}/*******************************************************************************函数名称:NVIC_SystemHandlerPriorityConfig*功能描述:配置指定系统处理程序的优先级。*输入参数:⑴SystemHandler:使能或关闭系统处理程序.这个参数可以取下面的值之一:SystemHandler_MemoryManageSystemHandler_BusFault-SystemHandler_UsageFault-SystemHandler_SVCall-SystemHandler_DebugMonitor-SystemHandler_PSV-SystemHandler_SysTickSystemHandlerPreemptionPriority:指定系统处理程序的新的优先级组.SystemHandlerSubPriority指定系统处理程序的新子优先级.*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个个/voidNVIC_SystemHandlerPriorityConfig(u32SystemHandler,u8SystemHandlerPreemptionPriority,u8SystemHandlerSubPriority){u32tmp1=0x00,tmp2=0xFF,handlermask=0x00;u32tmppriority=0x00;/*Checktheparameters[检查参数]*/assert_param(IS_PRIORITY_SYSTEM_HANDLER(SystemHandler));assert_param(IS_NVIC_PREEMPTION_PRIORITY(SystemHandlerPreemptionPriority));assert_param(IS_NVIC_SUB_PRIORITY(SystemHandlerSubPriority));tmppriority=(0x700-(SCB->AIRCR&(u32)0x700))>>0x08;tmp1=(0x4-tmppriority);tmp2=tmp2>>tmppriority;tmppriority=(u32)SystemHandlerPreemptionPriority<<tmp1;tmppriority|=SystemHandlerSubPriority&tmp2;tmppriority=tmppriority<<0x04;tmp1=SystemHandler&(u32)0xC0;tmp1=tmp1>>0x06;tmp2=(SystemHandler>>0x08)&(u32)0x03;tmppriority=tmppriority<<(tmp2*0x08);handlermask=(u32)0xFF<<(tmp2*0x08);SCB->SHPR[tmp1]&=-handlermask;SCB->SHPR[tmp1]|=tmppriority;}3“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““/*******************************************************************************函数名称:NVIC_GetSystemHandlerPendingBitStatus*功能描述:检查指定系统处理程序挂起位设置与否。*输入参数:SystemHandler:要检查的系统处理程序挂起位.这个参数可以取下面的值之一:-SystemHandler_MemoryManage-SystemHandler_BusFault-SystemHandler_SVCall*输出参数:无*返回参数:系统处理程序挂起位的新状态(SETorRESET).“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************************************/ITStatusNVIC_GetSystemHandlerPendingBitStatus(u32SystemHandler){ITStatusbitstatus=RESET;u32tmp=0x00,tmppos=0x00;/*Checktheparameters[检查参数]*/assert_param(IS_GET_PENDING_SYSTEM_HANDLER(SystemHandler));tmppos=(SystemHandler>>0x0A);tmppos&=(u32)0x0F;tmppos=(u32)0x01<<tmppos;tmp=SCB->SHCSR&tmppos;if(tmp==tmppos){bitstatus=SET;}else{bitstatus=RESET;}returnbitstatus;}/*******************************************************************************函数名称:NVIC_SetSystemHandlerPendingBit*功能描述:设置系统处理程序挂起位。*输入参数:SystemHandler:要设置的系统处理程序挂起位.这个参数可以取下面的值之一:SystemHandler_NMISystemHandler_PSV-SystemHandler_SysTick*输出参数:无*返回参数:无“““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““*******************************************************************************/voidNVIC_SetSystemHandlerPendingBit(u32SystemHandler){u32tmp=0x00;/*Checktheparameters[检查参数]*/assert_param(IS_SET_PENDING_SYSTEM_HANDLER(SystemHandler));/*GettheSystemHandlerpendi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中原-恒基中国沈阳沈北项目营销策划提案课件
- 《雷达系统原理》课件
- 产科超声标准课件
- 物理治疗学练习试题
- 车身判断上复习测试附答案
- 《质点的运动方程》课件
- 合理消费与消费结构课件
- 《癌痛规范化治疗》课件
- 《SPIN销售技巧》课件
- 二零二五年度品牌线上线下整合营销合同
- 高三英语阅读专项训练之说明文(含答案及部分解析)
- 淘汰电机型号汇总
- 小波分析全章节讲解课件
- 中国移动CHBN试题题库大全(含答案)
- 医学课件:介入放射学(全套课件328张)
- 2022年同等学力人员申请硕士学位日语水平统一考试真题
- 病毒性感染性腹泻医学课件
- 水泥搅拌桩记录表格范本
- DL∕T 458-2020 板框式旋转滤网
- 食品添加剂、食品污染物的本底与转化来源
- 短视频:策划制作与运营课件
评论
0/150
提交评论