datasheet

Stm32入门——Systick定时器

2019-07-12来源: eefocus关键字:STM32  定时器  延时

Systick定时器是什么?

从原理上来说,Systick定时器和开发板上的通用定时器没有区别。从功能上来说,Systick定时器主要是用来用来进行延时的(就是让CPU一直重复计数这件事),而通用或者高级定时器往往用来进行PWM输出、输入捕获等功能。至于为什么不用通用定时器或者高级定时器来完成延时功能,则是考虑到节省MCU的资源来做更重要的事。


Systick定时器相关寄存器

CTRL Systick控制和状态寄存器(存放使能位、中断位、时钟源选择位等)

LOAD Systick自动重装载值寄存器

VAL Systick当前值寄存器

(这里插一句,建议大家在学习的时候直接对寄存器进行操作,不要用库函数,这样前期虽然会有困难,但操作寄存器其实更高效、更能理解开发原理)

Systick定时器在工作时,先将LOAD中存放的值放入VAL中,然后VAL中的值会在每个时钟周期中减1直到变成0触发中断(如果开启了中断)。需要说明的是,LOAD的有效位是24位,因此理论上它可以存放的数值范围是[0,224 -1]。至于VAL每次减1用了多长时间,这要看你Systick定时器的时钟频率是多少了,比如你设置的时钟频率是1000Hz,那么每次减1就用了1毫秒(因为1000Hz代表1秒钟会产生1000个时钟周期,而一个时钟周期val会减1)。


延时方式

Systick实现延时的方式有两种:中断和非中断。

先说说中断吧,看看下面这段代码


Static _IO uint32_t TimingDelay;

Void Delay(_IO uint32_t nTime)

{

TimingDelay = nTime;

While(TimingDelay !=0);

}

Void SysTick_Handler(void)

{

If(TimingDelay !=0x00)

    {

   TimingDelay --;

    }

}

Int main(void)

{

If(SysTick_Config(SystemCoreClock/1000))//Systick时钟为72MHz,中断时间间隔为1ms

    {

    While(1)

    }

    While(1)

   {

    Delay(200);//2ms

   }

}


此处假设定时器时钟设置的是72MHz(关于时钟部分的知识见时钟篇讲解),SysTick_Config()这个函数是用来开启中断和设置每次中断产生的时间间隔的。SysTick_Config()的入口参数意义为:每产生一次中断,定时器会经过多少个周期。其实这个参数就是用来配置上文所说的LOAD寄存器的,因为每经过一个周期LOAD值就会减1。这样,在定时器时钟频率f和每次中断经过的周期数n确定的情况下,就能算出每次中断产生的时间间隔t,因为频率就是指每秒钟会经过的时钟周期个数。那么问题就很简单了,1秒钟产生了72MHz个时钟周期,那么产生72KHz个时钟周期(即产生一次中断)用了多久?答案是1ms。每次中断产生的时间间隔确定后,调用delay()设置中断次数就能设置多次中断了,比如delay(200)就是延时了200ms。


再说说非中断的情况。

非中断就比较简单了,主要思想就是算出每经过1m会经过多少个时钟周期(即val寄存器减多少次),如果每经过1ms会经过9个周期,那你给LOAD寄存器设置为9000就能延时1000ms了,但要注意的是LOAD寄存器有效位为24位,因此不能赋值超过224 -1的值,但你可以通过多次调用或者在函数内部用循环+取模的方法来让板子在不产生中断的情况下延时更久。


初学stm32,如有不当,欢迎指正!

参考资料:某宝stm32开发板视屏、《stm32中文参考手册》。


关键字:STM32  定时器  延时

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/ic467516.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机入门学习十三 STM32单片机学习十 通用定时器
下一篇:stm32 定时器知识总结

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32 Systick定时器在实现1us延时时的问题与解决

问题:使用systick_config()函数来实现计数,这个函数在下面代码中的 SysTick_CTRL_TICKINT_Msk 开启了中断。不论系统时钟为72Mhz或36Mhz若设置STM32每10us进入一次中断,计时是可以的;而每1us进入中断,由于中断指令较多,那么程序就会困在中断里出不来。static __INLINE uint32_t SysTick_Config(uint32_t ticks){   if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /
发表于 2019-07-17

stm32 ADC知识总结(二)

关于STM32的ADC的一些重要特点需要记住: 1)STM32F103系列至少有2个ADC,这些ADC可以独立使用,也可以使用双重模式(提高采样率); 2)STM32的ADC是12位逐次逼近型的模数转换器,一共有18个通道,可以测量16个外部信号和2个内部信号源; 3)每个通道的ADC可以在单次、连续、扫描或者间断模式下进行; 4)前面讲过STM32的ADC是12位的,结果存储在16位的数据寄存器中,有4位用不到,所以ADC存在左对齐或右对齐的方式; 5)模拟看门狗允许应用程序检测输入电压是否超出用户定义的高低阈值; 6)STM32的ADC最大的转换速率为1MHz
发表于 2019-07-17
stm32 ADC知识总结(二)

stm32f070 stop 模式 rtc定时启动调试总结

stm32f070 stop 模式 rtc定时启动调试总结。1.在进stoop模式之前一定对gpio进行配置。/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOF_CLK_ENABLE();/Configure GPIO pins : GPIO_PIN_All/GPIO_InitStruct.Pin = GPIO_PIN_All;GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;GPIO_InitStruct.Pull = GPIO_NOPULL
发表于 2019-07-17

RTC_WakeUp中断唤醒STM32F4停止模式

RTC_WakeUp唤醒STM32F4停止模式(借鉴的是原子哥写的代码): 首先我们先初始化RTC配置://RTC初始化u8 MyRTC_Init(void){    RTC_InitTypeDef RTC_InitStructrue;    u16 retry=0x1FFF;    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//使能PWR时钟    PWR_BackupAccessCmd(ENABLE);//使能后备寄存器    if
发表于 2019-07-17

关于stm32stop模式下,串口唤醒中的问题及解决办法

首先讲一下应用场景:STM32F1 + HAL库+ Freertos ,STOP模式下利用串口引脚唤醒。stop mode 处理内容如下:1,配置所有引脚为模拟输入(参考官方代码)2,配置串口接收引脚为外部中断3,进入stop mode4,初始化串口等外设现象:第一次从stop模式唤醒时串口能正常通信,判断一段时间后无数据则再一次进入stop mode,然后再一次唤醒,此时串口无法输出。最后发现原因是串口重新初始化时HAL_UART_Init()函数中会判断if(huart->State == HAL_UART_STATE_RESET),此时才会执行HAL_UART_MspInit(huart),配置串口IO口。解决办法
发表于 2019-07-17

STM32开发笔记1: STM32F407时钟配置

单片机型号:STM32F407    本文讲解STMF407时钟的使用及其配置方法。        1、STM32F407的分类        a、LSI是低速内部时钟,RC震荡器,频率为32KHz左右。供独立看门狗和自动唤醒单元使用。        b、LSE是低速外部时钟,接频率为32.768KHz的石英晶体。这个主要是RTC的时钟源。        c、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围
发表于 2019-07-17
STM32开发笔记1: STM32F407时钟配置

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved