滴答定时器的计数模式_系统滴答定时器
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;
}
滴答定时器的计数模式_系统滴答定时器相关推荐
- 滴答定时器的计数模式_SysTick(系统滴答定时器)
一.SysTick概述 Systick定时器是一个24 位的倒计数定时器,计到0时,将从RELOAD 寄存器中自动重装载定时初值.只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息 ...
- 滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟
今天我们来说说SysTick定时器.SysTick定时器在从参考手册中根本没有介绍.我费了九牛二虎之力才在一个犄角格拉里找到SysTick定时器的英文版的说明.在Cotex-M3有介绍,为什么要找ST ...
- 滴答定时器的计数模式_Cortex-M4 Systick滴答定时器
Tickclock可以实现精确延时,在K60的datasheet中没有详细将,现在我把我找到资料分享一下,关于systick在Cortex-M4中有讲到我们大家平常在单片机开发中经常会使用到延时函数, ...
- 滴答定时器的计数模式_MSP432滴答定时器(SysTick)说明和配置
MSP432是 TI 的一款基于 arm cortex-M4 内核的 32 位低功耗处理器.低功耗表现十分优越.但是由于上市的时间较短,网上能查找到的相关资料是极其稀少的.所以作者想在此分享一些MSP ...
- 硬盘分区模式gpt改成mbr模式_系统硬盘gpt转换的操作方法
gpt分区因为其可以的支持更加大容量的硬盘,以其优越性将会在未来取代mbr,但是目前安装系统仍受硬盘分区模式的局限,win7用户只能用mbr装,DiskGenius为了方便升级win8或win10的时 ...
- 定时器开始时延时了十几秒_第六章--系统滴答定时器
第六章--系统滴答定时器 简介:系统滴答定时器是内核(这里指M4)定时器使用的是内核时钟源168MZ或可以选择外部时钟源21MZ 应用场合: 为UCOS系统提供时钟节拍 作为简单的定时器延时使用 // ...
- STM32系统滴答定时器(systick)应用
一:系统滴答定时器(systick) 1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断).滴答中断?这里来 ...
- STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(5):系统滴答定时器
处理器有一个24位系统定时器,SysTick,它可以向下计数从重载值到0,在下一个时钟边沿重载LOAD寄存器中的值,然后在随后的时钟下降计数. 当处理器停止进行调试时,计数值不再缩减. 系统滴答控制和 ...
- linux调度周期systick怎么看,Cortex-M0系统滴答定时器Systick详解
上图是LPC1114系统滴答定时器(SysTick)的结构图.系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器.其 ...
最新文章
- 基于OpencvCV的情绪检测
- 算法笔记_204:第四届蓝桥杯软件类决赛真题(Java语言C组)
- 3年,感谢你与几维安全一起经历的风风雨雨
- mysql不能写重复键_错误1022-无法写入;表中的重复键
- GDCM:将PAPYRUS 3.0文件转换为dcm文件的的测试程序
- php 怎么使循环少一次,PHP-如何让一个类仅在循环中应用一次?
- 2016-02-24 获取设备 通知开关
- php is_subclass_of,PHP_PHP is_subclass_of函数的一个BUG和解决方法,is_subclass_of的作用:
复制代码 - phpStudy...
- 2019 蓝桥杯省赛 B 组模拟赛(一) 程序设计:后缀字符串 ( STL map 和 substr()函数的应用)
- 为什么静态static成员函数不能成为virtual虚函数
- java的核心类库_Java核心类库
- 使用函数 imnoise 对图像添加噪声
- vnc远程桌面精灵,七款让人爱不释手的vnc远程桌面精灵
- 转行学IT为什么一定要趁早?
- android 阿拉伯语文字方向,android – 如何将RTL文本(阿拉伯语)绘制到位图并正确排序?...
- GVINS / VINS-mono运行报错:undefined symbol: _ZN6google21kLogSiteUninitializedE,重新安装ceres可以解决
- 《如果……》拉迪亚德·吉卜林
- erLang中的标点符号
- 生信学习笔记:fastp质控处理生成的report结果解读
- java BeanUtils PropertyUtils
热门文章
- centos7安装gitLab
- RHEL 7.6 连接xstart的问题汇总
- 初探VLFEAT之sift
- YTU.3237: 幸运数字
- 基于docker使用GoAccess分析nginx日志
- c4d导出html,c4d怎么渲染视频?c4d渲染导出视频设置方法与技巧
- 事件修饰符@(stop, prevent, self, once, capture, passive)
- UE4 UI和UI之间的通信(浅谈测试)
- 算法大总结之----10大经典排序算法(从小到大排列)
- 那些程序员爆笑段子,扎心了…