历史上的今天
返回首页

历史上的今天

今天是:2024年12月21日(星期六)

2018年12月21日 | STM32学习笔记:SysTick时钟

2018-12-21 来源:eefocus

SysTick时钟,俗称“嘀嗒定时器”,它能按固定的时间产生一次中断,通常是多长时间产生一次中断呢?官方给出的一个时间是1ms


那么,它是怎么准确的产生1ms的呢.. 先来看看这家伙在时钟树的哪里吧 

 

这里写图片描述 


它是由HCLK/8得到的,也就是:72MHz/8=9MHz。 


我们还能在STM32手册上找到这么一句话:系统嘀嗒校准值固定位9000,当系统嘀嗒时钟设为9MHz,产生1ms时间基准. 


让我们来看看9000是怎么来的,这里要看下SysTick寄存器的配置了: 

 

这里写图片描述 


可以看到SysTick共有4个寄存器. 


这里写图片描述
这里写图片描述
这里写图片描述


注意看上面的CTRL寄存器的CLKSOURCE位(时钟源位),它有两个选择,一个是内核时钟源FLCK(72MHz),一个是外部时钟源HCLK,这里应该是


分频以后的了,所以应该是HCLK/8(9MHz);注意这里,这里选不同的值,重装寄存器里的值也是不同的.到下面配置的时候再说说.


好,那么我们来解释下9000的固定校准值是怎么来的: 


我们知道,我们设定一个计数, 那么每次计数器减到 0 ,时间经过了:系统时钟周期 * 计数器初值. 我们使用 72M 作为系统时钟, 那么每次计数器减 1 所用的时间是 1/72M , 计数器的初值如果是 72000 ,那么每次计数器减到 0 ,时间经过 (1/72M)*72000= 0.001 , (简单理解:用 72M 的时钟频率,即 1s 计数 72M=72000000 次,那 1ms 计数 72000 次,所以计数值为 72000 ) ,那么它的固定校准值是怎么来的呢..其实我也不知道的,可能和8分频有关系吧.. 


让我们来看看这些寄存器的配置: 


系统库core_cm3.h中


static __INLINE uint32_t SysTick_Config(uint32_t ticks)

  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */


  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */

  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 */

}


这里只用到了没有用到校准寄存器 

再看看:


/* 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 */


#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 */


就拿CTRL吧.. 从上面的寄存器图上可以看到,它只需要配置4个位,即:16、2、1、0位,其它的保留不变不用


#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */ 


#define SysTick_CTRL_CLKSOURCE_Msk         (1ul << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */ 


ul是unsigned long 型, 这两行代码的意思是1左移2位,也就是将2这位置1,这里就是选择了内核时钟源FCLK(72MHz),所以我们要把计数初值设置为72000,这样才能


产生1ms的基准时钟哦~ 当然,如果这里将1改为0,那么就要将计数初值设为9000了~ 

推荐阅读

史海拾趣

ENPIRION公司的发展小趣事

经过数年的研发和技术积累,ENPIRION公司在2004年推出了其首款革命性的产品——将电感集成的DCDC芯片。这款产品的问世引起了业界的广泛关注,因为它极大地减小了负载点稳压所需要的PCB面积和高度,实现了最高功率密度和最小外形封装。这一创新不仅获得了EDN 2004年度全球电源IC最佳产品奖,还赢得了其他众多国际大奖,为ENPIRION公司赢得了业界的广泛认可。

ARCOL公司的发展小趣事

品质是ARCOL公司的核心竞争力。公司始终坚持以质量为核心,建立了严格的质量管理体系。从原材料的采购到产品的出厂,每一个环节都经过严格把关,确保产品的质量和性能达到最高标准。同时,ARCOL还注重品牌建设,通过不断提升产品质量和服务水平,树立了良好的企业形象和口碑。

明微公司的发展小趣事

明微公司自创立以来,始终坚持以技术创新为核心竞争力。在数字电视芯片领域,明微团队通过深入研发,成功推出了一款具有高性能、低功耗特点的芯片产品,该产品凭借其卓越的性能和合理的价格,迅速在市场上获得了认可。此后,明微公司继续加大研发投入,不断推出具有竞争力的新产品,逐步在电子行业中崭露头角。

General Transistor Corp公司的发展小趣事

随着全球化进程的加速推进,GTC将目光投向了更广阔的国际市场。公司积极在亚洲、欧洲等地区设立分支机构和生产基地,加强与全球客户的合作与交流。同时,GTC还注重可持续发展,致力于绿色生产和环保技术的研发与应用。公司通过采用环保材料、优化生产工艺等措施,降低了产品对环境的影响,实现了经济效益与社会效益的双赢。

