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 软件定时器其实跟硬件中断是相 ...
随机推荐
- 代码注入/文件包含 弹出Meterpreter
主要通过 msf 中 exploit 的 web_delivery 模块来实现此功能 0x01 前提背景 目标设备存在远程文件包含漏洞或者命令注入漏洞,想在目标设备上加载webshell,但不想在目标 ...
- 部署oVirt4.2+Gluster超融合架构
首先下载最新ovirt-node iso镜像 准备3台机器,配置为2核,16G内存,两块硬盘,1块100G装系统,1块300G做存储 node1.com(192.168.105.221) node2. ...
- Nexus Repository Manager OSS 3.x 安装配置
前言想要使用maven搭建项目,但是国内的网络环境可以想象,还有公司自己开发的jar包等问题,所以需要搭建一个maven的私服,这样便于管理. 找了一些教程,顺便记下来,当做笔记. 本文以Window ...
- openwrt的shell下如何访问寄存器的内容?
答:通过devmem工具(在openwrt的make menuconfig中可以使能该工具) $ busybox devmem 0x123456
- SSL证书原理讲解
一直以来都对数字证书的签发,以及信任等事情一知半解.总算有个闲适的周末来总结和深入一下相关的知识. CA: CA(Certificate Authority)是证书的签发机构,它是负责管理和签发证书的 ...
- (转)Nginx中sendfile的作用
原文:https://blog.csdn.net/zhusixun/article/details/81702380 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上 ...
- Android设置顶部banner背景透明度时影响全局背景问题
项目中用到滑动界面使顶部title栏背景渐隐渐现的效果,即初始不滑动时的透明度为0,用了bannerle.getBackground().setAlpha(0); 但使用这个方法设置透明度是管用,返回 ...
- Ubuntu16.04下配置VScode的C/C++开发环境
博客转载:https://blog.csdn.net/weixin_43374723/article/details/84064644 Visual studio code是微软发布的一个运行于 Ma ...
- DTLZ
DTLZ 开新坑,未完待续 觉得有用的话,欢迎一起讨论相互学习~Follow Me Reference [1] Multiobjective Immune Algorithm with Nondomi ...
- cmd大全
CMD命令:开始->运行->键入cmd或command(在命令行里可以看到系统版本.文件系统版本) 1. appwiz.cpl:程序和功能 2. calc:启动计算器 3. certmgr ...