STM32学习笔记(3):系统时钟和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 作用是什么

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中滴答定时器的工作原理

stm32中滴答定时器的工作原理

stm32中滴答定时器的工作原理滴答定时器(SysTick)是STM32微控制器中的一种基本定时器,用于实现系统级的定时和延时功能。

它通常用于硬件抽象层的操作系统内核的实现以及其他需要高精度定时的应用场景。

滴答定时器的工作原理如下:1.时钟源选择:滴答定时器使用CPU时钟作为输入时钟,因此在使用之前需要首先设置CPU的主频。

CPU时钟可以是外部晶振,也可以是内部RC振荡器,由系统初始化代码进行设置。

2.模式选择和初始化:滴答定时器有两种工作模式,分别是中断模式和定时器模式。

中断模式下,定时器溢出时会产生中断请求,用于实时操作系统的任务调度;在定时器模式下,定时器溢出后会自动清零,用于延时等功能。

通过设置控制寄存器(STK_CTRL)可以选择工作模式和初始化定时器的值。

3.计数器递减:滴答定时器的计数值从初始化值开始递减,直到计数值为零时溢出。

每个CPU时钟周期,计数值会减去一个单位。

CPU的主频越高,滴答定时器的计数速度就越快。

4.滴答定时器中断:当计数值减少到零时,滴答定时器会产生一个溢出中断。

在中断处理函数中,可以执行一些任务,如系统时钟更新、任务调度和延时等。

5. 重载和连续计数:滴答定时器的计数值可以自动加载初始化值,并在溢出后继续计数。

通过设置控制寄存器的使能位(enable)可以实现此功能。

当使能位为1时,计数器溢出后会自动重新加载初始化值并继续计数。

7.滴答定时器的应用:滴答定时器可用于实现微秒级的延时函数,用于生成固定时间间隔的任务调度,或者用于计算程序执行的时间等。

总之,滴答定时器是STM32微控制器中的一种基本定时器,可以用于实现系统级的定时和延时功能。

它通过使用CPU时钟作为输入时钟源,不断递减计数器的值,当计数器溢出时产生中断并执行相应的任务。

通过设置工作模式、初始化值和使能位等参数,可以配置滴答定时器的功能和精度。

它在实时操作系统的任务调度、时钟更新和延时等方面起着重要的作用。

STM32的SYSTICK定时器(系统滴答定时器)

STM32的SYSTICK定时器(系统滴答定时器)

STM32的SYSTICK定时器(系统滴答定时器)什么是SysTick?这是⼀个24位的系统节拍定时器system tick timer,SysTick,具有⾃动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得⼀定的时间间隔。

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

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

这样⽤户出于可靠性的考虑可能就会基于RTOS来设计⾃⼰的应⽤程序。

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

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

⽽使⽤RTOS的第⼀项⼯作往往就是将其移植到开发⼈员的硬件平台上,由于SYSTICK的存在⽆疑降低了移植的难度。

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

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

SysTick时钟的选择SysTick寄存器说明在《Cortex-M3权威指南》(chap8.SysTick定时器章节)有说明⽤户可以在位于Cortex_M3处理器系统控制单元中的系统节拍定时器控制和状态寄存器(SysTick control and status register ,SCSR)选择systick 时钟源。

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

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

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入门教程系统时钟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时钟概念

stm32时钟概念

stm32时钟概念STMicroelectronics的STM32系列是一系列基于ARM Cortex-M 内核的微控制器(MCU)。

时钟系统在STM32芯片中是一个关键的概念,因为它驱动了芯片内部的各种功能模块,包括CPU、外设、总线等。

以下是与STM32时钟相关的一些基本概念:1. 系统时钟(SYSCLK): SYSCLK是STM32中的主时钟,它驱动CPU和内存等核心模块。

其频率由时钟源和分频器的组合决定。

2. 时钟源: STM32芯片通常支持多个时钟源,包括内部RC振荡器、外部晶体振荡器、PLL(相位锁定环)等。

选择适当的时钟源取决于应用的要求,例如需要更高的稳定性或更低的功耗。

3. PLL(Phase-Locked Loop):PLL是一种用于产生高稳定性时钟信号的电路。

