STM32入门学习之_SysTick_Config()函数的SysTick时钟配置

发布者:山宝宝最新更新时间:2017-10-02 来源: eefocus关键字:STM32  SysTick  时钟配置 手机看文章 扫描二维码
随时随地手机看文章

上来就是systick定时器,因为GPIO等的基础操作过于简单,网上资料太多了。
这里讨论的是基于STM32F10x 的基于 V3.5.0库的库函数配置方法。

Systick又叫系统嘀答定时器,是一个24位的硬件定时器。嵌入式操作系统常有一个类似“心跳”的定时器,来分配时间片,实现宏观上的多任务。
其实,操作系统的多任务,在微观上,CPU对多任务的管理是分时的。每个任务都给一定的时间片,就是把时间分成N个等份,优先级高或是
重要的任务多占几个时间片,优先级低的或是不重要的任务就少占几个时间片。大部分嵌入式操作系统基于时间片的。如ucos。

那基于STM32F10x V3.5.0库如何操作Systick定时器呢。
首先:STM32 的内核库已经提供了这个功能。只要配置SysTick_Config()即可实现。
看下面的程序段。
/*
* 函数名:SysTick_Init
* 描述         :启动系统滴答定时器 SysTick
* 输入  : 无
* 输出  :无
* 调用  : 外部调用
*/
void SysTick_Init(void)
{
        if(SysTick_Config(SystemCoreClock/1000))         //1ms定时器
        {
                while(1);
        }
        //SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;                         //若无法启动则关闭
}

SysTick_Config的参数,其实就是一个时钟次数,叫systick重装定时器的值。意思就是我要多少个1/fosc 时间后中断一下。

根据学过的物理中的时间与频率的公式:fosc=1/T   T=1/fosc ,fosc为系统的频率。
如果STM32时钟频率为:72MHz,每次的时间为:T=1/72MHz。1秒钟为:1/(每次的时间)=1/(1/72MHz)=72 000 000次。1MHz是:1000 000。

反过来讲。SysTick_Config(72000)代表:72000*(1/72MHz)=1/1000=1(ms)。即定时为1ms。
如果需要1S则,可以通一设置一个全局变量,然后定初值得为1000,这样,每个systick中断一次,这个全局变量减1,减到0,即systick中断1000次,时间
为:1ms*1000=1S。从而实现1S的定时。

因为SysTick定时器是:24位的,最大定时时间为:2的24次方*(1/72MHz)的时间,这里系统频率为:72MHz的情况下。

如何使用这个Systick用于程序设计上的延时或是定时作用呢?
如下:
__IO uint32_t TimingDelay;
定义一个全局变量,注意类型为 volatile的。

volatile的作用: 作为指令关键字,确保本条指令不会因为编译器的优化而省略,且要求每次直接读值.然后定义一个延时或是定时函数:


/*
* 函数名:Delay_ms
* 描述         :ms延时程序,1ms为一个单位
* 输入  : - nTime
* 输出  :无
* 示例  : Delay_ms(1) 实现的延时为:1*ms=1ms
* 调用  :外部调用
*/
void Delay_ms(uint16_t nTime)
{
        TimingDelay = nTime;
        //使能系统滴答定时器
        while(TimingDelay !=0);
}

      还要在系统的中断函数文件:stm32f10x_it.c/h里面,修改系统自带的systick函数。这个函数要么没有声明或是为空操作。这里加入
定时延时里的处理。
      即中断后,全局变量做个--处理即可。

      在::stm32f10x_it.c里修改如下:
添加外部的声明:
extern __IO uint32_t TimingDelay;

      修改这个函数: SysTick_Handler,这是系统的关于SysTick_Handler的中断服务程序名,
在启动文件里如:startup_stm32f10x_hd.s   有它的定义的名字。不要弄错了。否则无法中断处理。


/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
if (TimingDelay != 0x00)
        {   
                TimingDelay--; 
        }
}


      以上,即定义配置好了Systick定时器。如何使用呢?
很简单。
        Delay_ms(500);  即为延时500ms。


       当然,使用前,请先初始化:
SysTick_Init();
       否则无法使用并影响后续的程序运行,这个很重要,就像打开了串口中断,你不清标志位,也同样在接收字符后,CPU中断在那里,而不能继续执行!。使用外设功能,需要初始化!


以上基本讲完了。主要是加入了自己的理解。

以下为搜索的一些其他理解。

SysTick_Config(SystemFrequency / 10)   函数的形参就是systick重装定时器的值。

systck计数频率为每秒72000000次,所以7200000次就是1/10秒,也就是100ms。


SysTick是1个24bit递减计数器,通过对SysTick控制与状态寄存器的设置,可选择HCLK时钟(72M)或HCLK的8分频(9M,缺省是这个)作为SysTick的时钟源。
SysTick的重装寄存器决定了定时器频率。


若SysTick的时钟源是72M,   SystemFrequency = 72000000Hz
所以 SysTick_Config(SystemFrequency / 1000); 就是1ms时基。


关键字:STM32  SysTick  时钟配置 引用地址:STM32入门学习之_SysTick_Config()函数的SysTick时钟配置

上一篇:STM32F429的定时器的使用方法
下一篇:STM32 GPIO管脚模式的设置及使用方法

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

