历史上的今天
返回首页

历史上的今天

今天是:2024年12月06日(星期五)

正在发生

2021年12月06日 | STM32系统定时器(SysTick)笔记

2021-12-06 来源:eefocus

一、简介

       SysTick:系统定时器,由四个寄存器控制,存在于内核,嵌套在NVIC中,所有的Cortex-M3内核的单片机都具有这个定时器。


二、相应寄存器(这里介绍常用的几个寄存器)

       ①SysTick控制及状态寄存器(地址:0xE000_E010)

在这里插入图片描述

       只有上面红色线框柱的位有效,其他位都是保留。

image.png?imageView2/2/w/550


       ②SysTick重装载数值寄存器(地址:0xE000_E014)

在这里插入图片描述

image.png?imageView2/2/w/550

       ③SysTick当前数值寄存器(地址:0xE000_E018)

在这里插入图片描述

image.png?imageView2/2/w/550

三、结合框图

在这里插入图片描述

       图中STK_CLK对应的上面的CLKSOURCE,结合RCC时钟树:

在这里插入图片描述

       当CLKSOURCE位为0时,时钟是AHB/8=(72/8)M=9M,当CLKSOURCE位为1时,时钟是AHB=72M。


       图中STK_LOAD对应上面的RELOAD,STK_VAL对应上面的CURRENT。


       递减计数器(值为STK_VAL)在时钟的驱动下,从RELOAD初值开始往下递减计数到0,产生中断和置位COUNTFLAG标志。然后又从RELOAD值开始重新递减计数,如此循环。


四、SysTick定时时间计算

       ①t:一个计数循环的时间,跟RELOAD和CLK有关。

       ②CLK:72M或者9M,由CTRL寄存器配置。

       ③RELOAD:24位,用户自己配置。


       t=RELOAD*(1/CLK)。

       例:更改RELOAD的值。

       当CLK=72M时,t=(72) * (1/72M)=1us。

       当CLK=72M时,t=(72000) * (1/72M)=1ms。


       1s = 1000 ms = 1000 000 us = 1000 000 000 ns。


       如果要实现一个1ms的延时,那么将始终配置成72M,然后计数72000次。这就实现了一个1ms的延时。一般我们的程序都是毫秒级别的。


五、库函数中相关寄存器描述

       1.SysTick结构体


//在core_cm3.h中

    __IO uint32_t CTRL;     //控制及状态寄存器

    __IO uint32_t LOAD;     //重装载数值寄存器

    __IO uint32_t VAL;      //当前数值寄存器

    __IO uint32_t CALIB;    //校准寄存器


       2.SysTick配置库函数


//在core_cm3.h中定义

static __INLINE uint32_t SysTick_Config(uint32_t ticks)

  //RELOAD寄存器为24bit,最大值为2^24

  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);    

          

  //配置RELOAD寄存器的初始值                                                             

  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; 

  

  //配置中断优先级为1<<4-1 = 15,优先级为最低     

  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  

  

  //配置递减计数器的值

  SysTick->VAL   = 0;    


  //配置systick的时钟为72M

  //使能中断

  //使能systick                                      

  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 

                   SysTick_CTRL_TICKINT_Msk   | 

                   SysTick_CTRL_ENABLE_Msk;                    

  return (0);                                                  

}


       其中SysTick_LOAD_RELOAD_Msk的定义如下,也就是2^24。


#define SysTick_LOAD_RELOAD_Pos             0                                             

#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos)


__NVIC_PRIO_BITS的定义如下。


#define __NVIC_PRIO_BITS          4


       __NVIC_PRIO_BITS通过改变这个宏定义和1<<__NVIC_PRIO_BITS中"<<"左边的数(0或1),可以实现对systick中断(内核中断)的分组。


       NVIC_SetPriority固件库函数如下。


static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)

{

  //设置优先级for Cortex-M3 系统中断

  if(IRQn < 0) {

    SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } 


  //设置优先级for外设中断

  else {

    NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);    }   

}


       在STM32的中断中,有内核中断和外设中断,内核中断并不一定比外设中断的优先级高,这得看具体的设计。


       STM32里无论是内核还是外设都是使用4个二进制位来表示中断优先级。内核中断设置的是System handler priority registers (SHPRx)寄存器:

在这里插入图片描述

       SysTick中断是设置System handler priority register 3 ( SCB_ SHPR3)寄存器:

在这里插入图片描述

       SysTick用的是上面红色线框住的的四个位(给SysTick中断分了8位,但是STM32只用高四位)。


       中断优先级的分组对内核和外设同样适用,当比较的时候,只需把内核外设的中断优先级的四个位按照外设的中断优先级来解析即可,即认为的分出抢占优先级和子优先级。

推荐阅读

史海拾趣

Aptos Technology公司的发展小趣事

