STM32的SYSTICK详解

合集下载

STM32学习笔记—SysTick定时器

STM32学习笔记—SysTick定时器

STM32 学习笔记—SysTick 定时器Q:什幺是SYSTick 定时器?
SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。

只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。

Q:为什幺要设置SysTick 定时器?
(1)产生操作系统的时钟节拍
SysTick 定时器被捆绑在NVIC 中,用于产生SYSTICK 异常(异常号:15)。

在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。

因此,需要一个定时器来产生周期性的中断,
而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统心跳的节律。

(2)便于不同处理器之间程序移植。

Cortex㎝3 处理器内部包含了一个简单的定时器。

因为所有的CM3 芯片都带有这个定时器,软件在不同CM3 器件间的移植工作得以化简。

该定时器的时钟源可以是内部时钟(FCLK,CM3 上的自由运行时钟),或者是外部时钟( CM3 处理器上的STCLK 信号)。

学习笔记:STM32的SysTick定时器

学习笔记:STM32的SysTick定时器

学习笔记:STM32的SysTick定时器SysTick定时器是一个系统定时器,该定时器是个24位的倒计数定时器,该定时器的最大用处在于可以提供一个操作系统任务切换所需要的“时钟滴答”。

该定时器是STM32中功能最简单的定时器,提供倒计数、中断两个功能,类似与8051的定时器。

SysTick是包含在Cortex-M3内核中的一个简单的定时器。

因为所有的CM3芯片都带有这个定时器,软件在不同芯片生产厂商的CM3器件间的移植工作就得以简化。

该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟(CM3处理器上的STCLK信号)。

不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能大不相同。

因此,需要阅读芯片的使用手册来确定选择什么作为时钟源。

在STM32中SysTick以外部时钟HCLK(AHB时钟)或HCLK/8作为运行时钟。

SysTick工作分析SysTick是一个24位的定时器,即一次最多可以计数2^24个时钟脉冲,这个脉冲的计数值被保存到当前计数值寄存器STK_VAL中,只能向下计数,每接收到一个时钟脉冲STK_VAL 的值就向下减1,直到为0。

当STK_VAL的值被减至0时,由硬件自动把重载寄存器STK_LOAD 中保存的数值加载到STK_VAL中,STK_VAL又重新向下计数……当使能中断时,STK_VAL的值减至0时,触发中断,就可以在中断服务函数中处理定时事件了。

当然,要使SysTick进行以上工作必须要进行SysTick配置。

它的控制配置很简单,只有三个控制位和一个标志位,都位于寄存器STK_CTRL中。

STK_CTRL是一个32位的寄存器,该寄存器与SysTick有关的位分别为Bit0(ENABLE)、Bit1(TICKINT)、Bit2(CLKSOURCE)、Bit16(COUNTFLAG)。

Bit0(ENABLE):SysTick的使能位,此位为1的时候使能SysTick定时器,为0的时候关闭SysTick定时器。

玩转STM32之systick篇

玩转STM32之systick篇

系统嘀嗒(SysTick)Cortex-M3处理器内部包含了一个简单的定时器。

因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作就得以化简。

该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。

不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同。

因此,需要检视芯片的器件手册来决定选择什么作为时钟源。

SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号:15)。

在以前,操作系统还有所有使用了时基的系统,都必须一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。

滴答中断对操作系统尤其重要。

例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。

因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。

Stm32系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值) ,产生1ms 时间基准。

(STM32中systick校准数值寄存器为制度读23:0位值为9000)static u8 fac_us=0;//us延时倍乘数static u16 fac_ms=0;//ms延时倍乘数//初始化延迟函数//SYSTICK的时钟固定为HCLK时钟的1/8//SYSCLK:系统时钟void delay_init(u8 SYSCLK){SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟 HCLK/8fac_us=SYSCLK/8;fac_ms=(u16)fac_us*1000;}//延时nms//注意nms的范围//SysTick->LOAD为24位寄存器,所以,最大延时为://nms<=0xffffff*8*1000/SYSCLK//SYSCLK单位为Hz,nms单位为ms//对72M条件下,nms<=1864void delay_ms(u16 nms){u32 temp;SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; //清空计数器SysTick->CTRL|=0x01 ; //开始倒数do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待时间到达SysTick->CTRL=0x00; //关闭计数器SysTick->VAL =0X00; //清空计数器}//延时nus//nus为要延时的us数.void delay_us(u32 nus){u32 temp;SysTick->LOAD=nus*fac_us; //时间加载SysTick->VAL=0x00; //清空计数器SysTick->CTRL=0x01 ; //开始倒数do{temp=SysTick->CTRL;}while(temp&0x01&&!(temp&(1<<16)));//等待时间到达SysTick->CTRL=0x00; //关闭计数器SysTick->VAL =0X00; //清空计数器}。

