单片机使用同一硬件定时器实现多周期定时功能

news/2025/10/14 12:44:11/文章来源:https://www.cnblogs.com/loganxiang/p/19140312

一个复杂的单片机程序可能需要很多种周期不同的定时器,用于执行不同的任务,如传感器数据采集、显示设备刷新或者执行设备的驱动等。如果每种周期使用一个单片机的硬件定时器将很难实现全部的功能需求,本文记录一种简单的使用一个硬件定时器实现不同周期定时功能的方法。

各周期定时回调函数

根据需求设计各不同周期定时函数,可选择几个常用周期,需要按周期运行的程序单独编写回调函数并在对应函数中调用。
其它周期或超过1s的定时器用户程序在这些基础上自行实现,参考下文LED闪烁例程。

void Systick1ms(void){// TODO: 在此处添加用户代码
}
void Systick10ms(void){// TODO: 在此处添加用户代码
}
void Systick50ms(void){// TODO: 在此处添加用户代码
}
void Systick100ms(void){// TODO: 在此处添加用户代码
}
void Systick200ms(void){// TODO: 在此处添加用户代码
}
void Systick500ms(void){// TODO: 在此处添加用户代码
}
void Systick1s(void){// TODO: 在此处添加用户代码
}

硬件定时器配置

硬件定时器初始化,周期配置为1ms。

void SystickInit(void){TIM_InitTypeDef timer;timer.TIM_Mode = TIM_16BitAutoReload;timer.TIM_ClkSource = TIM_CLOCK_1T;timer.TIM_ClkOut = DISABLE;timer.TIM_Value = (uint16)(65536UL - (MAIN_Fosc / 1000UL));timer.TIM_Run = ENABLE;Timer_Inilize(Timer0,&timer);NVIC_Timer0_Init(ENABLE,Priority_4);
}

基础回调函数及调用

在基础回调函数中设置循环计数,按定时设定调用不同的周期定时函数。

void TimerCallbackSystick(void){static uint8 i = 0;if(++i > 1000){i = 0;Systick1ms();Systick500ms();Systick1s();}if(i % 10 == 0)Systick10ms();if(i % 50 == 0)Systick10ms();if(i % 100 == 0)Systick10ms();if(i % 200 == 0)Systick10ms();if(i == 500)Systick500ms();
}

在硬件定时器中断服务程序中调用基础回调函数:

#include	"STC8G_H_Timer.h"
#include	"../systick.h"//========================================================================
// 函数: Timer0_ISR_Handler
// 描述: Timer0中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR		//进中断时已经清除标志
{TimerCallbackSystick();
}

例程及下载

以LED闪烁为例,要求LED闪烁时点亮200ms然后熄灭800ms/1800ms/4800ms,可以编写在100ms定时函数中调用的回调函数:

#include "led.h"uint8 LEDMode;
uint8 LEDFlashCycle;void LEDSetMode(uint8 mode){LEDMode = mode;switch(mode){case(LED_MODE_OFF):LED = FALSE;break;case(LED_MODE_ON):LED = TRUE;break;case(LED_MODE_FLASH_1S):LEDFlashCycle = 10;break;case(LED_MODE_FLASH_2S):LEDFlashCycle = 20;break;case(LED_MODE_FLASH_5S):LEDFlashCycle = 10;break;default:break;}
}void SystickCallbackLED(void){static uint8 i = 0;if(LEDMode & 0x02){if(++i > 2)LED = FALSE;if(i > LEDFlashCycle){i = 0;LED = TRUE;}}
}
  • 本文采用的单片机为STC8H系列,感兴趣的朋友可以参考测试,或去Gitee上下载例程。
  • 下载地址:https://gitee.com/loganxiang/LgxDemo,参考Systick.h/Systick.c。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(二十六)、Kuboard 部署网络问题 k8s 使用本地镜像 k8s使用 register本地镜像站 综合应用 - 实践

(二十六)、Kuboard 部署网络问题 &k8s 使用本地镜像 & k8s使用 register本地镜像站 综合应用 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…

低代码平台底层协议设计

低代码平台底层协议设计 1. 核心协议架构 1.1 协议分层设计 // 低代码平台协议栈 interface LowCodeProtocolStack {// 1. 传输层协议transport: TransportProtocol;// 2. 数据描述协议schema: SchemaProtocol;// 3. 组…

从PHP到Spring Boot:思维的转变与入门实战 (指南二) - 教程

从PHP到Spring Boot:思维的转变与入门实战 (指南二) - 教程2025-10-14 12:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

Vue 低代码平台渲染引擎设计

Vue 低代码平台渲染引擎设计 1. 核心架构设计 1.1 整体架构 // 渲染引擎核心接口定义 interface RenderEngine {schema: PageSchema; // 页面Schemacomponents: ComponentMap; // 组件映射dataSource: D…