随着全球电子科技行业的快速发展,Aptos也开始积极布局全球市场。公司在多个国家和地区设立了分支机构或研发中心,以更好地服务全球客户。同时,Aptos还加大了对新兴技术的研发投入,积极探索未来可能的发展机遇。展望未来,Aptos将继续致力于技术创新和市场拓展,努力成为全球电子科技行业的领军企业。

请注意,这些故事是基于一般性的行业趋势和公司可能的发展路径构建的,并非Aptos Technology公司的实际发展历程。如需了解该公司更具体的发展故事,建议查阅相关新闻报道或公司官方资料。

Arduino公司的发展小趣事

随着Arduino平台的不断发展,为了满足不同项目和应用的需求,Arduino推出了多种不同规格和功能的主板。例如,Arduino Diecimila和Arduino Uno等主板的推出,进一步丰富了Arduino的产品线。这些主板各具特色,适用于各种场景,使得Arduino平台在物联网和嵌入式系统的开发中发挥了越来越重要的作用。

爱浦电子(AIPULNION)公司的发展小趣事

在产品质量得到保障的同时,爱浦电子也积极开展市场拓展和品牌建设工作。公司积极参加国内外电子展会和技术交流活动,与众多行业伙伴建立了紧密的合作关系。此外,爱浦电子还注重品牌形象的塑造,通过统一的对外标识和全新的VI企业形象,提升了公司整体形象。这些努力使得爱浦电子在市场上逐渐树立起了良好的口碑和品牌形象。

Cretex Companies Inc公司的发展小趣事

为了降低成本、提高生产效率,Cretex开始对产业链进行整合与优化。他们与上游供应商建立长期稳定的合作关系,确保原材料的稳定供应和质量可靠。同时,公司还加强了对下游客户的服务与支持,通过提供个性化的解决方案和优质的售后服务,增强了客户黏性。这些举措使得Cretex在激烈的市场竞争中保持了领先地位。

General Instrument Optoelectronics公司的发展小趣事
用于焊接和更换电路中的元件。
Honeywell公司的发展小趣事

背景:进入21世纪后,霍尼韦尔继续秉承多元化发展战略,不断拓展新的业务领域。

发展:公司通过一系列并购和投资活动,进入了石油化工、高性能材料、医疗、安防等多个领域。其中,2005年收购环球油品公司(UOP)和2007年收购码捷科技(Metrologic Instruments)是公司多元化战略的重要里程碑。

关键事件:这些并购不仅增强了霍尼韦尔的技术实力和市场竞争力,还为公司带来了新的增长点和发展机遇。

问答坊 | AI 解惑

MIPS和ARM的比较(转)

流水线结构 pipeline     MIPS 是最简单的体系结构之一,所以使大学喜欢选择 MIPS 体系结构来介绍计算体系结构课程。      ARM has barrel shifter         shifter是两面性的,一 ...…

查看全部问答>

二层交换机最小系统开发板v1.0

本开发板命名为Landbcm 2008 下面开始介绍介绍Landbcm 2008 1.Landbcm 2008系统框图 1.Landbcm 2008学习板提供了 硬件: 1个WAN口, 1个100M以太网口, 4M Flash,16M SDRAM , 主控芯片为BCM47XX , 交换芯片为BCM5XXX 软件: 全套开发 ...…

查看全部问答>

请教在vs2005中编译Iperf?

小弟准备测试下网络,下了Iperf源代码。用在ARMV4I  wince 6.0上。 但是不知道怎么在VS2005下面编译 目前SDK已经导出 哪位老大有成功的经验,分享下,多谢了!…

查看全部问答>

WINCE6系统 烧入扳子启动后是不是根据组件的多少启动的服务多少来占有内存呢?

我现在用的板子的总的内存是128M,但是我进去后看系统属性->内存  看到能使用的存储内存和程序内存总的是40M左右, 而其中存储内存和程序内存正在使用总的是17M左右 那我的还有88M左右的内存到哪里去了啊?…

查看全部问答>

黑夜自动点亮的过道灯电路

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 时间:2009-09-18 13:19:01 …

查看全部问答>

ucosII我要弄到中断中断程序放在什么地方呢

                                  …

查看全部问答>

封装CM3内核的systick中断和调用

[ 本帖最后由 sharp4016 于 2012-1-10 19:49 编辑 ]…

查看全部问答>

发FPGA+SDRAM的高深度逻辑分析仪设计思路,原创的

供参考。 [ 本帖最后由 mr.king 于 2012-3-25 22:31 编辑 ]…

查看全部问答>

力科 DDR测试解决方案

力科  DDR测试解决方案 值得学习学习!! …

查看全部问答>

整流杂谈(一)

模拟电路教材中一般都会讲到整流电路,但通常很简略,只有一页两页篇幅,往往是只讲小功率电子设备中最常见的整流电路。某些教材甚至只讲桥式整流,不讲全波整流电路。实际上,整流电路看上去简单,里面的变化和计算却相当复杂。@littleshrimp发了 ...…

查看全部问答>