太湖度假区建设局网站,兰州家政公司,做一个微信商城小程序多少钱,专业设计网站公司今天我们来说说SysTick定时器。SysTick定时器在从参考手册中根本没有介绍。我费了九牛二虎之力才在一个犄角格拉里找到SysTick定时器的英文版的说明。在Cotex-M3有介绍#xff0c;为什么要找STM32的介绍#xff0c;是因为功能设置上还有点区别。首先看一下SysTick定时器的作用… 今天我们来说说SysTick定时器。SysTick定时器在从参考手册中根本没有介绍。我费了九牛二虎之力才在一个犄角格拉里找到SysTick定时器的英文版的说明。在Cotex-M3有介绍为什么要找STM32的介绍是因为功能设置上还有点区别。首先看一下SysTick定时器的作用下面是Cotex-M3里的一段话SysTick定时器被捆绑在NVIC中用于产生SYSTICK异常(异常号15)。在以前大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断作为整个系统的时基。例如为多个任务许以不同数目的时间片确保没有一个任务能霸占系统或者把每个定时器周期的某个时间范围赐予特定的任务等还有操作系统提供的各种定时功能都与这个滴答定时器有关。因此需要一个定时器来产生周期性的中断而且最好还让用户程序不能随意访问它的寄存器以维持操作系统“心跳”的节律。Cortex‐M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器软件在不同CM3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(FCLKCM3上的自由运行时钟)或者是外部时钟(CM3处理器上的STCLK信号)。不过STCLK的具体来源则由芯片设计者决定因此不同产品之间的时钟频率可能会大不相同你需要检视芯片的器件手册来决定选择什么作为时钟源。知道我为什么找ST关于SysTick的说明了吧SysTick介绍下面介绍STM32中的SysTick。SysTick部分内容属于NVIC控制部分一共有4个寄存器名称和地址分别是STK_CSR,0xE000E010—控制寄存器STK_LOAD,0xE000E014—重载寄存器STK_VAL,0xE000E018—当前值寄存器STK_CALRB,0xE000E01C—校准值寄存器1STK_CSR控制寄存器首先看STK_CSR控制寄存器寄存器内有4个位具有意义第0位ENABLESysTick使能位(0关闭Systick功能1开启Systick功能)。第1位TICKINTSysTick中断使能位(0关闭Systick中断1开启Systick中断)。第2位CLKSOURCESysTick时钟源选择(0使用HCLK/8 作为Systick时钟1使用HCLK作为Systick时钟)。第3位COUNTFLAGSysTick计数比较标志如果在上次读取本寄存器后SysTick 已经数到了0则该位为1。如果读取该位该位将自动清零。2STK_LOAD重载寄存器SysTick是一个递减的定时器。当定时器递减至0时重载寄存器中的值就会被重装载继续开始递减。STK_LOAD重载寄存器是个24位的寄存器最大计数0xFFFFFF。3STK_VAL当前值寄存器STK_VAL当前值寄存器也是个24位的寄存器。读取时返回当前倒计数的值写它则使之清零同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志。4STK_CALRB校准值寄存器这个寄存器以我目前的水平还用不到大体意思明白点把英文说明放这吧。位31 NOREF1没有外部参考时钟(STCLK不可用)0外部参考时钟可用。位30 SKEW1校准值不是准确的1ms0校准值是准确的1ms。位[23:0] Calibration value。英文说明Indicates the calibration value when the SysTick counter runs on HCLK max/8 as external clock. The value is product dependent, please refer to the Product Reference Manual, SysTick Calibration Value section. When HCLK is programmed at the maximum frequency, the SysTick period is 1ms. If calibration information is not known, calculate the calibration value required from the frequency of the processor clock or external clock.SysTick定时器除了能服务于操作系统之外还能用于其它目的如作为一个闹铃用于测量时间等。要注意的是当处理器在调试期间被喊停(halt)时则SysTick定时器亦将暂停运作。SysTick定时器跑程序下面我们就应用SysTick定时器来裸奔把它作为一个定时器来用还是老一套在寄存器头文件中添加定义寄存器。//*****************************************************************//* SystemTick-Register //*******************************************************************#define SYSTICK_TENMS (*((volatile unsigned long *)0xE000E01C))#define SYSTICK_CURRENT (*((volatile unsigned long *)0xE000E018))#define SYSTICK_RELOAD (*((volatile unsigned long *)0xE000E014))#define SYSTICK_CSR (*((volatile unsigned long *)0xE000E010))配置SysTick寄存器void SysTick_Configuration(void){SYSTICK_CURRENT0; //当前值寄存器SYSTICK_RELOAD20000; //重装载寄存器系统时钟20M中断一次1mSSYSTICK_CSR|0x06;// HCLK作为Systick时钟Systick中断使能位}中断处理void SysTick_Handler(void) //中断函数{extern unsigned long TimingDelay; // 延时时间注意定义为全局变量SYSTICK_CURRENT0;if (TimingDelay ! 0x00)TimingDelay--;}利用SysTick的延时函数unsigned long TimingDelay; // 延时时间注意定义为全局变量void Delay(unsigned long nTime) //延时函数{SYSTICK_CSR|0x07; // 使能SysTick计数器TimingDelay nTime; // 读取延时时间while(TimingDelay ! 0); // 判断延时是否结束SYSTICK_CSR|0x06;// 关闭SysTick计数器}int main(){SystemInit0(); //系统(时钟)初始化stm32_GpioSetup (); //GPIO初始化SysTick_Configuration(); //配置systick定时器while(1){GPIO_PORTB_ODR|(15);Delay(1000); //1SGPIO_PORTB_ODR~(15);Delay(1000); //1S}}完成Delay(1000);实现了1S的精确延时。利用Delay(unsigned long nTime);配合SysTick定时器可以实现任意时间的精确延时。当然通过定时器TIMx也是可以这样做的我只是用它来说明SysTick定时器的用法。