systick定时器 延时计时
可以直接看定时器二代
systick定时器是属于cortex M内核的外设,专门为RTOS的系统时钟节拍设计的。systick是cortex M内核自带的,因此和debug调试接口一样,与单片机型号和厂商无关,只要是cortex M内核的单片机,都拥有这个24位的systick定时器。
systick定时器是一个24位递减计时器,用户至于要掌握CMSIS包中的SysTick_Config 函数进行初始化即可。
/** \brief System Tick ConfigurationThis function initialises the system tick timer and its interrupt and start the system tick timer.Counter is in free running mode to generate periodical interrupts.\param [in] ticks Number of ticks between two interrupts\return 0 Function succeeded\return 1 Function failed*/static __INLINE uint32_t SysTick_Config(uint32_t ticks){if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */NVIC_SetPriority (SysTick_IRQn, (1 << __NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */SysTick->VAL = 0; /* 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 (0); /* Function successful */}
SysTick_Config(uint32_t ticks)函数通过参数ticks设置中断间隔,如果要设置1ms的中断间隔,则ticks = 系统时钟/1000. 设置Systick中断服务函数默认优先级最低,可以通过如下函数修改中断优先级。
// //优先级配置 抢占优先级1 子优先级2 越小优先级越高 抢占优先级可打断别的中断NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),1,2));
初始化完成后,systick在设置的中断间隔到来时触发中断,进入中断服务函数
/*** @brief systick中断服务函数** @param ** @return ** @note ** @example ** @date 2019/6/10 星期一*/
void SysTick_Handler(void)
{}
完整代码 bsp_systick.h
#ifndef __BSP_SYSTICK_H
#define __BSP_SYSTICK_H
#include "stdint.h"/** * @brief 一个系统时间结构体*/
typedef struct
{ void (* init) (void); uint32_t (* get_time_us) (void);uint32_t (* get_time_ms) (void);void (* delay_us)(uint32_t);void (* delay_ms)(uint32_t);
}systime_t;/** 声明 systime */
extern systime_t systime;#endif //__BSP_SYSTICK_H
bsp_systick.c
/*!* @file bsp_systick.c** @brief systick驱动文件** @author 不咸不要钱** @note 无** @version 无** @date 2019/10/18 星期五*/
#include "bsp_systick.h"#define EACH_PER_MS 25 /*!<每隔 25 ms 中断一次 systick 定时器是24位向下计数的定时器 最大装载值16777215 */ /** * @brief 一个时间结构体* @note 内部调用*/
struct time{uint32_t fac_us; /*!<us分频系数 */uint32_t fac_ms; /*!<ms分频系数 */volatile uint32_t millisecond; /*!<当前ms值 */uint8_t ms_per_tick; /*!<每隔多少ms中断一次 */}timer;/*!* @brief systime 初始化** @param 无** @return 无** @note 默认优先级最低 可以修改** @see systime.init(); //初始化 ** @date 2019/6/10 星期一*/
void systime_init(void)
{timer.fac_us = SystemCoreClock / 1000000;timer.fac_ms = SystemCoreClock / 1000;timer.ms_per_tick = EACH_PER_MS;timer.millisecond = 100;SysTick_Config((SystemCoreClock / 1000) * timer.ms_per_tick ); //开启systick中断// //优先级配置 抢占优先级1 子优先级2 越小优先级越高 抢占优先级可打断别的中断
// NVIC_SetPriority(SysTick_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),1,0));
}/*!* @brief systime 中断服务函数** @param 无** @return 无** @note 无** @see 无** @date 2019/6/10 星期一*/
void SysTick_Handler(void)
{timer.millisecond += timer.ms_per_tick;
}/*!* @brief 获取当前时间** @param 无** @return 当前ms值** @note 无** @see system.get_time_ms(); //获取当前ms值 ** @date 2019/6/10 星期一*/
uint32_t systime_get_current_time_ms(void)
{register uint32_t val, ms;do{ms = timer.millisecond;val = SysTick->VAL; }while(ms != timer.millisecond);return ms - val/timer.fac_ms;
}/*!* @brief 获取当前时间** @param 无** @return 当前us值** @note 无** @see system.get_time_us(); //获取当前ms值 ** @date 2019/6/10 星期一*/
uint32_t systime_get_current_time_us(void)
{register uint32_t val, ms;do{ms = timer.millisecond;val = SysTick->VAL;}while(ms != timer.millisecond);return (uint32_t)((uint32_t)(ms * 1000) - val / timer.fac_us);
}/*!* @brief systime 延时函数** @param us :延时时间** @return 无** @note 最大延时不要超过 4292s** @see system.delay_us(1000); //延时1ms** @date 2019/6/10 星期一*/
void systime_delay_us(uint32_t us)
{uint32_t now = systime.get_time_us();uint32_t end_time = now + us - 3;while( systime.get_time_us() <= end_time){;}
}/*!* @brief 延时函数** @param ms : 延时时间** @return 无** @note 无 ** @see system.delay_ms(1000); //延时1s ** @date 2019/6/10 星期一*/
void systime_delay_ms(uint32_t ms)
{while(ms--){systime.delay_us(1000);}}/** 创建一个systck实例 */
systime_t systime =
{systime_init,systime_get_current_time_us,systime_get_current_time_ms,systime_delay_us,systime_delay_ms
};
systick定时器 延时计时相关推荐
- STM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)
STM32延时函数的三种方法:普通延时.SysTick 定时器延时(1.中断方式:2.非中断方式) 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ ...
- STM32的系统嘀嗒定时器(SysTick)实现简单计时功能
SysTick是属于内核里的外设,只要是Cortex M内核的单片机,都拥有这个24位的SysTick定时器. SysTick的counter是一个递减计数器,首先要填入reload自动重装载计数器的 ...
- SysTick定时器的一个简单应用
SysTick即为系统定时器,又称嘀嗒定时器,是Cortex-M3内核的一个外设,集成在NVIC中.SysTick是一个24bit的向下递减的计数器,每计数一次的时间为1/SYSCLK(SYSCLK一 ...
- 4、SysTick定时器的理解
参考文档<Cortex-M3权威指南(中文).pdf> 什么是systick? 手册解释: RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟. ...
- STM32的SysTick定时器记录一篇
CSDN博客主页 ID : Eterlove 一笔一画,记录我的学习生活!站在巨人的肩上Standing on Shoulders of Giants! 该文章为原创,转载请注明出处和作者! 前言 我 ...
- 系统滴答及Systick定时器
1. 概述 操作系统需要有一个系统的滴答来提供任务管理的时间依据,bcos中的任务延时及tasklet的定时都是依据系统滴答.系统滴答需要一个定时器来提供时间基准,几乎所有的CPU都会提供一个滴答定时 ...
- 【STM32】SysTick定时器
00. 目录 文章目录 00. 目录 01. SysTick定时器概述 02. SysTick定时器寄存器描述 03. 相关函数实现 04. 延时函数实现 05. 应用示例 06. 附录 07. 声明 ...
- 单片机定时器精准定时_PIC单片机的定时器精准计时的计算
关于PIC单片机的定时器精准计时的计算 在此用了16C711单片机的TMR0做定时中断,希望实现精准计时,在程序中,TMR0用了晶振的32分频,初值#0FCH,因此POPBEAR兄弟计算出每个定时中断 ...
- STM32超声波模块测距串口输出/通用定时器中断并输出PWM控制舵机/系统定时器延时
参考:stm32 超声波模块 原理 实现测距 +舵机使用 作者:点灯小哥 发布时间: 2021-03-10 19:37:16 网址:https://blog.csdn.net/weixin_46016 ...
最新文章
- Slackware中文帮助文档(前言)
- MATLAB实现牛顿插值的源程序
- 使用绘图API自定义组件
- 从 301 跳转,聊聊边缘规则的那些小妙用
- Android方法的概括,android中的Filter接口简介
- Linux学习 - awk使用
- 2017.10.7 弹飞绵羊 思考记录
- mysql的%rowtype_Oracle %TYPE 和 %ROWTYPE 使用
- 【体系结构】Oracle如何保证提交的数据不丢失
- 百度坐标转换GPS坐标
- 使用fastcgi_cache加速你的Nginx网站
- x1c更改语言系统后开机超慢,大明:电脑重装系统后一个月变慢?简单五步设置,解决卡慢问题...
- 2022.4.7网页一直在加载中,无提示
- 计算机boot进入u盘启动,深度u盘装系统进入boot设置教程
- WPS国际版添加中文包
- 公有云迁移,需要考虑的问题
- 选择婚庆公司的注意事项
- nodejs addon
- 杭电一学生还没毕业年薪已过百万,带十几人的研发团队
- 姑娘们 你们够漂亮 但是一定还不够美丽