历史上的今天
返回首页

历史上的今天

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

2018年07月20日 | STM32 SysTick定时器做延时函数

2018-07-20 来源:eefocus

在STM32中延时函数用的非常广泛,具体延时函数怎么使用,下面我们来进行想详解,本文主要介绍采用SysTick计时器来实验系统延时:

原理介绍:

SysTick计时器是一个24位的倒计数定时器,主要用来做操作系统的定时器,每来一个时钟周期计数减1,当计数到0时,他就会自动从LOAD寄存器中自动重装设置的初值,操作时只要不把CTRL寄存器中的ENABLE位清0,它就永远不会停止,即使在睡眠状态他也还是在继续奋斗。

配置代码如下:

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/8
fac_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<=1864 
void 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;       //清空计数器 
}


(1)、SysTick->CTRL&=0xfffffffb;选择外部时钟源(PLLCLK)作为系统时钟来源,AHB不分频,之后AHB进行8分频后送到内核,作为STCLK时钟,时钟频率为72/8=9Mhz。

               

                  

                    

(2)、fac_us=SYSCLK/8;  延时一个us秒需要装入定时器的值,SysTick频率为9mhz,1us时间内,定时器会减9,所以定时1us,装入值为9。

(3)、fac_ms=(u16)fac_us*1000;延时ms秒,直接在us秒基础上乘以1000。

(4)、SysTick->LOAD=(u32)nms*fac_ms;设置延时x nms装入得初值。

(5)、SysTick->VAL =0x00;   清零,进行自动重装

(6)、SysTick->VAL =0X00;   开启定时器

(7)、 do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));不断查询,定时到了硬件置位。

(8)、 SysTick->CTRL=0x00; 时间到了关闭定时器

(9)、 SysTick->VAL =0X00;清空计数器

(10)、延时us函数也是一样的。

(10)、注意LOAD寄存器是24bit寄存器,最大填入数值为2^24,超过了会溢出。


推荐阅读

史海拾趣

Global Mixed-Mode Technology Inc公司的发展小趣事
三相缺相报警灯电路在需要稳定三相电源供电的场合下非常重要。例如,在工业生产中,三相电动机、变压器等设备对电源的稳定性要求很高,一旦发生缺相,可能会导致设备损坏或生产事故。因此,在这些场合下需要安装三相缺相报警灯电路来及时监测并报警缺相情况。
艾为(AWINIC)公司的发展小趣事

艾为电子注重与产业链上下游企业的合作,通过协同创新和资源共享,实现共赢发展。例如,艾为与歌尔股份建立了长期合作伙伴关系,双方在声光电射手等领域展开了深度合作,共同推出了多款优秀产品。此外,艾为还与多家ODM厂商和智能硬件企业建立了紧密的合作关系,共同推动产业链的协同发展。

Euvis Inc公司的发展小趣事

随着公司实力的不断增强和市场需求的日益全球化,Euvis Inc公司开始实施国际化战略,积极拓展海外市场。公司在全球范围内设立研发中心和生产基地,与当地企业建立合作关系,共同开发适合当地市场的产品。通过国际化战略的实施,Euvis Inc公司成功实现了全球布局,为全球消费者提供了优质的产品和服务。

请注意,以上故事均为虚构内容,旨在为你提供一个关于电子行业公司发展起来的相关故事框架。如有需要,你可以根据这些框架进行进一步的创作和发挥。

虹冠电子(Champion)公司的发展小趣事

虹冠电子注重全球市场的拓展,通过建立完善的营销网络和合作伙伴关系,将产品销往世界各地。公司在新竹、汐止以及美国硅谷等地设有研发中心和生产基地,能够为客户提供及时、高效的技术支持和服务。同时,虹冠电子还与国内优秀的晶圆封测大厂等合作伙伴建立了紧密的合作关系,共同推动电源管理技术的发展和应用。

AMRI Enterprise Co Ltd公司的发展小趣事

面对国内市场的饱和竞争,AMRI Enterprise Co Ltd积极实施国际化战略,拓展海外市场。公司通过参加国际电子展会、建立海外销售渠道等方式,不断提升品牌知名度和产品影响力。同时,AMRI还针对不同国家和地区的市场需求,调整产品策略,提供定制化的解决方案。这一战略的实施,使得AMRI的产品成功打入多个国际市场,实现了业务的快速增长。

E-Z-HOOK公司的发展小趣事

E-Z-HOOK公司非常重视与客户的关系建立与维护。他们始终坚持以客户为中心的经营理念,努力为客户提供高质量的产品和优质的服务。为了更好地了解客户需求和反馈,公司建立了完善的客户服务体系,包括售前咨询、售后服务和技术支持等。此外,公司还定期组织客户交流会和技术研讨会等活动,加强与客户的沟通与互动。这些努力使得E-Z-HOOK公司赢得了广大客户的信任和支持。

问答坊 | AI 解惑

技术其实是一层纸

       前几天在昆明和朋友一起吃火锅,吃了一阵子,漂亮的服务员过来往火锅锅子边上的曹里加水,本人孤陋寡闻,感觉挺有意思。朋友解释,这是一项火锅界很实用很有创意的技术。啊!?朋友继续说明,吃火锅对于店家来说,存在 ...…

查看全部问答>

【藏书阁】微波晶体管放大器分析与设计

目录: 第1章 二端口网络的表述 1.1 引言 1.2 阻抗矩阵、导纳矩阵、混合矩阵和ABCD矩阵 1.3 传输线的概念 1.4 散射矩阵和链散矩阵 1.5 位移参考平面 1.6 散射参数的特性 1.7 功率波和归一化散射参数 1.8 二端口网络的参数转换 1.9 散射 ...…

查看全部问答>

逻辑与指令(一)

逻辑与指令 ANL A,Rn        ;A与Rn中的值按位\'与\',结果送入A中 ANL A,direct ;A与direct中的值按位\'与\',结果送入A中 ANL A,@Ri ;A与间址寻址单元@Ri中的值按位\'与\',结果送入A中 ANL A,#data ;A与 ...…

查看全部问答>

单片机设计数字温度表

单片机设计数字温度表…

查看全部问答>

请推荐带usb host的MCU

请问是否有带usb host的32bit MCU. 价格能做到$3-4.…

查看全部问答>

什么是电容耦合?时钟馈通又是什么?向高手请教

什么是电容耦合?时钟馈通又是什么?向高手请教…

查看全部问答>

LED优点及LED产业短板

replyreload += \',\' + 770960;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

香版主,stm32能否用于PLC的设计中

                                 香版主,我看了数据是手册,有一个问题:stm32的温度是-40~85,我们一个项目准备设计一个类似PLC的工控机,感觉好 ...…

查看全部问答>

出dx32stm32开发板二手320rmb

资料请看这里,不过我的是二手的。http://item.taobao.com/item.htm?id=8047199677 联系q 9477 2409…

查看全部问答>

avr PIN

我用avr studio4 仿真时  当把设置为DDRA=0x00 ,然后PORTA=0XFF时 发现PINA始终是零呢,不是PIN的数据不回受DDR和PORT的影响吗…

查看全部问答>