96 lines
1.8 KiB
C
96 lines
1.8 KiB
C
#include "timer.h"
|
||
#include "tim.h"
|
||
|
||
extern TIM_HandleTypeDef htim3;
|
||
static int g_timer_working = 0;
|
||
|
||
static timeout_func g_timeout_func = NULL;
|
||
static u_int32_t g_timeout_param = 0;
|
||
|
||
|
||
/**
|
||
* @brief 设置定时器
|
||
* @param timeout_ms 设置超时时间
|
||
* @param func
|
||
*/
|
||
void set_timeout(u_int32_t timeout_ms, timeout_func func, u_int32_t param)
|
||
{
|
||
stop_timout();
|
||
|
||
if(timeout_ms){
|
||
g_timeout_func = func;
|
||
g_timeout_param = param;
|
||
|
||
// 重装周期
|
||
__HAL_TIM_SET_AUTORELOAD(&htim3, timeout_ms);
|
||
|
||
start_timout();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 延时指定的毫秒数
|
||
* @param param
|
||
*/
|
||
void flag_timeout_callback(u_int32_t param)
|
||
{
|
||
*((u_int32_t *)param) = 1;
|
||
}
|
||
|
||
/**
|
||
* @brief 本函数使用定时器,在定时器超时时,将flag_addr中的内容置为1,用于简单的超时标志
|
||
* @param timeout_ms
|
||
* @param flag_addr
|
||
*/
|
||
void set_flag_timeout(u_int32_t timeout_ms, u_int32_t *flag_addr)
|
||
{
|
||
set_timeout(timeout_ms, flag_timeout_callback, (u_int32_t)flag_addr);
|
||
}
|
||
|
||
/**
|
||
* @brief 停止定时器,等效于set_timeout(0,NULL,0)
|
||
*/
|
||
void stop_timout()
|
||
{
|
||
if(g_timer_working){
|
||
HAL_TIM_Base_Stop_IT(&htim3); //停止定时器
|
||
g_timer_working = 0;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 启动定时器
|
||
*/
|
||
void start_timout()
|
||
{
|
||
if(!g_timer_working){
|
||
HAL_TIM_Base_Start_IT(&htim3); //停止定时器
|
||
g_timer_working = 1;
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 延时指定的毫秒数
|
||
* @param time_ms
|
||
*/
|
||
void delay_ms(u_int32_t time_ms)
|
||
{
|
||
u_int32_t timeout_flag = 0;
|
||
|
||
set_flag_timeout(time_ms, &timeout_flag);
|
||
while(!timeout_flag);
|
||
}
|
||
|
||
/**
|
||
* @brief 定制器中断回调函数
|
||
* @brief htim
|
||
*/
|
||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
||
{
|
||
if(htim->Instance == TIM3){
|
||
if(g_timeout_func){
|
||
(*g_timeout_func)(g_timeout_param);
|
||
}
|
||
}
|
||
} |