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

发布者:JoyfulExplorer最新更新时间:2016-08-03 来源: eefocus关键字:STM32F10X芯片  SysTick  系统时钟  定时器 手机看文章 扫描二维码
随时随地手机看文章
如题,正文如下:

1、介绍

       实现Cortex-M3系统定时器SysTick的配置,需要具备以下知识:Cortex-M3系统定时器默认频率是HCLK的8分频(如下图所示),因此需要会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();

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

  }

}

关键字:STM32F10X芯片  SysTick  系统时钟  定时器 引用地址:浅谈STM32F10X芯片SysTick系统时钟定时器

上一篇:STM32F10x芯片RTC实时时钟
下一篇:浅谈STM32F10X芯片RTC实时时钟

推荐阅读最新更新时间:2024-03-16 15:03

TIM2定时器中断与中断嵌套
/************************************************************ Copyright (C), 2012-2022, yin. FileName: main.c Author: ycw Version : 1.0 Date: 2012.04.22 Description: TIM2 EXIT0 NVIC Version: V1.0 Function List: TIM2 EXIT0 NVIC History: author time version desc YCW 12/04/22 1.0
[单片机]
51单片机常用知识点
首先是定时器 定时器/计数器 定时器很重要,单片机的心脏 首先几个概念 时钟频率:fosc(晶振提供,51一般是12Mhz,11.0592Mhz这两种) 12分频:fosc/12(这里我设为fT) 机器周期:T=1/fT 定时器就配置两种, 第一是工作模式:定时器/计数器 第二是四种工作方式 然后是两个寄存器 TMOD&TCON 工作方式寄存器和控制寄存器 工作方式寄存器TMOD (1)GATE——门控位 GATE=0时,仅由控制位TRX(X=0,1)来启动定时器/计数器运行。 GATE=1时,由TRX(X=0,1)和中断引脚(INT0和INT1)上的高电平共同来启动定时器/计数器运行。 (2)M0、M1——工作方式选择位 M0、
[单片机]
MSP430FR6989系列教程之定时器
一、定时器 MSP430单片机的时钟模块主要包括: 三个时钟:辅助时钟ACLK 、主时钟MCLK 、子系统时钟SMCLK 三个振荡器:低频时钟源LFXT1 、高频时钟源XT2 、数字控制RC振荡器DCO 而MSP430单片机工作所需时钟就是由这些振荡器振荡后经处理产生的。 Timer_A 的功能包括: • 具有四种工作模式的异步 16 位定时器/计数器 • 可选择和可配置的时钟源 • 多达七个可配置的捕捉/比较寄存器 • 具有脉宽调制 (PWM) 功能的可配置输出 • 异步输入和输出锁存 • 中断用于快速解码所有 Timer_A 中断的向量寄存器 二、代码编写 这里附上完整的main.c代码 #include msp4
[单片机]
51单片机学习之路(四)-定时器
写在前面:以下涉及到的程序及电路图不保证为最优方案,会存在很多不足之处,望谅解。另外,C51的内容是在整理很久之前所学的知识,可能会存在错误,欢迎指正。 正文 学习目标:学会使用51单片机中的定时器0。 学习内容: 用定时器0控制LED灯的亮灭 用定时器在数码管上实现计时 程序一:控制LED灯 功能要求:运行程序后连接在单片机上的LED灯以1s的频率闪烁。 定时器寄存器简单介绍 在本次内容中将使用定时器0,定时器1的使用方式与定时器0大体相同,以下简单介绍一下将要使用到的几个中断寄存器,具体介绍请以官方数据手册为准: TMOD:定时器模式寄存器,大致分为4个模式: 00:定时器0或1选择13位定时/计数器模式,该模式下TL
[单片机]
51单片机学习之路(四)-<font color='red'>定时器</font>
【STM32】STM32时钟系统和SystemInit函数解读
时钟系统就是CPU的脉搏,像人的心跳一样,重要性不言而喻。由于STM32本身十分复杂,外设非常多,但并不是所有的外设都需要系统时钟那么高的频率,比如看门狗以及RTC只需要几十k的时钟即可。并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题。 STM32F1xx官方资料: 《STM32中文参考手册V10》-第六章 复位和时钟控制 RCC STM32的时钟系统 STM32的时钟系统图 上图是STM32的时钟系统图。STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL,在图中有红色方框标记的位置。从时钟频率来分可以分成高速时钟源和低速时钟
[单片机]
【STM32】STM32<font color='red'>时钟</font><font color='red'>系统</font>和SystemInit函数解读
STM32F03开发板--系统时钟设置SysTick
首先我先分析下startup_stm32f0xx.s启动代码,其中 /* Call the clock system intitialization function.*/ bl SystemInit /* Call the application's entry point.*/ bl main 发现开发板上电启动过程中,先调用了SystemInit()函数,再进入main()函数。 SystemInit()函数在文件system_stm32f0xx.c中,它的作用是设置系统时钟SYSCLK。 下面是SystemInit()源码: void SystemInit (void) { /* Set HSION bi
[单片机]
STM32F03开发板--<font color='red'>系统</font><font color='red'>时钟</font>设置<font color='red'>SysTick</font>
STM32 高级定时器 输出PWM (用DHT11测得的温度去调节RGB灯的亮度)
开发平台 野火STM32F429开发板 使用标准库开发 高级定时器 高级定时器其实就是基本定时器加上输入捕获、输出比较和断路死区,所以有四个初始化函数: 定时器时基初始化函数 TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct); 输出比较初始化函数 TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct); 输入捕获初始化函数 TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICI
[单片机]
基于AT91R40008微处理器的软件定时器设计
0引言 当前,嵌入式系统的软件代码日趋复杂。然而,由于存储器、定时器等硬件资源仍然相对有限。如何在不影响系统整体性能的情况下,为嵌入式系统提供优异的定时性能,使系统能够高效运行,已是一个值得关注的问题。 1软件定时器 软件定时器是一组定时器实体的集合,是一种针对不同定时服务进行统一管理的多任务链表类型数据结构。软件定时器可使系统在某一确定时刻执行指定操作。它以可编程定时/计数器或单稳延时电路为基础。利用硬件定时器产生的定时中断来实现。虽然软件定时器也需要占用CPU时间,但是相对于硬件定时器来说,它的资源多,定时时间长,使用灵活,实现起来简单方便,因而在复杂系统或定时器工作方式比较复杂的应用场合更能体现其价值。 对定时器
[单片机]
基于AT91R40008微处理器的软件<font color='red'>定时器</font>设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved