STM32定时器实现毫秒/秒级任务框架
- CubeMX配置
- 代码分享
- 总结
这是一期代码思路分,通过定时器(以定时器10为例)实现规定时间间隔执行指定任务。。。。。。
CubeMX配置
- 关于定时器的配置,这里不做介绍,不懂的可以看:夜深人静学32系列14——基本定时器
代码分享
- main.c
void Proc2msTask(void) //2ms任务
{if(Get_2ms_Flag() == 1) //获取2ms标志位{Clear_2ms_Flag(); //清除2ms标志位//2mstask code}
}void Proc1sTask(void) //1s任务
{if(Get_1s_Flag() == 1) //获取1s标志位{Clear_1s_Flag(); //清除1s标志位//1stask code}
}
/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM10_Init();/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim10);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){Proc2msTask(); //调用2ms任务Proc1sTask(); //调用1s任务/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
- Tim.c
static uint16_t Tim10_Count=0;
static uint8_t Tim10_2msFlag=0;
static uint8_t Tim10_1sFlag=0;uint8_t Get_2ms_Flag(void) //获取2ms标志位
{return Tim10_2msFlag;
}uint8_t Get_1s_Flag(void) //获取1s标志位
{return Tim10_1sFlag;
}void Clear_2ms_Flag(void) //清除2ms标志位
{Tim10_2msFlag = 0;
}void Clear_1s_Flag(void) //清除1s标志位
{Tim10_1sFlag = 0;
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* tim_baseHandle) // 定时器溢出中断函数
{Tim10_Count++;if(tim_baseHandle->Instance == TIM10) //判断是否为定时器10中断{HAL_TIM_Base_Start_IT(&htim10); //开启定时器中断if(Tim10_Count%2==0) //判断是否到达2ms{Tim10_2msFlag = 1; } //判断是否到达1sif(Tim10_Count == 1000){Tim10_1sFlag = 1;Tim10_Count = 0;}}}
获取/清除标志位函数需要在对应的.h文件里面声明,这里不展示了
总结
- 这样的代码框架,可以简化代码的复杂性,可读性大大增加
- 同时也更好的整理的代码思路,很不错。。。。。
- 这样子的实现方式,有点像操作系统里面的线程,指定时间执行某一任务,虽然我也不是很懂操作系统。。。