当前位置: 首页 > news >正文

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

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

各周期定时回调函数

根据需求设计各不同周期定时函数,可选择几个常用周期,需要按周期运行的程序单独编写回调函数并在对应函数中调用。
其它周期或超过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.hskmm.com/?act=detail&tid=30840

相关文章:

  • 低代码平台底层协议设计
  • 基于海思Hi3798MV200 Android7.0达成电影播放蓝光导航功能
  • Vue 低代码平台渲染引擎设计
  • 2025 年热处理钎焊炉工装夹具厂家推荐榜:钎焊炉用耐热钢工装夹具厂家,聚焦品质与适配,助力企业高效生产
  • 实用指南:基于Spring Boot与SSM的社团管理系统架构设计
  • 请求超时重试封装
  • Emacs常用的一些快捷键,记不住的,方便查询!!
  • Microsoft Visual C++,Microsoft Visual Studio for Office Runtime,Microsoft Visual Basic Runtime等下载
  • 2025 年耐热钢厂家及热处理工装设备厂家推荐榜:多用炉/真空炉/台车炉/井式炉/箱式炉/耐热钢工装厂家,聚焦高效适配,助力企业精准选型
  • 实用指南:如何进行WGBS的数据挖掘——从甲基化水平到功能通路
  • python对接印度尼西亚股票数据接口文档
  • Webpack优化
  • 2025年舒适轮胎厂家最新权威推荐榜:静音耐磨,驾驶体验全面升级!
  • 2025年耐磨轮胎厂家最新推荐排行榜,矿山耐磨轮胎,工程耐磨轮胎,重载耐磨轮胎公司推荐!
  • Map做数据缓存
  • Python基于 Gradio 和 SQLite 开发的简单博客管理平台,承受局域网手机查看,给一个PC和手机 互联方式
  • RK3576+gc05a2
  • 2025 年工业表面处理领域喷砂机厂家最新推荐排行榜,涵盖智能自动化可移动等类型设备优质厂家
  • 2025.10.14
  • 行列式按多行或列展开
  • 2025 年化妆品代工厂最新推荐排行榜:OEM/ODM/ 私人定制等服务优选企业指南
  • SCANIA中国EDI对接供应商指南:快速完成上线的最佳方案
  • 2025 年模板厂家最新推荐榜单:覆盖塑钢 / 水沟 / 现浇 / 拱形骨架等多类型,精选优质厂家助力工程高效采购
  • RequestldleCallback
  • 前端开发调试实战指南,从浏览器到 WebView 的全链路问题排查思路
  • 基于EKF/UKF的非线性飞行器系统滤波实现
  • go-基于 Prometheus 的全方位食用手册 - fox
  • 实验任务2 - pp
  • 插入公式总是有个框框
  • picard标记DI/DS标签