历史上的今天
返回首页

历史上的今天

今天是:2025年07月20日(星期日)

2018年07月20日 | 【stm32f407】SysTick实现延时

2018-07-20 来源:eefocus

一.  SysTick介绍:


CM4内核的处理和CM3一样,内部都包含了一个SysTick定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时 ,将 从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。我们就是利用STM32的内部SysTick来实现延时的,这样既不占用中断,也不占用系统定时器


通常SysTick可以通过中断的方式来实现,后续会增加,但是目前只是通过轮询的方式去实现


二.  寄存器介绍


SysTick有4个寄存器


对应的代码在core_cm4.h中


typedefstruct

{

  __IO uint32_t CTRL;                    /*!< Offset: 0x000(R/W)  SysTick Control and StatusRegister */

  __IO uint32_t LOAD;                    /*!< Offset: 0x004(R/W)  SysTick Reload Value Register       */

  __IO uint32_t VAL;                     /*!< Offset: 0x008(R/W)  SysTick Current ValueRegister      */

  __I uint32_t CALIB;                  /*!< Offset: 0x00C (R/ ) SysTick Calibration Register       */

} SysTick_Type; 

1) CTR寄存器如图:

第0位:ENABLE,Systick 使能位  (0:关闭Systick功能;1:开启Systick功能)
第1位:TICKINT,Systick 中断使能位    (0:关闭Systick中断;1:开启Systick中断)

第2位:CLKSOURCE,Systick时钟源选择  (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟)

第16位:COUNTFLAG,Systick计数比较标志,如果在上次读取本寄存器后,SysTick 已经数到了0,则该位为1。如果读取该位,该位将自动清零.

2) LOAD寄存器如图:

Systick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24位的寄存器最大计数0xFFFFFF。

3) VAL寄存器如图:

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

4) CALIB寄存器如图

一般不会用到

三.  源码

delay.h



#ifndef _DELAY_H_H_H

#define _DELAY_H_H_H

#include "stm32f4xx.h"

 

void delay_init(u8 SYSCLK);

void delay_ms(u16 nms);

void delay_us(u32 nus);

#endif


delay.c



#include "delay.h"

 

static u8  fac_us=0;   

static u16 fac_ms=0;

void delay_init(u8 SYSCLK)

{

  SysTick->CTRL&=~(1<<2);

  fac_us=SYSCLK/8;

  fac_ms=((u32)SYSCLK*1000)/8;

}

void delay_xms(u16 nms)

{    

  u32 temp;   

  SysTick->LOAD=(u32)nms*fac_ms;

  SysTick->VAL =0x00;

  SysTick->CTRL=0x01 ;

  do

  {

    temp=SysTick->CTRL;

  }while((temp&0x01)&&!(temp&(1<<16)));

  SysTick->CTRL=0x00;

  SysTick->VAL =0X00;      

 

void delay_ms(u16 nms)

{

  u8 repeat=nms/540;

  u16 remain=nms%540;

  while(repeat)

  {

    delay_xms(540);

    repeat--;

  }

  if(remain)delay_xms(remain);

  

}

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;  

}


推荐阅读

史海拾趣

Forge Europa Ltd公司的发展小趣事

Forge Europa Ltd公司自成立以来,始终将技术创新视为企业发展的核心驱动力。早期,公司便投入大量资源研发高效能LED灯带技术,成功推出了具有行业领先地位的5050型号LED灯带。这款产品在市场上迅速获得认可,不仅因为其出色的光效和节能性能,更在于其独特的散热设计,有效延长了产品的使用寿命。Forge Europa的这一技术创新不仅为公司赢得了市场份额,也奠定了其在LED灯带领域的领先地位。

EVERLIGHT公司的发展小趣事

进入21世纪,随着全球电子产业的快速发展,EVERLIGHT迎来了市场扩张的机遇。公司不仅巩固了在台湾市场的领先地位,还积极开拓国际市场。通过与国际知名品牌的合作,EVERLIGHT的产品逐渐进入全球市场,赢得了广泛认可。同时,公司还加强了对新兴市场的开拓,如中国大陆、东南亚等地区,为公司的持续发展注入了新的动力。

Enova Technology Corp公司的发展小趣事

自2000年4月成立以来,Enova Technology Corporation(伊诺瓦科技)就以其卓越的技术创新能力在电子行业中崭露头角。公司总部位于台湾新竹科学工业园区,这里汇聚了众多高科技企业和研发机构,为伊诺瓦科技提供了丰富的技术资源和人才支持。

伊诺瓦科技专注于硬件加解密解决方案的研发与应用,其产品在军事单位、政府机关、财务金融机构等领域得到了广泛应用。其中,公司的X-WallSE产品凭借其独特的携带式电子钥匙(Security Key)技术,实现了硬盘的一对一加密,为用户提供了前所未有的数据安全保护。这一创新技术的推出,不仅提升了公司的市场竞争力,也为整个电子行业树立了新的技术标杆。