通过将一个参考时钟信号与一个可调节的倍频器相锁定,PLL可以生成一个高频率的时钟信号。

4. AHB、APB总线:在STM32中,系统总线被分为高性能总线(AHB)和低速外设总线(APB)。

这两个总线有各自的时钟域,因此可以独立配置时钟。

这种分级的结构有助于提高系统的性能和灵活性。

5. 时钟树:时钟树描述了时钟系统的层次结构,显示了时钟源如何通过PLL和分频器传递到各个模块。

了解时钟树结构对于调整系统时钟和解决时钟相关问题非常有用。

6. 时钟配置寄存器: STM32芯片具有一系列寄存器,允许程序员配置时钟系统。

这些寄存器包括RCC寄存器(RCC,Reset and Clock Control)等,通过编程这些寄存器,可以设置各种时钟参数。

7. 低功耗模式时钟: STM32芯片支持不同的低功耗模式,如停机模式、待机模式等。

在这些模式下,可以降低系统的功耗,因此时钟系统在这些模式下的配置也需要考虑。

时钟配置通常是在启动代码或初始化过程中完成的,程序员可以通过修改相应的寄存器来调整时钟设置以满足应用的需求。

对于具体的时钟配置和使用,建议查阅STMicroelectronics提供的芯片手册和相关文档。

stm32时钟概念

stm32时钟概念

stm32时钟概念
在STM32微控制器中,时钟是控制系统时序和同步的重要元件。

时钟通过提供时钟信号来驱动计时器、外设和处理器核心等,实现数据传输和操作的同步。

STM32微控制器使用了多种类型的时钟,包括系统时钟、高
速外设时钟、低速外设时钟和RTC(实时时钟)时钟。

以下
是对每种时钟的概念的简要描述:
1. 系统时钟:
系统时钟(SYSCLK)是微控制器所有部分的主时钟源,它
控制处理器核心以及许多外设的运行。

系统时钟的频率可以通过配置寄存器来选择,通常是通过增加倍频器或分频器来实现。

2. 高速外设时钟(HCLK):
高速外设时钟是系统时钟分频得到的一个时钟,它驱动一些
对实时性要求较高的外设,例如DMA(直接内存访问控制器)和GPIO(通用输入/输出端口)等。

3. 低速外设时钟(PCLK):
低速外设时钟也是通过系统时钟分频得到的一个时钟,它驱
动一些低速外设,如USART(通用异步收发传输器)和I2C (串行通信接口)等。

4. RTC时钟:
RTC时钟是由外部低速晶体振荡器提供的时钟,用于实时时钟和日历功能。

它通常用于实现计时、日期和闹钟等功能。

时钟源的选择和设置可以通过微控制器的时钟控制寄存器来完成,这些寄存器提供了配置时钟的选项。

根据具体的应用需求,可以选择不同的时钟源和频率来优化系统性能和功耗。

STM32学习笔记——使用SysTick定时器做延时

STM32学习笔记——使用SysTick定时器做延时

STM32学习笔记——使用SysTick定时器做延时
开学了,无法再像假期一样能够一整天玩板了!好在这学期的课说少不少,说多也不多,每周也有十几大节。

剩下的时间除去学生工作等一些七七八八的
事情,间断着还是能看看教程玩玩板!越发发现《STM32菜鸟学习手册啰嗦版》真是不错的入门教程,简单易懂。

其他诸如《固件库手册》等等官方文件更是
必不可少,可惜ST公司的网页找手册实在麻烦得很呐!这两天一直在看有关
于系统嘀嗒时钟SysTick的文件,但由于3.5版的固件库较2.0版的库,已经将SysTick相关的驱动函数移除,用户要使用SysTick就必须改为调用CMSIS中的函数,而网上大多数的例程(包括《菜鸟学习手册》)使用的都是2.0的库,以至于在学习中遇到许多问题,程序编译总会出现问题。

一般都是无法找到与SysTick相关的函数,函数未定义错误。

因此,查找了许多文献才得以解决。

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

主要应用于操作系统,作为嘀嗒中断维持操作系统心跳的节律。

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

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

1.SysTick寄存器:
寄存器
说明
地址
CTRL
SysTick控制和状态寄存器
0xE000E010。