STM32知识:什么是SYSTICK 作用是什么

STM32知识:什么是SYSTICK 作用是什么

STM32知识:什么是SYSTICK 作用是什么什么是SYSTICK:这是一个24位的系统节拍定时器system TIck TImer,SysTIck,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。

作用:在单任务引用程序中,因为其架构就决定了它执行任务的串行性,这就引出一个问题:当某个任务出现问题时,就会牵连到后续的任务,进而导致整个系统崩溃。

要解决这个问题,可以使用实时操作系统(RTOS).因为RTOS以并行的架构处理任务,单一任务的崩溃并不会牵连到整个系统。

这样用户出于可靠性的考虑可能就会基于RTOS来设计自己的应用程序。

这样SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供一个有节奏的心跳。

微控制器的定时器资源一般比较丰富,比如STM32存在8个定时器,为啥还要再提供一个SYSTICK?原因就是所有基于ARM Cortex_M3内核的控制器都带有SysTick定时器,这样就方便了程序在不同的器件之间的移植。

而使用RTOS的第一项工作往往就是将其移植到开发人员的硬件平台上,由于SYSTICK的存在无疑降低了移植的难度。

SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。

要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

时钟的选择:用户可以在位于Cortex_M3处理器系统控制单元中的系统节拍定时器控制和状态寄存器(SysTick control and status register ,SCSR)选择systick 时钟源。

如将SCSR中的CLKSOURCE位置位,SysTick会在CPU频率下运行;而将CLKSOUCE位清除则SysTick 会以CPU主频的1/8频率运行。

3.5版本的库函数与以往的有所区别不存在stm32f10x_systick.c文件,故原来的一些函数也不存在,比如SysTick_SetReload(u32。

STM32单片机SysTick系统滴答功能解析

STM32单片机SysTick系统滴答功能解析

STM32 单片机SysTick 系统滴答功能解析
今天讲解“STM32F103SysTick 系统滴答”,“SysTIck系统滴答”是属于Cortex-M3 内核的一部分,主要是为运行的操作系统提供滴答时钟,如常见的操作系统:uCOS、RTOS 等。

不管M3 芯片属于哪一家公司,它都标配有SysTIck 这一部分。

因此,它属于芯片内核的一部分,主要是为了方便操作系统的移植。

其实,SysTIck 能实现的功能,都可以由TIM 来实现。

SysTick 无非就是定时中断的功能,它完全可以由TIM 定时器来完成。

之所以SysTick 独立出来就是因为它属于内核一部分,方便用户移植,而且简单方便。

学过uCOS 的人都知道,以前在51,或者430 上面是由定时器完成的时钟滴答,到后面ARM 公司就用到了一个好的办法,就是在内核中标配一个SysTick,这样下来移植系统不用那幺麻烦了。

SysTick 除了在操作系统中起到作用,其实在裸机程序中也起到很大作用,比如:定期处理一段程序、超时定时、串口接收超时等,今天就以“定期处理一段程序”为例来说一下。

内容讲解。

关于STM32 Systick 延时函数 变量全局引用的问题

关于STM32 Systick 延时函数 变量全局引用的问题

关于STM32 Systick 延时函数变量全局引用的问题STM32_MDK
有这样一段代关于systick.c,如下:
就是这样一段代码,在stm32里是最常用的精确延时函数,在编译器编译等级为0的时候一切OK,但是一旦上调编译等级到2或者3的时候程序就会死在代码中绿色的位置。

最后经尝试知道了是需要在全局变量里使用volatile关键字,否则在编译器进行优化的时候容易产生错误。

仔细分析下类似与变量竞争,一个是中断不断在引用,另外一个是while的循环。

如果使用volatile关键字,编译器就会对每次的变量操作进行实际赋值,
从而保证了变量数据的真实性。

STM32系统systick定时器与延迟时间计算

STM32系统systick定时器与延迟时间计算STM32系统systick定时器与延迟时间计算系统嘀嗒(SysTick)校准值寄存器1.(SysTick) 系统嘀嗒时钟是由HCLK 分频出来的。

HCLK=SYSCLK=72MHz/* Select HCLK/8 as SysTick clock source */SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);当系统嘀嗒时钟设定为9 兆赫或是:SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);当系统嘀嗒时钟设定为72 兆赫2.系统嘀嗒校准值固定到9000,当系统嘀嗒时钟设定为9 兆赫,产生1ms 时基。

