当前位置: 首页 > 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.gsyq.cn/news/20799.html

相关文章:

  • (二十六)、Kuboard 部署网络问题 k8s 使用本地镜像 k8s使用 register本地镜像站 综合应用 - 实践
  • 从PHP到Spring Boot:思维的转变与入门实战 (指南二) - 教程
  • 微前端架构:实战指南与未来趋势 - 详解
  • Microsoft Visual C++,Microsoft Visual Studio for Office Runtime,Microsoft Visual Basic Runtime等下载
  • 实用指南:如何进行WGBS的数据挖掘——从甲基化水平到功能通路
  • python对接印度尼西亚股票数据接口文档
  • 实用指南:Python学习历程——基础语法(print打印、变量、运算)
  • Map做数据缓存
  • Python基于 Gradio 和 SQLite 开发的简单博客管理平台,承受局域网手机查看,给一个PC和手机 互联方式
  • 2025 年工业表面处理领域喷砂机厂家最新推荐排行榜,涵盖智能自动化可移动等类型设备优质厂家
  • 2025 年化妆品代工厂最新推荐排行榜:OEM/ODM/ 私人定制等服务优选企业指南
  • go-基于 Prometheus 的全方位食用手册 - fox
  • picard标记DI/DS标签
  • 2025 年南昌装修公司推荐南昌市宿然装饰工程有限公司,以专业与真诚雕琢理想空间南昌装修设计推荐指南!
  • 2025 年国内模切加工源头厂家最新推荐排行榜:聚焦 0.1mm 精度与高产能标杆,为下游企业精选优质合作商电子辅料/硅胶/薄膜/胶黏/绝缘模切加工厂家推荐
  • 直播协议详解 RTMP、HLS、HTTP-FLV、WebRTC、RTSP 的区别
  • 2025 年水下打捞公司服务推荐榜:水下打捞手机/水下打捞黄金/水下打捞戒指/水下打捞沉船/水下打捞转头,聚焦专业与高效,助力解决各类水下应急需求
  • 【光照】UnityURP渲染中的HDR
  • 在jupyter notebook中使用自己创建的conda虚拟环境的Python内核
  • Flutter顶部状态栏显示,安全区设置等,防止各种异性屏挡住应用操作栏
  • 实用指南:JavaWeb-Ajax、监听器、过滤器及对应案例和jstl补充
  • 从孔子到马斯克:理解原理与问对问题的智慧史
  • 2025 年电感源头厂家最新推荐排行榜:聚焦功率一体成型屏蔽共模等系列,助力企业精准选优质制造商屏蔽/共模/贴片共模/磁环/磁胶SWPA电感厂家推荐
  • 工业流体输送 “心” 选择!2025 螺杆泵、隔膜泵、磁力泵、自吸泵、计量泵五大靠谱厂家推荐 —— 从研发实力到售后保障的全方位筛选
  • 如何用有限元法,分析物体表面的张力?
  • 2025 年最新切割机厂家口碑推荐排行榜:全包围 / 半包围激光切割机及金属等离子切割机优选企业指南
  • 第1章:初识 Coze 优秀的平台
  • 2025 年国内变压器优质厂家最新推荐排行榜:聚焦低压/单相/三相/特种/定制/非标/配电/节能/光伏/隔离变压器设备,助力用户精准选靠谱品牌
  • 国产项目管理工具突围战:Gitee如何成为本土开发者的效率引擎
  • 基于Saleh模型的功率放大器参数辨识与曲线拟合