欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32单片机利用软件定时器实现分时多任务(使用HAL库编写)

程序员文章站 2022-06-08 20:56:11
...

概述

      很多时候,应用场景,是需要分时处理各个事件。本文章就编写点亮LED与打印输出的示例来讲解使用方法。在这直接进入正题。(在此不做创建项目的步骤介绍)

1、STM32CubeIDE 配置

  1. LED管脚配置

    STM32单片机利用软件定时器实现分时多任务(使用HAL库编写)
  2. 串口1配置(也就是debug串口)

    STM32单片机利用软件定时器实现分时多任务(使用HAL库编写)

2、代码

  1. usart.c文件
    /* USER CODE BEGIN 0 */
    #include "stdio.h"
    
    /* USER CODE END 0 */
    .
    .
    .
    
    /* USER CODE BEGIN 1 */
    #ifdef __GNUC__
    
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    
    PUTCHAR_PROTOTYPE
    {
      // 注意下面第一个参数是&huart1,因为cubemx配置了串口1自动生成的
      HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
      return ch;
    }
    #endif
    /* USER CODE END 1 */

     

  2. 创建software_Time.c文件
    /*
     * software_Time.c
     *
     *  Created on: 2020年4月10日
     *      Author: champion
     */
    #include "stm32l0xx.h"
    #include "software_Time.h"
    
    void SetTime(TIME_TYPE_ST *TimeType,uint32_t TimeInter)
    {
        TimeType->TimeStart = HAL_GetTick();//获取起始时间
        TimeType->TimeInter = TimeInter;//获取间隔时间
    }
    
    uint32_t CompareTime(TIME_TYPE_ST *TimeType)//每隔1毫秒,计数器就会增加1
    {
        return ((HAL_GetTick()-TimeType->TimeStart) >= TimeType->TimeInter);
    }
    
    

     

  3. 创建software_Time.h文件
    /*
     * software_Time.h
     *
     *  Created on: 2020年4月10日
     *      Author: champion
     */
    
    #ifndef INC_SOFTWARE_TIME_H_
    #define INC_SOFTWARE_TIME_H_
    
    #include "stdint.h"
    
    
    typedef struct
    {
        uint32_t TimeStart;//获取起始时间
        uint32_t TimeInter;//间隔时间
    }TIME_TYPE_ST;
    
    void SetTime(TIME_TYPE_ST *TimeType,uint32_t TimeInter);//打开超时定时器
    uint32_t CompareTime(TIME_TYPE_ST *TimeType);//比较函数
    
    #endif /* INC_SOFTWARE_TIME_H_ */

     

  4. main.c文件
    /* USER CODE END Header */
    
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
    #include "usart.h"
    #include "gpio.h"
    
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    #include "stdio.h"
    #include "software_Time.h"
    
    /* USER CODE END Includes */
    
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
    
    /* USER CODE END PTD */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    /* USER CODE END PD */
    
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
    
    /* USER CODE END PM */
    
    /* Private variables ---------------------------------------------------------*/
    
    /* USER CODE BEGIN PV */
    static TIME_TYPE_ST TimeLED;
    static TIME_TYPE_ST TimePrint_1;
    static TIME_TYPE_ST TimePrint_2;
    
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    /* USER CODE BEGIN PFP */
    
    /* 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_LPUART1_UART_Init();
      MX_USART1_UART_Init();
      /* USER CODE BEGIN 2 */
      
    
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
    	  if(CompareTime(&TimeLED))
    	  {
    		 SetTime(&TimeLED, 500);	//500ms
    		 HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
    	  }
    
    	  if(CompareTime(&TimePrint_1))
    	  {
    		 SetTime(&TimePrint_1, 1000);	//1s打印
    		 printf("TimePrint_1s \r\n");
    	  }
    
    	  if(CompareTime(&TimePrint_2))
    	  {
    		 SetTime(&TimePrint_2, 2000);	//2s打印
    		 printf("TimePrint_2s \r\n");
    	  }
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    

     

  5. 运行效果

    STM32单片机利用软件定时器实现分时多任务(使用HAL库编写)

    总结:通过结果可以看出,是可以模拟出多任务处理的机制,其实也就是时间片轮法形式的多线程任务。

 

相关标签: 单片机开发