历史上的今天
返回首页

历史上的今天

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

2018年07月20日 | Systick 延时函数详解

2018-07-20 来源:eefocus

void delay_init(u8 SYSCLK)

{

SysTick->CTRL&=0xfffffffb;


fac_us=SYSCLK/8;

fac_ms=(u16)fac_us*1000;

}


Systick主要的作用就是拿来计时,其原理和应用简述一下就是这样的:通过配置寄存器SysTick->CTRL来设定Systick的计时频率并Enable使Systick开始计数,这里的SysTick->CTRL&=0xfffffffb应该很好理解,把第2位设定为0,查找应用手册可以知道这是把Systick的计时频率设定为CPU主频(SYSCLK)的1/8。


假定我们板子默认的晶振频率是8Mhz,默认CPU工作频率(SYSCLK)是9倍频,即72M,那Systick的频率就是72/8=9Mhz。


知道了Systick的频率,下一步就是确定倒时计数器的数值,即SysTick->LOAD这个寄存器的配置。上面已经知道了,Systick的工作频率F=9Mhz=SYSCLK/8,即每秒钟计数器自减900万次,也就是说,SYSCLK/8次的自减耗时1秒,那么(8/SYSCLK)/1000,000次自减就耗时1微秒了,这也就是fac_us的值了。那么上面函数中的fac_us为什么是SYSCLK/8呢?这里先搞清楚一点,函数中SYSCLK的单位是Mhz,所以SYSCLK的值是72(这个以Mhz为单位应该是STM32基础库里面做过宏定义的),否则也不可能用一个8位整形去表示一个7200万的数值;而我们这里计算的SYSCLK是以Hz为单位的,即72Mhz/1000,000=72,所以这个SYSCLK/8是对的。


你可能还没搞清楚fac_us到底是干嘛的。很简单,fac_us就是要写入SysTick->LOAD寄存器的值,Systick的工作原理是这个寄存器的值在Systick被Enable之后就开始以设定的工作频率自减,减到0的时候就发出中断,实现定时。所以,写入fac_us到SysTick->LOAD寄存器,就是要Systick在自减了fac_us次以后发出中断,自减fac_us所耗的时间已经说了,1微秒。


下面的fac_ms应该很好理解了,就是1毫秒的计数次数,刚好是1微妙的1000倍,注意9×1000超出了8位整形的表示范围,所以要用(u16)先把fac_us转成16位变量,以保证计算的正确。


具体的应用函数是用来做延时,如下:


void delay_us(u32 nus)