CortexM之SysTick
SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号:15)。所以关于SysTick寄存器基地址和相关库函数的定义不会在芯片生产商的外设库中,而是在CMISS中,core_cm3.h中进行了相关定义。 在以前,操作系统还有所有使用了时基的系统,都必须一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。滴答中断对操作系统尤其重要。例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持
[单片机]
STM32编程小总结
1.在主函数的正式调用里,RCC的配置一定要在各外设的函数调用之前。 2.外设调试出现问题时,一定先考虑是不是没有打开外设的时钟。并且RCC配置和外设时钟的打开要在配置寄存器之前。 3.使用模块化编程可以使程序简单易读,可移植性高,下一次调用方便。但是可能会出现很多问题,必须一一克服。 在主函数里,把需要用得到的各模块配置函数调用写入,这一点很重要。 4.模块化编程时,一定要确保模块的.c文件添加进了工程目录,否则会出现:Undefined Symbol的错误提示,这一点要牢记。 5.中断服务函数必须要写进stm32f10x.it.c里面。否则会出问题。 6.有时添加的模块太多可能会调试不出来,这时考虑把GPI
[单片机]
基于STM32的智能电梯控制系统设计
电梯自动控制系统一般是基于PLC,但是在一些干扰较少,层数较少,且控制精度要求不高的情况下,使用单片机是十分适合的。虽然它在抗干扰及稳定性上比不上PLC,但是它的价格、体积及灵活性是PLC所不及的。 1、系统硬件设计 1.1、系统总体组成 如图1系统总体结构,本系统将基于ARMCortex-M3内核的STM32F103ZET6芯片作为主控芯片,连接电机控制、压力传感、液晶显示、光感检测、按键输入模块,通过程序控制组成了一个智能电梯控制系统。其中,电机控制模块用于模拟电梯门的开关和电梯的上下运动;压力传感模块用于模拟电梯门关闭时受到阻力的情况及超重警告;光感模块用于模拟电梯抵达楼层时的位置检测;液晶显示模块用于模拟电梯内部的楼层
[单片机]
基于<font color='red'>STM32</font>的智能电梯控制系统设计
STM32STM32端口复用和重映射(AFIO辅助功能时钟
STM32F1xx官方资料: 《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO) 端口复用功能 端口复用的定义 STM32有许多的内置外设(如串口、ADC、DCA等等),这些外设的外部引脚都是和GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫复用。详细的可以参考《STM32F103ZET6数据手册》p30的内容,表格的倒数第二栏就表示端口复用功能。 比如说,STM32的串口1的引脚对应的I/O位PA9、PA10。而PA9、PA10默认的功能都是GPIO,所以说当PA9、PA10引脚作为串口1使用的时候就是端口复用。
[单片机]
【<font color='red'>STM32</font>】<font color='red'>STM32</font>端口复用和重映射(AFIO辅助功能<font color='red'>时钟</font>)
STM32 程序卡死在启动文件startup_stm32fxxxx.s的SysTick_Handler中
出现的问题 硬件调试的时候发现程序一直在启动文件下面箭头这行。显然是跟SysTick_Handler有关 由于我使用了FreeRTOS,所以需要SysTick为系统时基单元,所以需要SysTick_Handler,但是我却没有定义此中断函数,所以导致上面的程序一直进入不了以SysTick_handler命名的中断函数;填上就好了; 解决问题 添加SysTick_Handler函数:
[单片机]
<font color='red'>STM32</font> 程序卡死在启动文件startup_stm32fxxxx.s的<font color='red'>SysTick</font>_Handler中
STM32硬件IIC
1 /** 2 * @brief 写一个字节到I2C设备中 3 * @param 4 * @arg pBuffer:缓冲区指针 5 * @arg WriteAddr:写地址 6 * @retval 正常返回1,异常返回0 7 */ 8 uint8_t I2C_ByteWrite(u8 pBuffer, u8 WriteAddr) 9 { 10 /* Send STRAT condition */ 11 I2C_GenerateSTART(macI2Cx, ENABLE); 12 13 I2CTimeout = I2CT_FLAG_TIMEOUT; 14 15 16 /*
[单片机]
stm32专题二:GPIO输入—按键检测
新建板级支持包bsp_key.c和bsp_key.h GPIO输入配置过程: 定义初始化结构体; 开启RCC时钟,非常重要; 写入引脚和模式配置,不需要配置速度; 调用初始化函数,将初始化结构体写入对应的GPIO端口。 bsp_key.c包含两个函数,一个是初始化函数,另一个是按键扫描函数,会按键被按下时,返回按键的状态。 bsp_key.c #include bsp_key.h /** * @brief 按键初始化函数 */ void KEY_GPIO_Config(void) { // 定义GPIO初始化结构体 GPIO_InitTypeDef GPIO_InitStruct; // 开
[单片机]
STM32的DMA简介
DMA是MCU一个非常重要的部分,它提供了一种直接、高效、快速的方式来传输数据,而不需要CPU的介入,大大提高了MCU的工作效率。 我们先来看一下没有DMA,数据是怎么流动的。 如图所示,红色线表示外设数据的读写,蓝色线表示内存数据的读写。数据必须要先加载到内核,然后再通过内核写入外设或内存,读写操作都需要内核做很多工作,虽然C代码可能就一行语句,但是汇编可不止一条。我们知道在程序执行的过程中这样的数据传输操作非常频繁,如果都这样处理,内核将花费太多时间在搬运数据上,无法集中精力处理更为重要的计算和中断事件,处理速度和效率就会非常的低。 使用DMA后,数据的流动变成了下图所示方式。 数据的传输工作由DMA控制器接管,假
[单片机]
<font color='red'>STM32</font>的DMA简介
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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