STM32CubeMX配置SystemTick时钟

STM32CubeMX配置SystemTick时钟

STM32CubeMX自动生成SYSTICK配置1.SYSTICK原理及其寄存器1.1 SYSTICK原理SysTick 是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,且同时触发中断。

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

SysTick 的最大使命,就是定期地产生异常请求,作为系统的时基,产生一个周期性的中断。

1.2SYSTICK寄存器CTRL: Systick控制和状态寄存器LOAD: Systick重装载寄存器VAL: Systick当前值寄存器CALIB: Systick校准值寄存器CLKCOURCE-时钟源0:外部时钟源HCLK(AHB总线时钟)/8 72M/8 = 9M 1:内核时钟(HCLK) 72MCURRENT: 每经过一个Systick时钟周期,寄存器值-1 。

2.STM32CubeMX配置与代码生成如下图STM32CubeMX配置所示,图中To Cortex System timer(MHz)就是Systick的时钟频率。

自动代码生成如下:/**Configure the Systick interrupt time */HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/8000); // =/8/1000 :1000 is 1ms ;1000000 is 1us/**Configure the Systick */HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); /* SysTick_IRQn interrupt configuration */HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);3.相关重要的函数3.1中断处理函数void SysTick_Handler(void){/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();HAL_SYSTICK_IRQHandler();/* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */}__IO uint32_t uwTick;__weak void HAL_IncTick(void){uwTick += uwTickFreq;}每次SysTick异常中断后,会执行SysTick_Handler() 函数,然后HAL_IncTick()函数。

STM32学习笔记系统时钟和SysTick定时器

STM32学习笔记系统时钟和SysTick定时器

STM32学习笔记(3):系统时钟和SysTick定时器1.STM32的时钟系统在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL(1)HSI是高速内部时钟,RC振荡器,频率为8MHz;(2)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz;(3)LSI是低速内部时钟,RC振荡器,频率为40KHz;(4)LSE是低速外部时钟,接频率为32.768KHz的石英晶体;(5)PLL为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL 的输入可以接HSI/2、HSE或者HSE/2。

倍频可选择为2 – 16倍,但是其输出频率最大不得超过72MHz。

其中,40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。

另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。

该时钟源只能从PLL端获取,可以选择为1.5分频或者1分频,也就是,当需使用到USB模块时,PLL必须使能,并且时钟配置为48MHz 或72MHz。

另外STM32还可以选择一个时钟信号输出到MCO脚(PA.8)上,可以选择为PLL输出的2分频、HSI、HSE或者系统时钟。

系统时钟SYSCLK,它是提供STM32中绝大部分部件工作的时钟源。

系统时钟可以选择为PLL输出、HSI、HSE。

系系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各个模块使用,AHB分频器可以选择1、2、4、8、16、64、128、256、512分频,其分频器输出的时钟送给5大模块使用:(1)送给AHB总线、内核、内存和DMA使用的HCLK时钟;(2)通过8分频后送给Cortex的系统定时器时钟;(3)直接送给Cortex的空闲运行时钟FCLK;(4)送给APB1分频器。

STM32中的几个时钟SysTick、FCLK、SYSCLK、HCLK的详解

STM32中的几个时钟SysTick、FCLK、SYSCLK、HCLK的详解

STM32中的几个时钟SysTick、FCLK、SYSCLK、HCLK的详解在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。

①、HSI是高速内部时钟,RC振荡器,频率为8MHz。

②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

③、LSI是低速内部时钟,RC振荡器,频率为40kHz。

④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。

倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

其中40kHz的LSI(低速内部时钟)供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。

另外,实时时钟RTC的时钟源还可以选择LSE(低速外部时钟),或者是HSE(高速外部时钟)的128分频。

RTC的时钟源通过RTCSEL[1:0]来选择。

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。

该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz 或72MHz。

()另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。

系统时钟SYSCLK最大频率为72MHz,它是供STM32中绝大部分部件工作的时钟源。

系统时钟可由PLL、HSI或者HSE提供输出,并且它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、4、8、16、64、128、256、512分频。

其中AHB分频器输出的时钟送给5大模块使用:①、送给AHB总线、内核、内存和DMA 使用的HCLK时钟。

