您的位置 首页 模拟

浅谈STM32F10X芯片SysTick体系时钟定时器

如题,正文如下:1、介绍实现Cortex-M3系统定时器SysTick的配置,需要具备以下知识:Cortex-M3系统定时器默认频率是HCLK的8分频(如下图所…

如题,正文如下:

1、介绍

完成Cortex-M3体系定时器SysTick的装备,需求具有以下常识:Cortex-M3体系定时器默许频率是HCLK的8分频(如下图所示),因而需求会RCC时钟的装备;然后装备SysTick体系定时器;编写SysTick中止处理函数。

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

2、寄存器描绘

lSysTick操控及状况寄存器STK_CTRL

lSysTick重装载数值寄存器STK_LOAD

lSysTick当时数值寄存器STK_VAL

lSysTick校准数值寄存器STK_CALIB

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

l装备SysTick体系时钟:SysTick_CLKSourceConfig();

l设置SysTick重装值:SysTick_SetReload();

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

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

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

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

3、SysTick装备流程

?首要装备RCC:挑选体系时钟、装备总线时钟、使能外围设备时钟等;

?装备NVIC:挑选中止优先级组,设置SysTick中止优先级,使能SysTick中止通道;

?编写SysTick中止处理函数;

?装备SysTick时钟:

n设置SysTick时钟源(不需求,默许挑选HCLK的8分频作为SysTick体系定时器的时钟源):调用SysTick_CLKSourceConfig()函数;

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

n使能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–;

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/274960.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部