{

u32 temp;

SysTick->LOAD=nus*fac_us; //时间加载

SysTick->VAL=0x00; //清空计数器

SysTick->CTRL=0x01 ; //Enable Systick,开始倒数

do

{

temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达

SysTick->CTRL=0x00; //Disable Systick


SysTick->VAL =0X00; //清空计数器

}


具体的寄存器配置只要看手册就知道了,这里只需要理解一句:


do

{

temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达


核心就是while(temp&0x01&&!(temp&(1<<16)));//等待时间到达


temp已经是Systick控制寄存器的值了,temp&0x01就是把该寄存器的值读出并且把除第一位之外位都清零(当然要通过temp变量来传递值而不是直接修改寄存器),第一位就是Systick的Enable配置信息,写入1就是Enable,写入0就是Disable,读这一位是判断Systick是否仍然处于Enable状态(可能被其他中断禁用掉),temp&(1<<16)就是读取第16位的值,这一位如果为0就表示计数器的值不是0(即还在计数),如果是1就表示计数器已经自减到0了。


那么这段就很好理解了,即判断,如果Systick还在Enable的状态,并且计数器还没数到0,就不停的循环把当前的SysTick->CTRL寄存器值写入变量temp,继续下一次判断。当Systick被Disable或者计数器数到0了,就停止循环。因为只是做延时,也不需要跳到任何中断服务那边去处理什么,只要这个循环的耗时过程完成就可以了。


推荐阅读

史海拾趣

Crosspoint Solutions公司的发展小趣事

随着技术的不断更新换代,人才成为电子企业竞争的核心要素。Crosspoint Solutions公司高度重视人才培养和引进工作,通过校园招聘、社会招聘等多种渠道吸引优秀人才加入。同时,公司还建立了完善的培训体系,不断提升员工的技能水平和创新能力。这些优秀的人才为公司的发展提供了强有力的支撑。

CDI-DIODE公司的发展小趣事

随着环保意识的日益增强,电子行业也开始向绿色生产转型。CDI-DIODE公司积极响应这一趋势,投入大量资源研发环保型二极管产品,并采用环保材料和生产工艺。这种绿色生产方式不仅降低了公司的生产成本,也符合了社会的可持续发展需求,为公司的未来发展奠定了坚实的基础。

这五个故事虽然是虚构的,但它们反映了电子行业中企业可能面临的一些共同挑战和机遇。无论对于CDI-DIODE公司还是其他企业,这些故事都具有一定的借鉴意义。

FTDI公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。CDI-DIODE公司始终坚持品质至上的原则,从原材料采购到生产流程控制,再到产品检测,都严格把关。这种对品质的执着追求赢得了客户的信任和口碑,使公司在激烈的市场竞争中脱颖而出。

Advanced Electronic Packaging公司的发展小趣事

随着公司技术的不断进步,Advanced Electronic Packaging公司开始寻求与行业内知名厂商的合作机会。通过与一家全球领先的电子产品制造商达成战略合作,公司成功将其先进的封装技术应用于对方的高端产品线中。这一合作不仅提升了合作双方的产品竞争力,还为Advanced Electronic Packaging公司带来了可观的利润回报。此后,公司陆续与多家知名企业建立了合作关系,进一步巩固了其在电子封装领域的市场地位。

Genesys Logic公司的发展小趣事

进入80年代,随着半导体市场的竞争加剧,“General Microcircuits”意识到仅凭自身力量难以迅速扩大市场份额。于是,公司采取了一系列并购策略,先后收购了多家在模拟电路、数字信号处理等领域具有技术优势的小型公司。这些并购不仅为“General Microcircuits”带来了丰富的产品线和技术积累,还显著增强了其研发能力和生产能力,使其在全球半导体市场的地位稳步提升。

GAPTEC Electronic GmbH & Co. KG公司的发展小趣事

背景:随着市场需求的不断增长,Galaxy Microelectronics意识到需要不断迭代技术和扩大产能。

发展:2010年,公司成功研发出3D V-NAND技术,这一技术革命性地提高了存储密度和性能,降低了功耗。同时,公司开始在全球范围内建设新的生产基地,以满足日益增长的市场需求。通过技术迭代和产能扩张,Galaxy Microelectronics逐渐成为了全球闪存市场的领军企业之一。

问答坊 | AI 解惑

哈工大暑期竞赛培养计划

本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 提供学校的培养计划给大家作参考,希望大家可以有计划的进行训练。祝大家好运!  …

查看全部问答>

大家现在都用到触摸屏了么?

把一杯咖啡放到“桌上”,屏幕上能马上显示一杯咖啡,还能显示出咖啡的温度等相关信息。也许在几年前这样的应用还是天方夜谭,但是现在已然是实实在在的存在。 一夜之间,iPhone引爆了触摸屏的技术革命,上网本、PC和其它产品也纷纷走向触摸屏技术 ...…

查看全部问答>

CE5 系统启动问题求助

ce5 系统镜像NK.nb0 是否一定要先加载到内存中才能运行?能否不加载到内存中,直接从flash中启动?…

查看全部问答>

Wince文件系统一个奇怪的现象

最近在做Wince5.0 SD卡的驱动,捣鼓了半个月,驱动做好了,文件的写入和读出都没问题,本来打算压力测试完毕后就结束这个工程,不料在进行压力测试的时候出现了错误,我的测试分为两种,分别为进行大文件写入读取和批量文件写入和读取,在做批量文件 ...…

查看全部问答>

想在wince的nk。nb0里添加自己做的应用程序,能给点提示吗

想在wince的nk。nb0里添加自己做的应用程序,能给点提示吗, 1.是不是添加自己的exe文件就可以了呢,给点提示好吗? 2.比如要查msdn的关键字是什么呢?…

查看全部问答>

wince驱动调试出现cxx0017错误,变量找不到怎么回事?

在进行wince串口驱动跟踪时在watch窗口出现cxx0017错误,有些变量找不到,提示symbol“pSerialHead”not find,还有其他几个变量也找不到,这是怎么回事?我看有些变量是可以找到的。断点设在下面的函数里。望各位高人指教。 HANDLE COM_Init( & ...…

查看全部问答>

如何完成设计文件

我编了个VHDL文件.在Quartus II 6.0里 1,建立新项目. 2,引入VHDL文件 3,编译时提示未定义顶层文件. 这是怎么回事?还需要建立什么样的文件?如何建?…

查看全部问答>

有对到AM/FM收音机芯片感兴趣的来

我公司代理的C8051F单片机,可以通过JTAG实现在线调试、仿真、下载。 调试方面,加密性好! 联系:021-61202632  岳小姐…

查看全部问答>

500元(不够可加)求文件驱动开发高手指点问题

问题很简单,我在irq_mj_read 中自己构造IRP 查询文件全路径,结果出错 0xc00000d 参数错误 请联系我:13791007364  张波, 急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急…

查看全部问答>

加密锁与云授权

加密锁与云授权     在中国,加密锁仍然是占主导地位的软件保护方式。近30年来,计算机硬件不知更新了多少代,软件技术也从上世纪90年代起进入了互联网时代,而加密锁保护方式却一直没有改变,顶多从原先的并口锁进化到US ...…

查看全部问答>