②、分频后送给STM32芯片的系统定时器时钟(Systick=Sysclk/8=9Mhz)③、直接送给Cortex的自由运行时钟(free running clock)FCLK。

定时器计算方法

定时器计算方法

STM32定时器时间的计算方法STM32中的定时器有很多用法:(一)系统时钟(SysTick)设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数:void RCC_Configuration(void){RCC_ClocksTypeDef RCC_ClockFreq;SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(&RCC_ClockFreq);//SYSTICK分频--1ms的系统时钟中断if (SysTick_Config(SystemFrequency / 1000)){while (1); // Capture error}}void SysTick_Handler(void)//在中断处理函数中的程序{while(tim){tim--;}}//调用程序:Delay_Ms(10);当然,前提是要设置好,变量tim要设置成volatile类型的。

(二)第二种涉及到定时器计数时间(TIMx)/*TIM3时钟配置*/TIM_TimeBaseStructure.TIM_Prescaler = 2; //预分频(时钟分频)72M/(2+1)=24M TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseStructure.TIM_Period = 65535; //装载值18k/144=125hzTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);定时时间计算:TIM_TimeBaseStructure.TIM_Prescaler = 2;//分频2 72M/(2+1)/2=24MHzTIM_TimeBaseStructure.TIM_Period = 65535; //计数值65535((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+2)/72M)*(1+65535)=0.00273秒=366.2Hz */注意两点(来自大虾网,未经检验)(1)TIMx(1-8),在库设置默认的情况下,都是72M的时钟;(2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0;是重复计数,就是重复溢出多少次才给你来一个溢出中断,它对应的寄存器叫TIM1 RCR.如果这个值不配置,上电的时候寄存器值可是随机的,本来1秒中断一次,可能变成N秒中断一次,让你超级头大!假设系统时钟是72Mhz,TIM1是由PCLK2(72MHz)得到,TIM2-7是由PCLK1得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。

STM32学习笔记(3):系统时钟和SysTick定时器

STM32学习笔记(3):系统时钟和SysTick定时器

STM32学习笔记(3):系统时钟和SysTick定时器2011年3月21日系统时钟和SysTick定时器1. STM32的时钟系统在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL(1)HSI是高速内部时钟,RC振荡器,频率为8MHz;(2)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz;(3)LSI是低速内部时钟,RC振荡器,频率为40KHz;(4)LSE是低速外部时钟,接频率为32.768KHz的石英晶体;(5)PLL为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL的输入可以接HSI/2、HSE或者HSE/2。

倍频可选择为2 – 16倍,但是其输出频率最大不得超过72MHz。

其中,40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。

另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。

该时钟源只能从PLL端获取,可以选择为1.5分频或者1分频,也就是,当需使用到USB模块时,PLL必须使能,并且时钟配置为48MHz或72MHz。

另外STM32还可以选择一个时钟信号输出到MCO脚(PA.8)上,可以选择为PLL输出的2分频、HSI、HSE或者系统时钟。

系统时钟SYSCLK,它是提供STM32中绝大部分部件工作的时钟源。

系统时钟可以选择为PLL 输出、HSI、HSE。

系系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各个模块使用,AHB分频器可以选择1、2、4、8、16、64、128、256、512分频,其分频器输出的时钟送给5大模块使用:(1)送给AHB总线、内核、内存和DMA使用的HCLK时钟;(2)通过8分频后送给Cortex的系统定时器时钟;(3)直接送给Cortex的空闲运行时钟FCLK;(4)送给APB1分频器。

stm32几种时钟控制介绍,含原理图

stm32几种时钟控制介绍,含原理图

stm32几种时钟控制介绍,含原理图本文提到的有以下内容:• 时钟系统与总线矩阵• SysTick系统定时器• RTC实时时钟• 看门狗定时器• 通用定时器一、时钟系统与总线矩阵stm32F4的时钟树如下图所示:在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。

HSI是高速内部时钟,RC振荡器,频率为8MHz。

HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。

LSI是低速内部时钟,RC振荡器,频率为40kHz。

LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。

倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

我们在学习51单片机的时候,其内部是没有晶振的,而stm32是有的。

stm32可以通过RCC(时钟控制寄存器)对时钟进行参数配置以及使能。

我们还可以通过修改system_stm32f4xx.c文件,来配置上述时钟树上的一些分频、倍频参数,得到理想的频率。

在单片机系统中,CPU和总线以及外设的时钟设置是非常重要的,因为没有时钟就没有时序,组合电路需要好好理解清楚。

我们先来看一下总线矩阵。

片上总线标准种类繁多,而由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。

AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。

二者分别适用于高速与相对低速设备的连接。

一般性的时钟设置需要先考虑系统时钟的来源,是内部RC还是外部晶振还是外部的振荡器,是否需要PLL。

然后考虑内部总线和外部总线,最后考虑外设的时钟信号。

遵从先倍频作为CPU时钟,然后在由内向外分频,下级迁就上级的原则。

STM32 SysTick 系统时钟 超简易定时器SysTick

STM32 SysTick 系统时钟 超简易定时器SysTick

STM32 SysTick 系统时钟超简易定时器SysTick/*** @brief Configures the SysTick. 系统时钟配置函数main.c* @param None* @retval None*/void SysTick_Configuration(void){/* Setup SysTick Timer for 100 msec interrupts */if (SysTick_Config((SystemCoreClock) / 10))// 1/10s=100ms{ /* Capture error */ while (1);}NVIC_SetPriority(SysTick_IRQn, 0x0);}/*** @brief This function handles SysTick Handler. 系统时钟中断函数stm32f10x_it.c* @param None* @retval None*/void SysTick_Handler(void){/* Generate TIM1 COM event by software */TIM_GenerateEvent(TIM1, TIM_EventSource_COM);}SysTick_Config(SystemFrequency / 10) 函数的形参就是systick 重装定时器的值。

systck 计数频率为每秒72000000 次,所以72000 次就是1/10 秒,也就是100ms。

SysTick 是1 个24bit 递减计数器,通过对SysTick 控制与状态寄存器的设置,可选择HCLK 时钟(72M)或HCLK 的8 分频(9M,缺省是这个)作为SysTick 的时钟源。

SysTick 的重装寄存器决定了定时器频率。

若SysTick 的时钟源是72M, SystemFrequency = 72000000Hz 所以SysTick_Config(SystemFrequency / 1000);就是1ms 时基。

STM32 基本定时器 学习笔记

STM32 基本定时器  学习笔记

1. STM32的Timer简介STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。

其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。

今天主要是研究剩下的8个定时器。

其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生。

TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。

由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。

因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。

2基本定时器TIM6-TIM72.1 时钟基本特征基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。

它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC) 提供时钟。

实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。

这2个定时器是互相独立的,不共享任何资源。

2.2 TIM6-7主要特征TIM6和TIM7定时器的主要功能包括:● 16位自动重装载累加计数器● 16位可编程( 可实时修改)预分频器,用于对输入的时钟按系数为1~65536 之间的任意数值分频● 触发DAC的同步电路● 在更新事件(计数器溢出)时产生中断/DMA 请求图144 基本定时器框图2.3 计数器模式TIM6-TIM7可以由向上计数。

向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。

2.4 编程步骤1. 配置优先级;2. 使能时钟3. 配置GPIO;4. 配置TIME;5.使能计数器;6.开中断;7.清除标志位;具体配置如下:(1) NVIC_Configuration(void);配置优先级(2) void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)使能时钟(3) void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef*GPIO_InitStruct);配置GPIO(4) TIM_Configuration (void);配置TIM6/TIM7(5) TIM_Cmd(TIM7, ENABLE);使能定时器(6) TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);使能中断(7) TIM_ClearFlag(TIM7, TIM_FLAG_Update);清除标志位步骤(4)中的预分频系数用来确定TIMx所使用的时钟频率,具体计算方法为:CK_INT/(TIM_Perscaler+1)。

