STM32中的定时器:

内核:SysTick 的系统定时器

定时器的工作原理

如:想要:1ms的定时

时钟源: 72MHz

分频器:72分频

72MHz / 72= 1MHz

1/1M s = 1us

1s = 1000ms = 1000 000 us

装载值:1000

1000 * 1 us = 1000 us = 1ms

系统定时器:

概述

处理器有一个24位的定时器:SysTick.它可以从装载值向下计数到0

24bit:计数器可以计数到 2的24次方-1

当向下计数到0时,会在下一个周期将重装载值 加载到 LOAD寄存器然后在下一个周期里重新向下计数

概述:

Systick定时器,是一个简单的定时器,对于CM3、CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。

Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

使用介绍

本文介绍的滴答定时器主要是用于延时,下面我们通过两种方式来实现延时功能,一种是把滴答定时器当成普通的定时器来使用,另一种是模拟实时操作系统(RTOS),将滴答定时器作为心跳时钟,并采用时间摘取法来获得延时。

寄存器的介绍

SysTick->CTRL, --控制和状态寄存器

SysTick->LOAD, --重装载寄存器

SysTick->VAL, --当前值寄存器

SysTick->CALIB, --校准值寄存器

SysTick control and status register (STK_CTRL)控制和状态寄存器

SysTick reload value register (STK_LOAD)重装载值寄存器

SysTick current value register (STK_VAL)定时器当前值寄存器

定时器定时时间的计算:

实现1ms来一次的定时

时钟源:72MHz

分频 1分频

72MHz1/72Ms 1/72us

装载值给多少???

1ms (目标) / (1/72)us (时钟周期)

1000 /(1/72) = 72000 (计数次数)

系统定时器的配置

//调用函数

SysTick_Init(72000);

//系统定时器的配置,自己的函数

void SysTick_Init(uint32_t reload)

{

SysTick->CTRL &= ~(0x1<<16);

SysTick->CTRL |= (0x1<<2);

SysTick->CTRL |= (0x1<<1);

SysTick->LOAD = (reload & 0x00FFFFFF);

//SysTick->VAL = (0x00);只有当VAL值为0时,计数器自动重载RELOAD。

SysTick->VAL = 0;

NVIC_SetPriority(SysTick_IRQn, 0);

NVIC_EnableIRQ(SysTick_IRQn);

SysTick->CTRL |= (0x1<<0);

}

//系统时钟中断

vu32 System_Time = 0;

void SysTick_Handler(void)

{

System_Time ++;

}

/**

\brief System Tick Configuration

\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.

Counter is in free running mode to generate periodic interrupts.

\param [in] ticks Number of ticks between two interrupts.

\return 0 Function succeeded.

\return 1 Function failed.

\note When the variable __Vendor_SysTickConfig is set to 1, then the

function SysTick_Config is not included. In this case, the file device.h

must contain a vendor-specific implementation of this function.

*/

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

{

if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)

{

return (1UL); /* Reload value impossible */

}

SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */

NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */

SysTick->VAL = 0UL; /* Load the SysTick Counter Value */

SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |

SysTick_CTRL_TICKINT_Msk |

SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */

return (0UL); /* Function successful */

}

定时器的使用

阻塞型的延时函数

void Delay_ms(uint32_t time)

{

uint32_t tick = System_Time + time;

//阻塞型的延时

while(System_Time < tick);

//在中断中Systerm_time的值会改变,中断返回还是回到这个断点,直到条件不成立,才能出去这个while循环

}

非阻塞型的延时---类似于时间片的分配

时间片分配的思想,使用非阻塞型的查询方式,来判断时间片是否满足要求,当时间片满足要求之后,将时间片的初值清零。

vu32 System_Time = 0;

vu32 Led1_TaskTime[2] = {0, 500};

vu32 Led2_TaskTime[2] = {0, 300};

vu32 Key_TaskTime[2] = {0, 10};

void SysTick_Handler(void)

{

System_Time ++;

Led1_TaskTime[0] ++;

Led2_TaskTime[0] ++;

Key_TaskTime[0] ++;

}

//.h文件声明

extern vu32 Led1_TaskTime[2];

extern vu32 Led2_TaskTime[2];

extern vu32 Key_TaskTime[2];

//while(1)查询

if(Key_TaskTime[0] > Key_TaskTime[1])

{

if(Get_KeyValue())

{

Beep_Toggle(BEEP_PORT, BEEP_PIN);

}

Key_TaskTime[0] = 0;

}

if(Led1_TaskTime[0] > Led1_TaskTime[1])

{

Led_Toggle(LED1_PORT, LED1_PIN);

Led1_TaskTime[0] = 0;

}

if(Led2_TaskTime[0] > Led2_TaskTime[1])

{

Led_Toggle(LED2_PORT, LED2_PIN);

Led2_TaskTime[0] = 0;

}

//按键获取键值

u8 Get_KeyValue(void)