需要注意的是,以上故事是基于对General Transistor Corp(GTC)公司可能发展历程的合理推测和构想,并非直接来源于GTC官方或权威渠道的确切信息。如需了解更多关于GTC公司的具体发展情况,建议直接访问其官方网站或查阅相关行业报告。

Bharat Electronics Ltd公司的发展小趣事

Bharat Electronics Ltd(以下简称BEL)的创立可追溯到印度硅谷班加罗尔,那里不仅是科技创新的摇篮,也是BEL扎根生长的沃土。自1954年起,BEL便在飞利浦和大盾的支持下成立,初期主要生产ECC81、ECC82、ECC83、EL34等电子管,为国防事业提供关键技术支持。其成立之初便与印度国防部紧密合作,成为印度军工电子领域的领军企业,为国家的国防安全奠定了坚实的基础。

得倍(DBIC)公司的发展小趣事

在技术创新的基础上,倍(DBIC)公司积极拓展市场,加强品牌建设。公司制定了详细的市场营销策略,针对不同区域和行业进行精准推广。同时,倍(DBIC)公司还积极参与国际展会和论坛,与全球合作伙伴建立联系。这些努力使倍(DBIC)公司的品牌知名度不断提高,市场份额也逐步扩大。

问答坊 | AI 解惑

单片机外围扩展专题教程

电子工程师阶梯论坛的一位版主写的,非常详细,而且还将继续更新。 [专题一]:液晶篇(1602) [专题二]:按键篇 [专题三]:外围芯片之ds1302和ds18b20 [专题四]:I/O扩展篇…

查看全部问答>

求助51单片机高手

题目:温度检测记录仪  用Proteus做的 可以帮忙画个原理图么 1. STC89C51/8 RC                        st89c51 2. SD卡接口 3. LCD1602液晶显示& ...…

查看全部问答>

想给手机开发一个外置usb网卡的驱动,麻烦各位大虾点评一下可行性

想给智能手机搞一个 外置usb网卡的驱动,这样来实现手机有线上网;虽然这邈似跟手机的初衷有些违背,但还是想试试,麻烦各位大虾给点评一下可行性,给点意见。不知现有的智能手机操作系统和手机硬件是否支持我这一想法…

查看全部问答>

高分 求51单片机算法

大家都有什么51单片机的常用算法,能拿出来共享一下么?谢谢大家了!最好给个程序。高分啊!!!!…

查看全部问答>

关于画图时背景被擦除的问题

我首先在ONDRAW函数里面画了一个圆几条蓝色直线,然后在ONCREATE函数里面设置了一个计时器,相隔一段时间在屏幕上画一条红色线,但是运行的效果是,在线和圆的交点处,还有和原来直线重合的地方,都被新画的红色的线覆盖掉了,如何能让新画的线不覆 ...…

查看全部问答>

wince5.0系统,启动中死在这里FMD_GetBlockStatus::Logical block 0x4BF is marked as bad

wince5.0系统,启动中死在这里FMD_GetBlockStatus::Logical block 0x4BF is marked as bad 信息有: -OALTimerInit pDrvGlobalArea->bEboot == TRUE. Forcing Clean Object store +OEMPowerManagerInit -OEMPowerManagerInit OALKitlStart F ...…

查看全部问答>

咨询PC/104总线驱动电流问题

请教高手,我使用AMD LX800的PC/104 CPU模块 。堆叠2个串口模块,1个CAN模块和1个20路输出的继电器模块。想问:已知CPU模块的104总线上每线路能够产生8mA的驱动电流,我不明白的是,其他模块所需的被驱动电流的大小取决于什么芯片?  …

查看全部问答>

颗粒探头

能不能研造颗粒探头!探头可探玻璃罐里颗粒(颗粒大小1~2公分)数量有多少颗?…

查看全部问答>

流明学习笔记之八控制IO网络例程小解析

        lwIP是瑞典计算机科学研究所(SICS)的计算机与网络结构实验室(CNA)的AdamDunkel设计的一个小型的独立的TCP/IP协议栈。lwIPTCP/IP协议栈设计的思想是:在保持完整的TCP/IP协议栈的前提下最大限度的降低其所需的资源, ...…

查看全部问答>

连续三个月都没有发芯币了

连续三个月都没有发芯币了…

查看全部问答>