STM32的系统滴答定时器(Systick)

STM32的系统滴答定时器(Systick)

NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 设置优先级 for
Cortex-M0 系统中断 */
SysTick->VAL = 0;
/* 装载计数器值(当前计数值清 0) */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

*/
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* 重装值超过了 24 位,是不可
能的。返回失败值 0 */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* 设置重装载寄存器 */
*/
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource) {
/* 参数检查 */ assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource)); if (SysTick_CLKSource == SysTick_CLKSource_HCLK) {
在 misc.C 文件最后有下面一个函数
/** * @功能: 配置 SysTick 时钟源 * @输入参数: SysTick_CLKSource: 指定 SysTick 时钟源. * 该参数可以是以下其中一个值: * @ SysTick_CLKSource_HCLK_Div8: AHB 时钟 8 分频作为 SysTick 时钟源 * @ SysTick_CLKSource_HCLK: AHB 时钟作为 SysTick 时钟源.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32学习笔记(3):系统时钟和SysTick定时器1.STM32的时钟系统在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL(1)HSI是高速内部时钟,RC振荡器,频率为8MHz;(2)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz;(3)LSI是低速内部时钟,RC振荡器,频率为40KHz;(4)LSE是低速外部时钟,接频率为32.768KHz的石英晶体;(5)PLL为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL 的输入可以接HSI/2、HSE或者HSE/2。

倍频可选择为2 – 16倍,但是其输出频率最大不得超过72MHz。

其中,40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。

另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。

STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。

该时钟源只能从PLL端获取,可以选择为1.5分频或者1分频,也就是,当需使用到USB模块时,PLL必须使能,并且时钟配置为48MHz 或72MHz。

另外STM32还可以选择一个时钟信号输出到MCO脚(PA.8)上,可以选择为PLL输出的2分频、HSI、HSE或者系统时钟。

系统时钟SYSCLK,它是提供STM32中绝大部分部件工作的时钟源。

系统时钟可以选择为PLL输出、HSI、HSE。

系系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各个模块使用,AHB分频器可以选择1、2、4、8、16、64、128、256、512分频,其分频器输出的时钟送给5大模块使用:(1)送给AHB总线、内核、内存和DMA使用的HCLK时钟;(2)通过8分频后送给Cortex的系统定时器时钟;(3)直接送给Cortex的空闲运行时钟FCLK;(4)送给APB1分频器。

APB1分频器可以选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。

该倍频器可以选择1或者2倍频,时钟输出供定时器2、3、4使用。

(5)送给APB2分频器。

APB2分频器可以选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另外一路送给定时器(Timer)1倍频使用。

该倍频器可以选择1或2倍频,时钟输出供定时器1使用。

另外APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。

ADC分频器可选择为2、4、6、8分频。

需要注意的是定时器的倍频器,当APB的分频为1时,它的倍频值为1,否则它的倍频值就为2。

连接在APB1(低速外设)上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。

注意USB模块虽然需要一个单独的48MHz的时钟信号,但是它应该不是供USB 模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。

USB模块的工作时钟应该是由APB1提供的。

连接在APB2(高速外设)上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、GPIOx(PA~PE)、第二功能IO口。

2.STM32时钟的初始化由于我现在所用的开发板已经外接了一个8MHz的晶振,因此将采用HSE 时钟,在MDK编译平台中,程序的时钟设置参数流程如下:(1)将RCC寄存器重新设置为默认值:RCC_DeInit;(2)打开外部高速时钟晶振HSE:RCC_HSEConfig(RCC_HSE_ON);(3)等待外部高速时钟晶振工作:HSEStartUpStatus =RCC_WaitForHSEStartUp();(4)设置AHB时钟(HCLK):RCC_HCLKConfig;(5)设置高速AHB时钟(APB2):RCC_PCLK2Config;(6)设置低速AHB时钟(APB1):RCC_PCLK1Config;(7)设置PLL:RCC_PLLConfig;(8)打开PLL:RCC_PLLCmd(ENABLE);(9)等待PLL工作:while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET);(10)设置系统时钟:RCC_SYSCLKConfig;(11)判断PLL是否是系统时钟:while(RCC_GetSYSCLKSource() != 0x08);(12)打开要使用的外设时钟:RCC_APB2PerphClockCmd()….某些函数的详细的使用方法,可以参考ST公司出版的《STM32F10xxx_Library_Manual》3.SysTick定时器NVIC中,捆绑着一个SysTick定时器,它是一个24位的倒数计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断(如果中断使能情况下)。

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

Cortex-M3允许为SysTick提供2个时钟源以供选择,第一个是内核的“自由运行时钟”FCLK,“自由”表现在它不是来自系统时钟HCLK,因此在系统时钟停止时,FCLK也能继续运行。

第2个是一个外部的参考时钟,但是使用外部时钟时,因为它在内部是通过FCLK来采样的,因此其周期必须至少是FCLK的两倍(采样定理)。

下面介绍一下STM32中的SysTick,它属于NVIC控制部分,一共有4个寄存器:STK_CSR,0xE000E010:控制寄存器STK_LOAD,0xE000E014:重载寄存器STK_VAL,0xE000E018:当前值寄存器STK_CALRB,0xE000E01C:校准值寄存器首先看STK_CSR控制寄存器,有4个bit具有意义:第0位:ENABLE,SysTick使能位(0:关闭SysTick功能,1:开启SysTick 功能);第1位:TICKINT,SysTick中断使能位(0:关闭SysTick中断,1:开启SysTick中断);第2位:CLKSOURCE,SysTick时钟选择(0:使用HCLK/8作为时钟源,1:使用HCLK);第3为:COUNTFLAG,SysTick计数比较标志,如果在上次读取本寄存器后,SysTick已经数到0了,则该位为1,如果读取该位,该位自动清零。

STK_LOAD重载寄存器:Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。

STK_LOAD 重载寄存器是个24位的寄存器最大计数0xFFFFFF。

STK_VAL当前值寄存器:也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志。

STK_CALRB校准值寄存器:其中包含着一个TENMS位段,具体信息不详。

暂时用不到。

在MDK开发环境中,我们不必要非得去操作每一个寄存器,可以通过调用ST函数库中的函数来进行相关的操作,其步骤如下:(1)调用SysTick_CounterCmd() 失能SysTick计数器(2)调用SysTick_ITConfig() 失能SysTick中断(3)调用SysTick_CLKSourceConfig() 设置SysTick时钟源(4)调用SysTick_SetReload() 设置SysTick重装载值(5)调用NVIC_SystemHandlerPriorityConfig() 设置SysTick定时器中断优先级(6)调用SysTick_ITConfig() 使能SysTick中断(7)在stm32f10x_it.c中SysTickHandler()下写中断服务函数。

(8)在需要的时候调用SysTick_CounterCmd() 开启SysTick计数器4.工程实现根据以上描述,准备利用开发板上的LED灯做一个小实验,将第一个跑马灯的实验稍微改进一下,以1s精确延时的状态来顺序点亮LED灯,采用的定时器就是SysTick。

设计思路是先配置好系统的各个参数,然后设置SysTick定时器每1ms就进入一次中断,再定义一个全局变量作为定时长短的参数,然后将从延时函数中得到的参数赋值给这个全局变量,每进入一次中断,这个全局变量就减一次,直到减为0,才跳出延时函数。

1.配置系统时钟void RCC_cfg(){//定义错误状态变量ErrorStatus HSEStartUpStatus;//将RCC寄存器重新设置为默认值RCC_DeInit();//打开外部高速时钟晶振RCC_HSEConfig(RCC_HSE_ON);//等待外部高速时钟晶振工作HSEStartUpStatus = RCC_WaitForHSEStartUp();if(HSEStartUpStatus == SUCCESS){//设置AHB时钟(HCLK)为系统时钟RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置高速AHB时钟(APB2)为HCLK时钟RCC_PCLK2Config(RCC_HCLK_Div1);//设置低速AHB时钟(APB1)为HCLK的2分频RCC_PCLK1Config(RCC_HCLK_Div2);//设置FLASH代码延时FLASH_SetLatency(FLASH_Latency_2);//使能预取指缓存FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//设置PLL时钟,为HSE的9倍频8MHz * 9 = 72MHzRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//使能PLLRCC_PLLCmd(ENABLE);//等待PLL准备就绪while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//设置PLL为系统时钟源RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//判断PLL是否是系统时钟while(RCC_GetSYSCLKSource() != 0x08);}//打开PB和PD用于点亮LED灯RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOD, ENABLE);}其中使用到了NVIC的函数,需要将stm32f10xR.lib加入到工程中。

相关文档
最新文档