微前端架构:实战指南与未来趋势 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于海思Hi3798MV200 Android7.0达成电影播放蓝光导航功能

基于海思Hi3798MV200 Android7.0达成电影播放蓝光导航功能pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

2025 年热处理钎焊炉工装夹具厂家推荐榜:钎焊炉用耐热钢工装夹具厂家,聚焦品质与适配,助力企业高效生产

随着制造业对热处理工艺精度要求的不断提升、设备耐用性需求增强及生产标准化推进,热处理钎焊炉工装夹具已从高端冶金、核工业领域逐步拓展至石油、化工、电力、矿山等多个行业,2025 年市场规模预计持续增长。但市场…

实用指南:基于Spring Boot与SSM的社团管理系统架构设计

实用指南:基于Spring Boot与SSM的社团管理系统架构设计pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

请求超时重试封装

请求超时重试封装 1. 基础版本 - 带指数退避的重试机制 interface RetryConfig {maxRetries?: number; // 最大重试次数baseDelay?: number; // 基础延迟时间(ms)timeout?: number; …

完整教程:数据结构 01 线性表

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

编程脉络梳理

编程脉络梳理编程脉络梳理 Java基础 源码和原理ThreadLocal 内存溢出问题 和 java引用类型定时任务Timer的原理和使用hashMap扩容和转红黑树条件Serializable接口 和 serialVersionUID 的关系指针压缩原理和为什么指针…

Emacs常用的一些快捷键,记不住的,方便查询!!

emacs 快捷键 基本快捷键(Basic) C-x C-f "find"文件, 即在缓冲区打开/新建一个文件 C-x C-s 保存文件 C-x C-w 使用其他文件名另存为文件 C-x C-v 关闭当前缓冲区文件并打开新文件 C-x i 在当前光标处插入文…

Microsoft Visual C++,Microsoft Visual Studio for Office Runtime,Microsoft Visual Basic Runtime等下载

Visual C++ 运行库合集(VCRedistPack),“缺少运行库”报错等问题修复 这个没什么好说的,就是解决常见的Visual C++ 运行库问题,一搬安装软件,比如PS,CAD等,也有因为安装游戏时出现的一些未知错误,“缺少运行库…

2025 年耐热钢厂家及热处理工装设备厂家推荐榜:多用炉/真空炉/台车炉/井式炉/箱式炉/耐热钢工装厂家,聚焦高效适配,助力企业精准选型

随着工业制造向高端化、精密化升级,热处理、冶金、石化等行业对耐热钢材料及专用工装设备的性能要求持续提升,兼具耐高温、耐腐蚀、高强度特性的耐热钢产品,已成为保障生产稳定性、提升工艺水平的核心要素。2025 年…

实用指南:如何进行WGBS的数据挖掘——从甲基化水平到功能通路

实用指南:如何进行WGBS的数据挖掘——从甲基化水平到功能通路pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

python对接印度尼西亚股票数据接口文档

概述 StockTV 提供全面的印度尼西亚股票市场数据接口,覆盖印尼证券交易所(IDX)所有上市公司。支持实时行情、技术分析、公司信息等多种功能。 交易所信息交易所: 印尼证券交易所 (Indonesia Stock Exchange, IDX) 国…

实用指南:Python学习历程——基础语法(print打印、变量、运算)

实用指南:Python学习历程——基础语法(print打印、变量、运算)2025-10-14 11:59 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !im…

2025年舒适轮胎厂家最新权威推荐榜:静音耐磨,驾驶体验全面升级!

2025年舒适轮胎厂家最新权威推荐榜:静音耐磨,驾驶体验全面升级!随着汽车行业的快速发展,消费者对驾驶体验的要求越来越高。舒适轮胎作为提升驾驶体验的关键因素之一,其市场需求也日益增长。为了帮助筛选舒适轮胎品…

2025年耐磨轮胎厂家最新推荐排行榜,矿山耐磨轮胎,工程耐磨轮胎,重载耐磨轮胎公司推荐!

2025年耐磨轮胎厂家最新推荐排行榜,矿山耐磨轮胎,工程耐磨轮胎,重载耐磨轮胎公司推荐!随着工业和矿业的快速发展,对耐磨轮胎的需求日益增长。耐磨轮胎在矿山、工程和重载运输等领域的应用越来越广泛,其性能直接影…

Map做数据缓存

Map 的好处:键可以是任意类型(包括对象)保持插入顺序查找性能优于普通对象(尤其是大量键时)// 创建缓存 const cache = new Map();// 存入数据 cache.set(user_1, { name: Alice, age: 25 });// 读取数据 if (cac…