随着技术的不断发展,伊诺瓦科技不断推出更加先进的产品和解决方案。例如,公司的SecureNAS系列产品在网络硬盘服务器加解密应用方面提供了全新的解决方案,为用户提供了更加便捷、高效的数据安全保护。这些产品的推出,不仅进一步巩固了公司在电子行业的领先地位,也为公司的未来发展奠定了坚实的基础。

Fujisoku Corporation公司的发展小趣事

在电子废弃物处理成为全球关注焦点的背景下,“未来电子”积极倡导绿色生产和循环经济理念。公司投入大量资源研发环保型电子产品,并建立了完善的电子废弃物回收处理体系。通过技术创新和科学管理,“未来电子”实现了生产过程中的节能减排和废弃物的有效回收利用,赢得了社会各界的广泛赞誉。这一举措不仅提升了公司的社会形象,还为公司的可持续发展奠定了坚实基础。

德芯半导体(Doeshare)公司的发展小趣事

作为一家有社会责任感的企业,德芯半导体始终关注社会发展和环境保护。公司积极参与社会公益活动,为当地社区提供力所能及的帮助和支持。同时,公司还注重环保和可持续发展,通过采用环保材料和工艺、推广绿色产品等方式,为保护环境贡献自己的力量。这些举措不仅增强了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

请注意,以上故事框架是基于对德芯半导体公司的有限了解而构建的,并非真实事件的具体描述。如需更详细和准确的信息,请参考公司官方发布的相关资料或进行深入研究。

ETL semiconductor公司的发展小趣事

台积电(TSMC)是全球最大的半导体代工企业之一。其发展历程可以追溯到上世纪80年代。当时,台积电看准了半导体代工市场的巨大潜力,决定专注于这一领域。通过不断的技术创新和市场拓展,台积电逐渐在代工领域树立了领先地位。如今,台积电已与全球众多知名芯片设计企业建立了紧密的合作关系,为全球半导体产业的发展做出了重要贡献。

问答坊 | AI 解惑

用AD7874做交流功率测量

我用AD7874做交流功率测量,想让功率稳定到小数后面的第3位,但是AD7874是12位的AD,跳动一个LSB就0.00488V了,所以小数后面第3位不跳动,但不知到怎样解决,请各位高手献策,在下先谢谢了!…

查看全部问答>

两位专家在线:电源领域相关问题,可在此提问

涉及到电源的问题,请在这里提出。 quanzx与rockyltp在这里期待你的讨论。 quanzx:常在坛子里晃荡的网友可能发现,quanzx是像是一位非常热心的大哥,乐于                 帮助大家,特别是 ...…

查看全部问答>

本地生成的hive文件和导进板子的hive文件是一样的吗?

我开始感觉应该是一样的,只是把default.hv的名字改成system.hv。 后来发现大小都不一样。 谁研究过类似的问题啊。。…

查看全部问答>

谁有做好的LQFP-48的封装呢?

谁有做好的LQFP-48的封装呢? 就是vs1103b这个元件的封装。48脚,4面分别有12个脚。 有的话,给我传一份,感谢~…

查看全部问答>

做Wince和Mobile方面的底层和上层的软件开发的QQ 3号群68387065

做Wince和Mobile方面的底层和上层的软件开发的QQ 3号群68387065。提供一个大家交流的平台,现还有部分名额,欢迎相关人员加入…

查看全部问答>

关于挂起唤醒的问题

s3c2440挂起后怎样唤醒,挂起后跟踪有执行到CPUPowerOff(),挂起前也用 s2440IOP->rGPFDAT = 0x1  |(0xfrGPFUP  = 0xf7;    s2440IOP->rEXTINT0 = 0x22222226; 设置了中断0唤醒,可是为什么唤醒没有反应,如果有唤醒 ...…

查看全部问答>

推荐STM32直接驱动TFT的芯片啊

请教啊。 有没有人知道STM32系列芯片里,直接驱动TFT彩屏的芯片,类似于NXP的LPC2478带彩屏驱动,或者类似于ARM9的片子啊。…

查看全部问答>

ST-linkIII容易坏SN74LVC2T45DCUT好像该IC没什么必要?

我又坏了一个STLinkIII,经分析,又坏了SN74LVC2T45DCUT,(主芯片倒是很扎实,STM32好东东)。但经过分析(电路见附图),74lvc2t45  5脚接地的话传输方向是 B To A ,即目标板到STM32 。但这有必要吗?STM32 输入口只要串上限流电 ...…

查看全部问答>

c语言-转移语句(continue/break/goto )

goto: goto 语句的作用是跳转到一条你指定的语句,然后从那条语句开始往下执行。goto 语句的用法很简单,首先在你想要跳往的语句前面加个标签和冒号:         to: printf(\"go to here\\n\"); 注意,标签的命名 ...…

查看全部问答>

MSP430 数字io

1.   数字IO 1.1.    Io分布 Figure 3  io分布图 从图上可以看出,msp430f149具有6组io,每个io均有两种功能。另外P1,P2两组io可以设置为外部中断与其对应了两个中断向量的入口。 1.2.    I ...…

查看全部问答>