Giỏ hàng
Danh mục sản phẩm

Lập trình RTOS STM32

Đăng bởi Buiprohd@gmail.com ngày bình luận

Hôm nay mình giới thiệu RTOS Cho STM32F4 dùng thư viện tiêu chuẩn

Đầu tiên các bạn tải thư viện https://www.freertos.org/

Các bạn copy thư viện đến thư mục và đường dẫn đến keil 

Sau đó add vào project như sau :

Sau đó add thêm thư viện hàm main.c

Chương trình với F103

#include "FreeRTOS.h"
#include "task.h"

Thêm 2 thư viện để gọi hàm RTOS

Bắt đầu với RTOS

include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"

#include "FreeRTOS/include/FreeRTOS.h"
#include "FreeRTOS/include/task.h"

void ledInit(void);
// RTOS task
void vTaskLedRed(void *p);
void vTaskLedYellow(void *p);
void vTaskLedGreen(void *p);

int main(void)
{
    // Configure GPIO for LED
    ledInit();

    // Create LED blink task
    xTaskCreate(vTaskLedRed, (const char*) "Red LED Blink", 
        128, NULL, 1, NULL);
    xTaskCreate(vTaskLedYellow, (const char*) "Yellow LED Blink",
        128, NULL, 1, NULL);
    xTaskCreate(vTaskLedGreen, (const char*) "Green LED Blink",
        128, NULL, 1, NULL);
    // Start RTOS scheduler
    vTaskStartScheduler();

    return 0;
}

void ledInit()
{
    GPIO_InitTypeDef GPIO_InitStruct;

    // Configure PC13, PC14, PC15 as push-pull output
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOC, &GPIO_InitStruct);
}

void vTaskLedRed(void *p)
{
    for (;;)
    {
        GPIOC->ODR ^= GPIO_Pin_14;
        vTaskDelay(100/portTICK_RATE_MS);
    }
}

void vTaskLedYellow(void *p)
{
    for (;;)
    {
        GPIOC->ODR ^= GPIO_Pin_15;
        vTaskDelay(500/portTICK_RATE_MS);
    }
}

void vTaskLedGreen(void *p)
{
    for (;;)
    {
        GPIOC->ODR ^= GPIO_Pin_13;
        vTaskDelay(1000/portTICK_RATE_MS);
    }
}
Chương trình với STM32F4 
#include "stm32f4xx.h"
#include "usart.h"
#include "config.h"
#include <stdlib.h>
#include "systick.h"
#include "config_int.h"
#include "fuction_code.h"
#include "mbconfig.h"
#include "port.h"
#include "mb.h"
#include "mbport.h"
#include "mbutils.h"
#include "FreeRTOS.h"
#include "task.h"
static void Task_main(void *pvParameters);
static void Task_Spi_IO(void *pvParameters);
xTaskHandle Task_main_PRIORITY,Task_Interface_pid_PRIORITY;

/* ----------------------- Static variables ---------------------------------*/

        static void Task_Spi_IO(void *pvParameters)
{
  
    pvParameters = pvParameters;
        while(1)
        {
                   
             //chạy chương trình
              vTaskDelay(1);
    
        }
}

static void Task_game_pad(void *pvParameters)
{ 
    
  pvParameters = pvParameters;
    
   
 while(1)
 {
     
        //chạy chương trình
        vTaskDelay(2);
    
    
 }
}
static void Task_doc_adc(void *pvParameters)
{
      pvParameters = pvParameters;
        while(1) 
  { 
    
       //chạy chương trình  
    vTaskDelay(5);
    }    
}

static void TaskLCD(void *pvParameters)
{

     
 
        for(;;) 
  { 
        
       //chạy chương trình
         vTaskDelay(1);
        
  }
}
    

static void Task_main(void *pvParameters)
{

      pvParameters = pvParameters;
    
        for(;;) 
  { 
         //chạy chương trình
    
         vTaskDelay(1);
        
  }
}

int main(void)
{  
        xTaskCreate(Task_Spi_IO, NULL, 256, NULL, tskIDLE_PRIORITY+1, NULL);
    xTaskCreate(Task_doc_adc, NULL, 256, NULL, tskIDLE_PRIORITY+1, NULL);
  xTaskCreate(Task_game_pad, NULL, 256, NULL, tskIDLE_PRIORITY+1, NULL);

    xTaskCreate(TaskLCD, (signed char*)"TaskLCD", 128, NULL, tskIDLE_PRIORITY, NULL);
    xTaskCreate(Task_main, (signed char*)"Task_main", 512, NULL, tskIDLE_PRIORITY+1,   &Task_main_PRIORITY);
    
  vTaskStartScheduler();// lenh nay cho phep cac tac vu da nhiem hoat dong.
   
    /* Infinite loop */

  while (1)
    {


//                }
  }
}

Liên hệ linhkienhdshop.com để được hỗ trợ tốt nhất

Cũ hơn Mới hơn