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

本文详细介绍了如何配置Cortex-M3的SysTick系统定时器,包括必要的寄存器描述、配置流程及两个实际的例子。通过本文,读者能够掌握SysTick定时器的初始化步骤和使用方法。

1、介绍

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

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

2、寄存器描述

l         SysTick控制及状态寄存器STK_CTRL

l         SysTick重装载数值寄存器STK_LOAD

l         SysTick当前数值寄存器STK_VAL

l         SysTick校准数值寄存器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();

3SysTick配置流程

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

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

?         编写SysTick中断处理函数;

?         配置SysTick时钟:

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

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

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

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

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

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

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

4SysTick系统定时器例子

例子1

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

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--;

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值