STM32的SYSTICK详解

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

摘自网络什么是SYSTICK:这是一个24位的系统节拍定时器systemticktimer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。作用:在单任务引用程序中,因为其架构就决定了它执行任务的串行性,这就引出一个问题:当某个任务出现问题时,就会牵连到后续的任务,进而导致整个系统崩溃。要解决这个问题,可以使用实时操作系统(RTOS).因为RTOS以并行的架构处理任务,单一任务的崩溃并不会牵连到整个系统。这样用户出于可靠性的考虑可能就会基于RTOS来设计自己的应用程序。这样SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供一个有节奏的“心跳”。微控制器的定时器资源一般比较丰富,比如STM32存在8个定时器,为啥还要再提供一个SYSTICK?原因就是所有基于ARMCortex_M3内核的控制器都带有SysTick定时器,这样就方便了程序在不同的器件之间的移植。而使用RTOS的第一项工作往往就是将其移植到开发人员的硬件平台上,由于SYSTICK的存在无疑降低了移植的难度。SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。时钟的选择:用户可以在位于Cortex_M3处理器系统控制单元中的系统节拍定时器控制和状态寄存器(SysTickcontrolandstatusregister,SCSR)选择systick时钟源。如将SCSR中的CLKSOURCE位置位,SysTick会在CPU频率下运行;而将CLKSOUCE位清除则SysTick会以CPU主频的1/8频率运行。3.5版本的库函数与以往的有所区别不存在stm32f10x_systick.c文件,故原来的一些函数也不存在,比如SysTick_SetReload(u32reload);SysTick_ITConfig(FunctionalStateNewState);等在3.5版本的库函数中与systick相关的函数只有两个第一个,SysTick_Config(uint32_tticks),在core_cm3.h头文件中进行定义的。第二个,voidSysTick_CLKSourceConfig(uint32_tSysTick_CLKSource),在misc.c文件中定义的。SysTick_Config(uint32_tticks),在core_cm3.h主要的作用:1、初始化systick2、打开systick3、打开systick的中断并设置优先级4、返回一个0代表成功或1代表失败注意:Uint32_tticks即为重装值,这个函数默认使用的时钟源是AHB,即不分频。要想分频,调用voidSysTick_CLKSourceConfig(uint32_tSysTick_CLKSource),但是要注意函数调用的次序,先SysTick_Config(uint32_tticks),后SysTick_CLKSourceConfig(uint32_tSysTick_CLKSource)函数说明:/***@briefInitializeandstarttheSysTickcounteranditsinterrupt.**@paramticksnumberofticksbetweentwointerrupts*@return1=failed,0=successful**Initialisethesystemticktimeranditsinterruptandstartthe*systemticktimer/counterinfreerunningmodetogenerate*periodicalinterrupts.*/static__INLINEuint32_tSysTick_Config(uint32_tticks){if(ticksSysTick_LOAD_RELOAD_Msk)return(1);/*Reloadvalueimpossible*/重装载值必须小于0XFFFFFF,为什么,这是一个24位的递减计数器。SysTick-LOAD=(ticks&SysTick_LOAD_RELOAD_Msk)-1;/*setreloadregister*/设置重装载值,SysTick_LOAD_RELOAD_Msk定义见后面NVIC_SetPriority(SysTick_IRQn,(1__NVIC_PRIO_BITS)-1);/*setPriorityforCortex-M0SystemInterrupts*/SysTick-VAL=0;/*LoadtheSysTickCounterValue*/SysTick-CTRL=SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk;/*EnableSysTickIRQandSysTickTimer*/return(0);/*Functionsuccessful*/}#endif与systick相关的寄存器定义/**@addtogroupCMSIS_CM3_SysTickCMSISCM3SysTickmemorymappedstructureforSysTick@{*/typedefstruct{__IOuint32_tCTRL;/*!Offset:0x00SysTickControlandStatusRegister*/__IOuint32_tLOAD;/*!Offset:0x04SysTickReloadValueRegister*/__IOuint32_tVAL;/*!Offset:0x08SysTickCurrentValueRegister*/__Iuint32_tCALIB;/*!Offset:0x0CSysTickCalibrationRegister*/}SysTick_Type;与systick寄存器相关的寄存器及位的定义/*SysTickControl/StatusRegisterDefinitions*/控制/状态寄存器#defineSysTick_CTRL_COUNTFLAG_Pos16/*!SysTickCTRL:COUNTFLAGPosition*/#defineSysTick_CTRL_COUNTFLAG_Msk(1ulSysTick_CTRL_COUNTFLAG_Pos)/*!SysTickCTRL:COUNTFLAGMask*/溢出标志位#defineSysTick_CTRL_CLKSOURCE_Pos2/*!SysTickCTRL:CLKSOURCEPosition*/#defineSysTick_CTRL_CLKSOURCE_Msk(1ulSysTick_CTRL_CLKSOURCE_Pos)/*!SysTickCTRL:CLKSOURCEMask*/时钟源选择位,0=外部时钟;1=内核时钟#defineSysTick_CTRL_TICKINT_Pos1/*!SysTickCTRL:TICKINTPosition*/#defineSysTick_CTRL_TICKINT_Msk(1ulSysTick_CTRL_TICKINT_Pos)/*!SysTickCTRL:TICKINTMask*/异常请求位#defineSysTick_CTRL_ENABLE_Pos0/*!SysTickCTRL:ENABLEPosition*/#defineSysTick_CTRL_ENABLE_Msk(1ulSysTick_CTRL_ENABLE_Pos)/*!SysTickCTRL:ENABLEMask*/使能位/*SysTickReloadRegisterDefinitions*/#defineSysTick_LOAD_RELOAD_Pos0/*!SysTickLOAD:RELOADPosition*/#defineSysTick_LOAD_RELOAD_Msk(0xFFFFFFulSysTick_LOAD_RELOAD_Pos)/*!SysTickLOAD:RELOADMask*//*SysTickCurrentRegisterDefinitions*/#defineSysTick_VAL_CURRENT_Pos0/*!SysTickVAL:CURRENTPosition*/#defineSysTick_VAL_CURRENT_Msk(0xFFFFFFulSysTick_VAL_CURRENT_Pos)/*!SysTickVAL:CURRENTMask*//*SysTickCalibrationRegisterDefinitions*/#defineSysTick_CALIB_NOREF_Pos31/*!SysTickCALIB:NOREFPosition*/#defineSysTick_CALIB_NOREF_Msk(1ulSysTick_CALIB_NOREF_Pos)/*!SysTickCALIB:NOREFMask*/#defineSysTick_CALIB_SKEW_Pos30/*!SysTickCALIB:SKEWPosition*/#defineSysTick_CALIB_SKEW_Msk(1ulSysTick_CALIB_SKEW_Pos)/*!SysTickCALIB:SKEWMask*/#defineSysTick_CALIB_TENMS_Pos0/*!SysTickCALIB:TENMSPosition*/#defineSysTick_CALIB_TENMS_Msk(0xFFFFFFulSysTick_VAL_CURRENT_Pos)/*!SysTickCALIB:TENMSMask*//*@}*//*endofgroupCMSIS_CM3_SysTick*/与systick相关的寄存器的说明voidSysTick_CLKSourceConfig(uint32_tSysTick_CLKSource)作用:选择systick的时钟源,AHB时钟或AHB的8分频默认使用的是AHB时钟,即72MHz函数说明:/***@briefConfigurestheSysTickclocksource.*@paramSysTick_CLKSource:specifiestheSysTickclocksource.*Thisparametercanbeoneofthefollowingvalues:*@argSysTick_CLKSource_HCLK_Div8:AHBclockdividedby8selectedasSysTickclocksource.*@argSysTick_CLKSource_HCLK:AHBclockselectedasSysTickclocksource.*@retvalNone*/voidSysTick_CLKSourceConfig(uint32_tSysTick_CLKSource){/*Checktheparameters*/assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));if(SysTick_CLKSource==SysTick_CLKSource_HCLK){SysTick-CTRL|=SysTick_CLKSource_HCLK;}else{SysTick-CTRL&=SysTick_CLKSource_HCLK_Div8;}}Systick时钟源的定义:/**@defgroupSysTick_clock_source*@{*/#defineSysTick_CLKSource_HCLK_

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功