历史上的今天
返回首页

历史上的今天

今天是:2024年10月19日(星期六)

正在发生

2020年10月19日 | 浅谈STM32F10X芯片SysTick系统时钟定时器

2020-10-19 来源:eefocus

1、介绍

实现Cortex-M3系统定时器SysTick的配置,需要具备以下知识:Cortex-M3系统定时器默认频率是HCLK的8分频(如下图所示),因此需要会RCC时钟的配置;然后配置SysTick系统定时器;编写SysTick中断处理函数。



系统时钟及系统定时器时钟(详见手册)


2、寄存器描述

SysTick控制及状态寄存器STK_CTRL


SysTick重装载数值寄存器STK_LOAD


SysTick当前数值寄存器STK_VAL


SysTick校准数值寄存器STK_CALIB


 

与SysTick相关的固件库函数有以下几个:


配置SysTick系统时钟:SysTick_CLKSourceConfig();


设置SysTick重装值:SysTick_SetReload();


使能或除能SysTick定时器:SysTick_CounterCmd();


使能或除能SysTick定时器中断:SysTick_ITConfig();


获取SysTick时钟当前值:SysTick_GetCounter();


检测SysTick标志位是否设置:SysTICK_GetFlagStatus();


3、SysTick配置流程

首先配置RCC:选择系统时钟、配置总线时钟、使能外围设备时钟等;


配置NVIC:选择中断优先级组,设置SysTick中断优先级,使能SysTick中断通道;


编写SysTick中断处理函数;


配置SysTick时钟:


设置SysTick时钟源(不需要,默认选择HCLK的8分频作为SysTick系统定时器的时钟源):调用SysTick_CLKSourceConfig()函数;


设置SysTick时钟重装值:调用SysTick_SetReload();


使能SysTick时钟中断(根据具体应用需要):调用SysTick_ITConfig()函数;


使能SysTick时钟:调用SysTick_CounterCmd()函数;


然后还可以调用SysTick_GetCounter()函数获取SysTick系统时钟计数器的当前值;也可以调用SysTick_GetFlagStatus()函数检查指定的SysTick标志位是否设置(没有开启中断,通过软件查询方式检查系统定时器是否计数到0)。


SysTick系统定时器的中断标志位在系统时钟节拍控制与状态寄存器CTRL的COUNTFLAG位,该位由定时器计数到0置1,读取时清零。因此可以调用函数SysTick_GetFlagStatus(SysTick_FLAG_COUNT)来清除COUNTFLAG标志位。


经过测试:不调用SysTick_GetFlagStatus(SysTick_FLAG_COUNT)函数来清除标志位,在每次系统时钟节拍SysTick在计数为0时,也都能进入中断处理函数。但程序的严密性考虑,最好还是调用该函数。


4、SysTick系统定时器例子

例子1:


/* 主函数中配置,这里没有选择SysTick的时钟源,是因为c8芯片已经将该时钟固化成HCLK的8分频了 */


SysTick_SetReload(9000);


SysTick_ITConfig(ENABLE);


SysTick_CounterCmd(SysTick_Counter_Enable);


/*中断处理函数*/


void SysTick_Handler(void)   /* 1ms中断一次 */


{


        if(SET == SysTick_GetFlagStatus(SysTick_FLAG_COUNT))   /* 读标志位,同时清除标志位 */


        {


               SysCount++;


               if(500 == SysCount)


               {


                    SysCount = 0;


                     count++;


               }


        }


}


例子2:


/* 主函数配置 */


SysTick_SetReload(9000);


SysTick_ITConfig(ENABLE);


/* 延时函数,延时nms */


void Delay(u32 nTime)


{


  //开启SysTick计数器


  SysTick_CounterCmd(SysTick_Counter_Enable);


  TimingDelay = nTime;


  while(TimingDelay != 0);     //死等待


  //关闭系统滴答


  SysTick_CounterCmd(SysTick_Counter_Disable);


  //清除SysTick 计数器


  SysTick_CounterCmd(SysTick_Counter_Clear);


}


/* 中断处理函数 */


void SysTick_Handler(void)


{      /* 没有清除标志位,在计数为0时,同样可以进入中断处理函数实现TimingDelay自减工作 */


   if (TimingDelay != 0x00)


  {


    TimingDelay--;


  }


}


推荐阅读

史海拾趣

Carlisle Interconnect Technologies公司的发展小趣事

进入21世纪,Carlisle Interconnect Technologies开始了全球化的布局。公司不仅在北美和欧洲设立了多个生产基地和研发中心,还积极开拓亚洲和拉丁美洲等新兴市场。通过全球化的战略布局,公司不仅能够更好地利用全球资源,还能够更深入地了解各地市场需求,进一步推动业务发展。同时,公司还加强了与国际知名企业的合作,共同推动电子行业的发展和进步。