/* SysTick interrupt each 9ms with counter clock equal to 1MHz */SysTick_SetReload(9000);该参数取值必须在1和0x00FFFFFF之间3.使能一下:/* Enable the SysTick Counter */SysTick_CounterCmd(SysTick_Counter_Enable);/* Enable the SysTick Interrupt */SysTick_ITConfig(ENABLE);这还有另外一种设置方法:经试验验证可行://NVIC_InitTypeDef NVIC_InitStructure;/* Configure HCLK clock as SysTick clock source */SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);/* Configure the SysTick handler priority */NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick,2, 0);/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/* SysTick interrupt each 100 Hz with HCLK equal to 72MHz 每1ms发生一次SysTick中断*/SysTick_SetReload(72000);/* Enable the SysTick Interrupt */SysTick_ITConfig(ENABLE);/* Enable the SysTick Counter */SysTick_CounterCmd(SysTick_Counter_Enable);关键是:SysTick_CLKSourceConfig,和SysTick_SetReload。

STM32入门教程系统时钟SysTick

STM32入门教程系统时钟SysTickSTM32 入门教程系统时钟 SysTick(一) 背景介绍在传统的嵌入式系统软件按中通常实现 Delay(N) 函数的方法为:for(i = 0; i <= x; i ++);x --- 对应于对应于 N 毫秒的循环值对于STM32系列微处理器来说,执行一条指令只有几十个ns,进行 for 循环时,要实现 N 毫秒的 x 值非常大,而且由于系统频率的宽广,很难计算出延时 N 毫秒的精确值。

针对 STM32 微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N)。

(二) STM32 SysTick 介绍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 类型 , 延迟时间将不随系统时钟频率改变。

(三) ST SysTick 库文件使用ST的函数库使用systick的方法1、调用SysTick_CounterCmd() -- 失能SysTick计数器2、调用SysTick_ITConfig () -- 失能SysTick中断3、调用SysTick_CLKSourceConfig() -- 设置SysTick时钟源。

4、调用SysTick_SetReload() -- 设置SysTick重装载值。

STM32单片机Systick函数的使用方法

STM32单片机Systick函数的使用方法STM32单片机Systick函数的使用方法在“嵌入式学习006_Systick使用(一)”中,详细介绍了SysTIck中寄存器的使用方法,用到了很多函数,实际上到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS.h中定义的函数,其中CMSIS只提供了一个SysTIck设置的函数,替代了STM32原来有的所有的驱动函数,这样做的目的,可能是简化SysTIck 的设置,可是降低了用户对SysTIck的可控性。

在CMSIS中提供的函数是SysTick_Config(uint32_t ticks); 该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(V AL)的值,开始计数并打开SysTick IRQ中断。

SysTick时钟默认使用系统时钟。

