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;
} //判断是否到达1s
if(Tim10_Count == 1000)
{
Tim10_1sFlag = 1;
Tim10_Count = 0;
}
}
}
获取/清除标志位函数需要在对应的.h文件里面声明,这里不展示了
总结
- 这样的代码框架,可以简化代码的复杂性,可读性大大增加
- 同时也更好的整理的代码思路,很不错。。。。。
- 这样子的实现方式,有点像操作系统里面的线程,指定时间执行某一任务,虽然我也不是很懂操作系统。。。