STM32 系统滴答计时器
static u8 fac_us = ;//us与系统滴答的被乘数
static unsigned short fac_ms = ;//ms与系统滴答的被乘数
static unsigned int m_sys_seconds = ;//系统运行秒数
/**
* @description:系统滴答计时系统初始化
* @param 无
* @retval 无
*/
void SysTick_Init(void)
{
//配置系统滴答时钟源
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
//设置预装载值
SysTick->LOAD = 0x895440;//时间加载
//计算ms & us转换因数
fac_us = SystemCoreClock/; //为系统时钟的1/8
fac_ms = (unsigned short)fac_us*; //代表每个ms需要的systick时钟数 //开启中断,使能计时
SysTick->CTRL |= (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk) ; //开始倒数 } /*-------------------------------------------------------------------------------------------------
*@description: 返回当前系统运行的秒数.(溢出不计)
--------------------------------------------------------------------------------------------------*/
unsigned long sys_seconds(void)
{
return m_sys_seconds;
} /*-------------------------------------------------------------------------------------------------
*@description: 返回当前系统运行的时间,Unit ms.(溢出不计)
--------------------------------------------------------------------------------------------------*/
unsigned long long sys_millis(void)
{
unsigned long long millisecond = (0x895440-SysTick->VAL)/fac_ms + m_sys_seconds*;
//当前系统运行时间ms
return millisecond;
} /*-------------------------------------------------------------------------------------------------
*@description: 返回当前系统运行的时间,Unit us.(溢出不计)
--------------------------------------------------------------------------------------------------*/
unsigned long long sys_micros(void)
{
unsigned long long microseconds = (0x895440-SysTick->VAL)/fac_us + m_sys_seconds*;
return microseconds;
} // couter 减1的时间 等于 1/systick_clk
// 当counter 从 reload 的值减小到0的时候,为一个循环,如果开启了中断则执行中断服务程序,
// 同时 CTRL 的 countflag 位会置1
// 这一个循环的时间为 reload * (1/systick_clk) void SysTick_Delay_Us( unsigned short ns_num)
{
unsigned long long current_us = sys_micros(); if((current_us + ns_num) <= 0x3e7fffb7bbf)//不存在溢出
{
current_us += ns_num;
do
{
;
}while(sys_micros() < current_us);
}
else//存在溢出
{
current_us = (current_us + ns_num) - 0x3e7fffb7bbf;
do
{
;
}while(sys_micros() <= 0x3e7fffb7bbf);
do
{ }while(sys_micros() < current_us);
}
} void SysTick_Delay_Ms( unsigned short ms_num)
{
unsigned long long current_ms = sys_millis(); if((current_ms + ms_num) <= 0xfffffed7)//不存在溢出
{
current_ms += ms_num;
do
{
;
}while(sys_millis() < current_ms);
}
else//存在溢出
{
current_ms = (current_ms + ms_num) - 0xfffffed7;
do
{
;
}while(sys_millis() <= 0xffffed7);
do
{
;
}while(sys_millis() < current_ms);
} } /**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
m_sys_seconds++;
}
STM32 系统滴答计时器的更多相关文章
- STM32嵌入式开发学习笔记(四):使用滴答计时器实现精准计时
前面我们讲过,因为在STM32上没有系统时间的接口,因此无法调用sleep函数,在本文中,笔者将利用滴答计时器实现精准延时. 查阅技术手册,滴答计时器依赖于一个SysTick_Type类型寄存器,定义 ...
- STM32之系统滴答定时器
一.SysTick(系统滴答定时器)概述 操作系统需要一个滴答定时器周期性产生中断,以产生系统运行的节拍.在中断服务程序里,基于优先级调度的操作系统会根据进程优先级切换任务,基于时间片轮转系统会根据时 ...
- STM32 的系统滴答定时器( Systick) 彻底研究解读
作者:王健 前言 SysTick 比起那些 TIM 定时器可以说简单多啦~~~~~哥的心情也好了不少, 嘎嘎!! ARM Cortex-M3 内核的处理器内部包含了一个 SysTick 定时器,它是一 ...
- 系统滴答定时器(SysTick)中断配置
系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...
- Cortex-M0系统滴答定时器Systick详解
上图是LPC1114系统滴答定时器(SysTick)的结构图.系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器.其 ...
- liunx驱动----系统滴答时钟的使用
2019-3-12系统滴答定时器中断使用 定义一个timer 其实就是使用系统的滴答定时器产生一个中断. 初始化timer init_timer函数 实现如下 void fastcall ini ...
- STM32 - SYSTICK(系统滴答定时器)
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15).在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基.例如,为多个任务许以不同数目 ...
- STM32学习笔记(六) SysTick系统时钟滴答实验(stm32中断入门)
系统时钟滴答实验很不难,我就在面简单说下,但其中涉及到了STM32最复杂也是以后用途最广的外设-NVIC,如果说RCC是实时性所必须考虑的部分,那么NVIC就是stm32功能性实现的基础,NVIC的难 ...
- uCOS的软件定时器、uCOS时钟节拍和滴答定时器的关系
uCOS2.81后的版本中有软件定时器的概念,如果要开启定时器任务,需要在OS_CFG.H文件中 #define OS_TMR_EN 1 软件定时器其实跟硬件中断是相 ...
随机推荐
- GIT与项目
创建GitHub账号 本地Git仓库和GitHub仓库之间的传输是通过SSH加密的 step1:创建项目的SSH Key ssh-keygen -t rsa -C "your email@e ...
- 虔诚的墓主人(BZOJ1227)(洛谷P2154)解题报告
题目描述 小W是一片新造公墓的管理人.公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. 当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地. ...
- “知乎杯”2018 CCF 大学生计算机系统与程序设计竞赛 分组加密器(encryption)
分组加密器(encryption) 题解点这里 #include<map> #include<stack> #include<vector> #include< ...
- 【POJ3087】Shuffle'm Up
本题传送门 本题知识点:宽度优先搜索 模拟 + map 本题题意有点懵.就是单纯的把S1像例子那样插到S2里,根本不是什么宽搜题,因为只是一个方向就可以了.说是搜索题倒是有点意思,因为要查重. 不过c ...
- 洛谷P5171 Earthquake
题面 题解 我们先把样例画出来: 看到它是一个减函数感觉很烦,考虑把函数转过来一下: 转过来的函数通过推导可得为: \[ y = \frac abx + \frac {c \bmod a}b \] 于 ...
- RabbitMQ C#客户端自动重连
重要参考文章来源:http://gigi.nullneuron.net/gigilabs/resilient-connections-with-rabbitmq-net-client/ 参考代码:ht ...
- Parallel.For循环与普通的for循环
前两天看书发现了一个新的循环Parallel.For,这个循环在循环期间可以创建多个线程并行循环,就是说循环的内容是无序的.这让我想到了我前面的牛牛模拟计算是可以用到这个循环的,我前面的牛牛模拟计算是 ...
- centos上传命令
首先安装lrzsz # yum -y install lrzsz 1.上传文件,执行命令rz,会跳出文件选择窗口,选择好文件,点击确认即可. # rz 运行rz命令后弹出选择文件窗口,找到要上传的文件 ...
- Spring @RequestMapping 参数说明
@RequestMapping 参数说明: value: 指定请求的实际地址, 比如 /action/info之类.method: 指定请求的method类型, GET.POST.PUT.DELE ...
- sklearn的基本使用
https://cloud.tencent.com/developer/news/58202 简介 今天为大家介绍的是scikit-learn.sklearn是一个Python第三方提供的非常强力的机 ...