其中这个函数定义在Core_cm3.h中,源代码如下所示:static __INLINE uint32_t SysTick_Config(uint32_t ticks){if (ticks 》SysTick_LOAD_RELOAD_Msk)return (1);SysTick-》LOAD= (ticksNVIC_SetPriority (SysTick_IRQn,(1《《__NVIC_PRIO_BITS)- 1);SysTick-》V AL= 0;SysTick-》CTRL= SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk;return (0);}从上面的函数中可以看出,这个函数把Systick的初值,中断优先级,使能中断,开启定时器都完成了。

大大简化了程序。

其中ticks 代表的是初值。

例如系统时钟是72Mhz 那么要产生1ms的时基,那么我们可以这样去写。

stm32延时微秒函数

stm32延时微秒函数在STM32开发中,延时函数是一个非常常用的功能。

它能够帮助我们实现在特定的时间间隔内进行各种操作,比如控制LED灯的闪烁、读取传感器数据等等。

而其中一个常用的延时函数就是微秒级延时函数。

在STM32中,我们可以使用SysTick定时器来实现微秒级的延时。

SysTick是一种系统定时器,它可以以固定的频率进行计数,并触发中断。

我们可以通过配置SysTick定时器的加载值和时钟源,来实现不同的延时时间。

我们需要初始化SysTick定时器。

可以设置它的时钟源为内核时钟,并将加载值设置为内核时钟频率除以所需延时的微秒数。

然后,我们需要使能SysTick定时器,并设置优先级。

接着,我们就可以开始使用延时函数了。

延时函数的实现可以采用简单的循环来实现。

我们可以使用一个计数器来进行计数,每经过一定的时间间隔,计数器加一。

当计数器达到所需的延时时间时,延时函数就结束了。

下面是一个简单的示例代码,展示了如何使用SysTick定时器来实现微秒级延时函数:```c#include "stm32f4xx.h"void delay_us(uint32_t us){uint32_t ticks = us * (SystemCoreClock / 1000000); uint32_t start = SysTick->VAL;while ((SysTick->VAL - start) < ticks);}int main(void){SystemInit();// 初始化SysTick定时器SysTick_Config(SystemCoreClock / 1000000);while (1){// 延时1秒delay_us(1000000);// 进行其他操作}}```在上面的代码中,delay_us函数接受一个参数us,表示所需的延时时间,单位为微秒。

首先,我们根据内核时钟频率和延时时间计算出需要的计数值ticks。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘自网络什么是SYSTICK:这是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。

作用:在单任务引用程序中,因为其架构就决定了它执行任务的串行性,这就引出一个问题:当某个任务出现问题时,就会牵连到后续的任务,进而导致整个系统崩溃。

要解决这个问题,可以使用实时操作系统(RTOS).因为RTOS以并行的架构处理任务,单一任务的崩溃并不会牵连到整个系统。

这样用户出于可靠性的考虑可能就会基于RTOS来设计自己的应用程序。

这样SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供一个有节奏的“心跳”。

微控制器的定时器资源一般比较丰富,比如STM32存在8个定时器,为啥还要再提供一个SYSTICK?原因就是所有基于ARM Cortex_M3内核的控制器都带有SysTick定时器,这样就方便了程序在不同的器件之间的移植。

而使用RTOS的第一项工作往往就是将其移植到开发人员的硬件平台上,由于SYSTICK的存在无疑降低了移植的难度。

SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。

要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

时钟的选择:用户可以在位于Cortex_M3处理器系统控制单元中的系统节拍定时器控制和状态寄存器(SysTick control and status register ,SCSR)选择systick时钟源。

如将SCSR中的CLKSOURCE位置位,SysTick会在CPU频率下运行;而将CLKSOUCE位清除则SysTick会以CPU主频的1/8频率运行。

3.5版本的库函数与以往的有所区别不存在stm32f10x_systick.c文件,故原来的一些函数也不存在,比如SysTick_SetReload(u32 reload);SysTick_ITConfig(FunctionalStateNewState);等在3.5版本的库函数中与systick相关的函数只有两个第一个,SysTick_Config(uint32_t ticks),在core_cm3.h头文件中进行定义的。

第二个,void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource),在misc.c文件中定义的。

SysTick_Config(uint32_t ticks),在core_cm3.h主要的作用:1、初始化systick2、打开systick3、打开systick的中断并设置优先级4、返回一个0代表成功或1代表失败注意:Uint32_t ticks 即为重装值,这个函数默认使用的时钟源是AHB,即不分频。

