美文网首页
STM32 +Free RTOS+LED闪烁

STM32 +Free RTOS+LED闪烁

作者: QUIZ_JS | 来源:发表于2018-10-18 09:25 被阅读0次

    移植Free RTOS

    由于Cubemx,在STM32中移植Free RTOS变的异常简单。只需要勾选一下,开发工具将移植的工作全部搞定。如图所示:



    由于后面时钟存在冲突需要对时钟修改,如下图所示:



    同时修改了时钟配置,如下图所示:

    然后再添加两个GPIO用于点亮LED,这里不再详述。
    在Free RTOS中添加任务列表。



    然后可以生成MDK V5下的代码。

    代码分析

    Free RTOS 任务相关的代码会自动生成如下:

    创建句柄:

    osThreadId LED1Handle;
    osThreadId LED2Handle;
    

    创建任务函数:

    void StartLED1Task(void const * argument);
    void StartLED2Task(void const * argument);
    

    main函数中创建线程:

    int main(void)
    {
    
      /* MCU Configuration----------------------------------------------------------*/
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
      /* Configure the system clock */
      SystemClock_Config();
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_SPI2_Init();
      MX_USART2_UART_Init();
    
      /* Create the thread(s) */
      /* definition and creation of LED1 */
      osThreadDef(LED1, StartLED1Task, osPriorityNormal, 0, 128);
      LED1Handle = osThreadCreate(osThread(LED1), NULL);
    
      /* definition and creation of LED2 */
      osThreadDef(LED2, StartLED2Task, osPriorityIdle, 0, 128);
      LED2Handle = osThreadCreate(osThread(LED2), NULL);
    
      /* Start scheduler */
      osKernelStart();
      
      /* We should never get here as control is now taken by the scheduler */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
    
    }
    

    创建自己的任务函数:

    /* StartLED1Task function */
    void StartLED1Task(void const * argument)
    {
    
      /* USER CODE BEGIN 5 */
      /* Infinite loop */
      for(;;)
      {
            HAL_GPIO_WritePin(GPIOB, LED0_Pin, 0);
        osDelay(1000);
            HAL_GPIO_WritePin(GPIOB, LED0_Pin, 1);
            osDelay(1000);
      }
      /* USER CODE END 5 */ 
    }
    
    /* StartLED2Task function */
    void StartLED2Task(void const * argument)
    {
      /* USER CODE BEGIN StartLED2Task */
      /* Infinite loop */
      for(;;)
      {
            HAL_GPIO_WritePin(GPIOB, LED1_Pin, 0);
        osDelay(100);
            HAL_GPIO_WritePin(GPIOB, LED1_Pin, 1);
            osDelay(100);
      }
      /* USER CODE END StartLED2Task */
    }
    

    最终能够实现LED灯的交替显示。
    调试中的问题:

    1、关于创建任务函数xTaskCreate()和osThreadDef()的区别:
    xTaskCreate()是FreeRTOS的原始API函数。
    osThreadDef()ARM搞的CMIS-RTOS V1封装层,对FreeRTOS的API函数进行封装。

    相关文章

      网友评论

          本文标题:STM32 +Free RTOS+LED闪烁

          本文链接:https://www.haomeiwen.com/subject/zifjzftx.html