{

u8 key_value = 0;

static u8 count = 0;

if((KEY_PORT->IDR & (0x1<

{

count++;

}

else if(count > 2)

{

key_value = 1;

count = 0;

}

else

{

count = 0;

}

return key_value;

}

滴答定时器的计数模式_系统滴答定时器相关推荐

  1. 滴答定时器的计数模式_SysTick(系统滴答定时器)

    一.SysTick概述 Systick定时器是一个24 位的倒计数定时器,计到0时,将从RELOAD 寄存器中自动重装载定时初值.只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息 ...

  2. 滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟

    今天我们来说说SysTick定时器.SysTick定时器在从参考手册中根本没有介绍.我费了九牛二虎之力才在一个犄角格拉里找到SysTick定时器的英文版的说明.在Cotex-M3有介绍,为什么要找ST ...

  3. 滴答定时器的计数模式_Cortex-M4 Systick滴答定时器

    Tickclock可以实现精确延时,在K60的datasheet中没有详细将,现在我把我找到资料分享一下,关于systick在Cortex-M4中有讲到我们大家平常在单片机开发中经常会使用到延时函数, ...

  4. 滴答定时器的计数模式_MSP432滴答定时器(SysTick)说明和配置

    MSP432是 TI 的一款基于 arm cortex-M4 内核的 32 位低功耗处理器.低功耗表现十分优越.但是由于上市的时间较短,网上能查找到的相关资料是极其稀少的.所以作者想在此分享一些MSP ...

  5. 硬盘分区模式gpt改成mbr模式_系统硬盘gpt转换的操作方法

    gpt分区因为其可以的支持更加大容量的硬盘,以其优越性将会在未来取代mbr,但是目前安装系统仍受硬盘分区模式的局限,win7用户只能用mbr装,DiskGenius为了方便升级win8或win10的时 ...

  6. 定时器开始时延时了十几秒_第六章--系统滴答定时器

    第六章--系统滴答定时器 简介:系统滴答定时器是内核(这里指M4)定时器使用的是内核时钟源168MZ或可以选择外部时钟源21MZ 应用场合: 为UCOS系统提供时钟节拍 作为简单的定时器延时使用 // ...

  7. STM32系统滴答定时器(systick)应用

    一:系统滴答定时器(systick) 1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断).滴答中断?这里来 ...

  8. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(5):系统滴答定时器

    处理器有一个24位系统定时器,SysTick,它可以向下计数从重载值到0,在下一个时钟边沿重载LOAD寄存器中的值,然后在随后的时钟下降计数. 当处理器停止进行调试时,计数值不再缩减. 系统滴答控制和 ...

  9. linux调度周期systick怎么看,Cortex-M0系统滴答定时器Systick详解

    上图是LPC1114系统滴答定时器(SysTick)的结构图.系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器.其 ...

最新文章

  1. 基于OpencvCV的情绪检测
  2. 算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)
  3. 3年,感谢你与几维安全一起经历的风风雨雨
  4. mysql不能写重复键_错误1022-无法写入;表中的重复键
  5. GDCM:将PAPYRUS 3.0文件转换为dcm文件的的测试程序
  6. php 怎么使循环少一次,PHP-如何让一个类仅在循环中应用一次?
  7. 2016-02-24 获取设备 通知开关
  8. php is_subclass_of,PHP_PHP is_subclass_of函数的一个BUG和解决方法,is_subclass_of的作用: 复制代码 - phpStudy...
  9. 2019 蓝桥杯省赛 B 组模拟赛(一) 程序设计:后缀字符串 ( STL map 和 substr()函数的应用)
  10. 为什么静态static成员函数不能成为virtual虚函数
  11. java的核心类库_Java核心类库
  12. 使用函数 imnoise 对图像添加噪声
  13. vnc远程桌面精灵,七款让人爱不释手的vnc远程桌面精灵
  14. 转行学IT为什么一定要趁早?
  15. android 阿拉伯语文字方向,android – 如何将RTL文本(阿拉伯语)绘制到位图并正确排序?...
  16. GVINS / VINS-mono运行报错:undefined symbol: _ZN6google21kLogSiteUninitializedE,重新安装ceres可以解决
  17. 《如果……》拉迪亚德·吉卜林
  18. erLang中的标点符号
  19. 生信学习笔记:fastp质控处理生成的report结果解读
  20. java BeanUtils PropertyUtils

热门文章

  1. centos7安装gitLab
  2. RHEL 7.6 连接xstart的问题汇总
  3. 初探VLFEAT之sift
  4. YTU.3237: 幸运数字
  5. 基于docker使用GoAccess分析nginx日志
  6. c4d导出html,c4d怎么渲染视频?c4d渲染导出视频设置方法与技巧
  7. 事件修饰符@(stop, prevent, self, once, capture, passive)
  8. UE4 UI和UI之间的通信(浅谈测试)
  9. 算法大总结之----10大经典排序算法(从小到大排列)
  10. 那些程序员爆笑段子,扎心了…