要想分频,调用void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource),但是要注意函数调用的次序,先SysTick_Config(uint32_t ticks),后SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)函数说明:/*** @brief Initialize and start the SysTick counter and its interrupt.** @param ticks number of ticks between two interrupts* @return 1 = failed, 0 = successful** Initialise the system tick timer and its interrupt and start the* system tick timer / counter in free running mode to generate* periodical interrupts.*/static __INLINE uint32_t SysTick_Config(uint32_t ticks){if (ticks >SysTick_LOAD_RELOAD_Msk) return (1);/* Reload value impossible */重装载值必须小于0XFF FFFF,为什么,这是一个24位的递减计数器。

SysTick->LOAD = (ticks &SysTick_LOAD_RELOAD_Msk) - 1;/* set reload register */设置重装载值,SysTick_LOAD_RELOAD_Msk定义见后面NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);/* set Priority for Cortex-M0 System Interrupts */SysTick->VAL = 0;/* Load the SysTick Counter Value */SysTick->CTRL =SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk |SysTick_CTRL_ENABLE_Msk;/* Enable SysTick IRQ and SysTick Timer */return (0);/* Function successful */}#endif与systick相关的寄存器定义/** @addtogroup CMSIS_CM3_SysTick CMSIS CM3 SysTickmemory mapped structure for SysTick@{*/typedefstruct{__IO uint32_t CTRL; /*!< Offset: 0x00 SysTick Control and Status Register */__IO uint32_t LOAD; /*!< Offset: 0x04 SysTick Reload ValueRegister */__IO uint32_t VAL; /*!< Offset: 0x08 SysTick Current ValueRegister */__I uint32_t CALIB; /*!< Offset: 0x0C SysTick CalibrationRegister */} SysTick_Type;与systick寄存器相关的寄存器及位的定义/* SysTick Control / Status Register Definitions */控制/状态寄存器#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!<SysTick CTRL: COUNTFLAG Position */#define SysTick_CTRL_COUNTFLAG_Msk (1ul<<SysTick_CTRL_COUNTFLAG_Pos)/*!<SysTick CTRL: COUNTFLAG Mask */ 溢出标志位#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!<SysTick CTRL: CLKSOURCE Position */#define SysTick_CTRL_CLKSOURCE_Msk (1ul<<SysTick_CTRL_CLKSOURCE_Pos)/*!<SysTick CTRL: CLKSOURCE Mask */时钟源选择位,0=外部时钟;1=内核时钟#define SysTick_CTRL_TICKINT_Pos 1 /*!<SysTick CTRL: TICKINT Position */#define SysTick_CTRL_TICKINT_Msk (1ul<<SysTick_CTRL_TICKINT_Pos)/*!<SysTick CTRL: TICKINT Mask */异常请求位#define SysTick_CTRL_ENABLE_Pos 0 /*!<SysTick CTRL: ENABLE Position */#define SysTick_CTRL_ENABLE_Msk (1ul<<SysTick_CTRL_ENABLE_Pos)/*!<SysTick CTRL: ENABLE Mask */使能位/* SysTick Reload Register Definitions */#define SysTick_LOAD_RELOAD_Pos 0 /*!<SysTick LOAD: RELOAD Position */#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul<<SysTick_LOAD_RELOAD_Pos)/*!<SysTick LOAD: RELOAD Mask *//* SysTick Current Register Definitions */#define SysTick_VAL_CURRENT_Pos 0 /*!<SysTick VAL: CURRENT Position */#define SysTick_VAL_CURRENT_Msk (0xFFFFFFul<<SysTick_VAL_CURRENT_Pos)/*!<SysTick VAL: CURRENT Mask *//* SysTick Calibration Register Definitions */#define SysTick_CALIB_NOREF_Pos 31 /*!<SysTick CALIB: NOREF Position */#define SysTick_CALIB_NOREF_Msk (1ul<<SysTick_CALIB_NOREF_Pos)/*!<SysTick CALIB: NOREF Mask */#define SysTick_CALIB_SKEW_Pos 30 /*!<SysTick CALIB: SKEW Position */#define SysTick_CALIB_SKEW_Msk (1ul<<SysTick_CALIB_SKEW_Pos)/*!<SysTick CALIB: SKEW Mask */#define SysTick_CALIB_TENMS_Pos 0 /*!<SysTick CALIB: TENMS Position */#define SysTick_CALIB_TENMS_Msk (0xFFFFFFul<<SysTick_VAL_CURRENT_Pos) /*!<SysTick CALIB: TENMS Mask *//*@}*/ /* end of group CMSIS_CM3_SysTick */与systick相关的寄存器的说明voidSysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)作用:选择systick的时钟源,AHB时钟或AHB的8分频默认使用的是AHB时钟,即72MHz函数说明:/*** @brief Configures the SysTick clock source.* @param SysTick_CLKSource: specifies the SysTick clock source.* This parameter can be one of the following values:* @arg SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8 selected as SysTick clock source.* @argSysTick_CLKSource_HCLK: AHB clock selected as SysTick clock source.* @retvalNone*/voidSysTick_CLKSourceConfig(uint32_t SysTick_CLKSource){/* Check the parameters */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* @{*/#define SysTick_CLKSource_HCLK_Div8 ((uint32_t)0xFFFFFFFB)//将控制状态寄存器的第二位置0,即用外部时钟源#define SysTick_CLKSource_HCLK ((uint32_t)0x00000004)//将控制状态寄存器的第二位置1,即用内核时钟#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SOURCE) == SysTick_CLKSource_HCLK) || \((SOURCE) == SysTick_CLKSource_HCLK_Div8))Systick定时时间的设定:重装载值=systick 时钟频率(Hz)X想要的定时时间(S)如:时钟频率为:AHB的8分频;AHB=72MHz那么systick的时钟频率为72/8MHz=9MHz;要定时1秒,则重装载值=9000000X1=9000000;定时10毫秒重状态值=9000000X0.01=90000Systick的中断处理函数,在startup_stm32f10x_hd.s启动文件中有定义。

相关文档
最新文档