# 单片机软件定时器 **Repository Path**: chenruidian/mcu-software-timer ## Basic Information - **Project Name**: 单片机软件定时器 - **Description**: 软件定时器。适合于嵌入式裸机程序中使用的软件定时器,可以有效的解决STM32、51类单片机硬件定时器不足的问题。 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2021-11-26 - **Last Updated**: 2021-11-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 单片机软件定时器 #### 介绍 本软件定时器实现了一个向下计数自动重装载的定时器。时基通过一个硬件定时器确定。不含有任何与底层MCU相关代码,可以移植到任何嵌入式平台。定时器回调函数的运行可以在中断中,或者在主函数while循环中执行。可以使用提供的各种API函数,来修改定时器的计数值、重装载值,运行次数。可以开启或关闭单个软件定时器。 #### 使用说明 1. 需要确定时基,一般由一个硬件定时器提供,将SoftwareTimer_Tick()函数放入定时器中断服务函数下。 ``` //stm32平台1ms定时器生成1s的时基的中断服务函数 void TIM1_UP_IRQHandler(void) { static uint16_t TimesCounter_ms = 0; if (TIM_GetITStatus(TIM1, TIM_IT_Update)) { TimesCounter_ms++; TIM_ClearITPendingBit(TIM1, TIM_IT_Update); if (TimesCounter_ms >= 1000) { TimesCounter_ms = 0; SoftwareTimer_Tick(); } } } ``` 2. 使用SoftwareTimer_Init()函数初始化一个软件定时器。 ``` //这里初始化了两个软件定时器,重装载2,计数值分别为0,1,循环无限次 //可以实现SW1_callback、SW2_callback两个回调函数前后依次运行 SoftwareTimer_Init(0, 0, 2, SW1_callback, FOREVER); SoftwareTimer_Init(1, 1, 2, SW2_callback, FOREVER); ``` 3. 将SoftwareTimer_Loop()函数放到想要回调函数运行的位置 ``` //这里把SoftwareTimer_Loop放到了主函数while循环中,回调函数会在这里被调用。 int main(void) { while(1) { SoftwareTimer_Loop(); } } ```