这五个故事只是Carlisle Interconnect Technologies发展历程中的一部分,但它们足以展示公司在电子行业中的创新、进取和不断追求卓越的精神。这些故事也为我们揭示了一个成功企业的发展轨迹:从创业初期的创新与突破,到不断的技术升级和产品多样化,再到全球化的布局与业务拓展,每一步都充满了挑战与机遇。

Greenconn Corp公司的发展小趣事
合理使用冰箱,避免频繁开关门和长时间开启制冷模式。
捷茂微(GATEMODE)公司的发展小趣事
首先观察冰箱内灯是否亮起,如果灯不亮,可能是断电保护电路故障。此外,还可以使用万用表测量继电器和定时器是否工作正常,以及检查线路连接是否牢固。
Franz Binder GmbH & Co公司的发展小趣事
如果经检查发现继电器或定时器故障,需要按照冰箱型号和规格要求更换新的部件。
Custom Connector Corporation公司的发展小趣事

Custom Connector Corporation成立于1969年,当时电子连接器行业正处于快速发展阶段。创始人看到这一市场潜力,决定投身于这一领域。在创业初期,CCC面临着资金紧张、技术瓶颈和市场认可度低等问题。然而,创始人凭借对技术的执着追求和对市场的敏锐洞察,带领团队不断研发新产品,改进生产工艺,逐渐在市场中树立了自己的品牌形象。

High Voltage Semiconductor Inc公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,美高测始终保持着对技术创新的执着追求。公司不断投入研发资源,探索新的测试技术和应用场景,如微电网、新能源汽车等领域的高压半导体测试。同时,美高测还积极构建开放式的创新生态体系,与众多合作伙伴共同推动行业的进步和发展。通过这些努力,美高测在高压半导体测试领域持续保持着领先地位,为电子行业的未来发展贡献着重要力量。

问答坊 | AI 解惑

调试一块板子,要多长时间?

DSP2812+CPLD(EPM240)+AD+液晶+键盘+时钟+人机的板子....,已经调试了一个星期,老板意思慢了,你说要多久? 虽然这是以往机器的升级版,以往使用mega128做的,程序有80K,现在用DSP2812+CPLD做,板子有很大,24cm*24CM,老板还是天天催,我 ...…

查看全部问答>

3111工程介绍

在我们国家构建和谐社会和建设小康社会的进程中,安全是大众最关心的热点,和谐必须要有安全。政府的方针是求发展、求稳定、求和谐、求平安。         平安城市的建设,目前在全国范围内有比较大的声势,也有相当的力度。杭 ...…

查看全部问答>

Windows Mobile取消自动休眠问题

Windows Mobile系统怎么取消自动休眠,就是要关闭掉 请大家要看是,windows mobile系统的 …

查看全部问答>

求助:vxworks启动盘 总是不成功

                各位大侠帮帮忙啊! 我把启动盘插入后,显示器上显示:v1.6+++++++++++++++。几行加号以后就停在那里不动了。 我的目标机处理器是p3的,网卡类型是Intel 8255x ethernet interface. ...…

查看全部问答>

LM3SLib_QEI

LM3SLib_QEI 我记不得中文叫啥了, [ 本帖最后由 yuhua8688 于 2010-8-24 12:44 编辑 ]…

查看全部问答>

verilog -- inout 测试问题

verilog 的代码: module bi4b(q,dout,din,ctr1); parameter wide = 3; inout[wide:0] q; input ctr1; input[wide:0] din; output[wide:0] dout; wire[3:0] q,dout; assign dout = (!ctr1) ? q : 4\'bz; assign q = (ctr1) ? din : 4\'bz; ...…

查看全部问答>

求lpc2366在ads1.2上的startup.s

如题,我的程序总是不断复位,我怀疑是这个文件的错误,,希望大家帮忙。 fanggengshun@163.com…

查看全部问答>

高纯音电容话筒原理图

这是高纯音电容话筒原理图,求各位大师指点指点。…

查看全部问答>

请教:LM3S9B96以太网发送函数调用问题

EthernetPacketPut这个函数要怎么用啊?它里面的参数都要怎么设置呢?我要发送一个1214大小的以太网包,可是fcs校验总是0000,不知道为什么?…

查看全部问答>

关于msp430低功耗模式编程的问题

在CCS环境中,有 _bic_SR_register(x)、   _bic_SR_register_on_exit(x)、_bis_SR_register(x) 、 _bis_SR_register_on_exit(x) 、    _get_SR_register()、     _get_SR_register_on_exit()   ...…

查看全部问答>