STM32——FreeRTOS入门实践

一、实验环境

所用板开发板:野火STM32MINI
所用IDE:Keil5

在这里插入图片描述

二、实验目的

在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task
task1,每间隔500ms闪烁(变化)一次LED;
task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。 

三、实验步骤

(1)打开野火官方的资料

直接打开可能打不开,因为路径中包含中文,可以自己重新创一个文件夹,再把代码拷贝进去

在这里插入图片描述
可通过如下链接下载
百度网盘链接
提取码:ab12

(2)进入mian.c文件

在这里插入图片描述

(3)找到它创建任务句柄的代码段
在这里插入图片描述
这里可以看到其中只有两个任务,LED1及LED2灯点亮,我们将其改为我们所要求的的三个任务

在这里插入图片描述

(4)找到函数声明代码段

在这里插入图片描述
将其改为我们所需的任务

在这里插入图片描述
(5)找到任务管理函数段

在这里插入图片描述
将我们的任务添加进去

在这里插入图片描述
(6)修改具体函数实现代码

①点亮LED1实现函数

在这里插入图片描述

②Helloworld任务实现函数

在这里插入图片描述
③AHT20传感器温湿度检测模拟模块实现函数

因为没有传感器,所以我们写入输出信息功能

在这里插入图片描述

四、main.c总体代码

#include "FreeRTOS.h"
#include "task.h"
/* 开发板硬件bsp头文件 */
#include "bsp_led.h"
#include "bsp_usart.h"


 /* 创建任务句柄 */
static TaskHandle_t AppTaskCreate_Handle = NULL;
/* LED1任务句柄 */
static TaskHandle_t LED1_Task_Handle = NULL;
/* 输出hello,world!任务句柄 */
static TaskHandle_t Helloworld_Task_Handle = NULL;
/* AH20传感器检测温湿度任务句柄 */
static TaskHandle_t AHT20_Task_Handle = NULL;

//函数声明
static void AppTaskCreate(void);/* 用于创建任务 */
static void LED1_Task(void* pvParameters);/* LED1_Task任务实现 */
static void Helloworld_Task(void* pvParameters);/* 输出hello,wordl!任务实现 */
static void AHT20_Task(void* pvParameters);/* AHT20传感器温湿度检测任务实现 */
static void BSP_Init(void);/* 用于初始化板载相关资源 */

int main(void)
{	
  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */

  /* 开发板硬件初始化 */
  BSP_Init();
  printf("这是一个[野火]-STM32全系列开发板-FreeRTOS-动态创建多任务实验!\r\n");
   /* 创建AppTaskCreate任务 */
  xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  /* 任务入口函数 */
                        (const char*    )"AppTaskCreate",/* 任务名字 */
                        (uint16_t       )512,  /* 任务栈大小 */
                        (void*          )NULL,/* 任务入口函数参数 */
                        (UBaseType_t    )1, /* 任务的优先级 */
                        (TaskHandle_t*  )&AppTaskCreate_Handle);/* 任务控制块指针 */ 
  /* 启动任务调度 */           
  if(pdPASS == xReturn)
    vTaskStartScheduler();   /* 启动任务,开启调度 */
  else
    return -1;  
  
  while(1);   /* 正常不会执行到这里 */    
}



 
static void AppTaskCreate(void)      //为了方便管理,所有的任务创建函数都放在这个函数里面
{
  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
  
  taskENTER_CRITICAL();           //进入临界区
  
  /* 创建LED_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )LED1_Task, /* 任务入口函数 */
                        (const char*    )"LED1_Task",/* 任务名字 */
                        (uint16_t       )512,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )2,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&LED1_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("创建LED1_Task任务成功!\r\n");
  
	/* 创建LED_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )Helloworld_Task, /* 任务入口函数 */
                        (const char*    )"Helloworld_Task",/* 任务名字 */
                        (uint16_t       )512,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )3,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&Helloworld_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("创建Helloworld任务成功!\r\n");
	
	  xReturn = xTaskCreate((TaskFunction_t )AHT20_Task, /* 任务入口函数 */
                        (const char*    )"AHT20",/* 任务名字 */
                        (uint16_t       )512,   /* 任务栈大小 */
                        (void*          )NULL,	/* 任务入口函数参数 */
                        (UBaseType_t    )4,	    /* 任务的优先级 */
                        (TaskHandle_t*  )&AHT20_Task_Handle);/* 任务控制块指针 */
  if(pdPASS == xReturn)
    printf("创建AHT20任务成功!\r\n");
  
  vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
  
  taskEXIT_CRITICAL();            //退出临界区
}




static void LED1_Task(void* parameter)               //点亮LED1实现函数
{	
    while (1)
    {
        LED1_ON;
        vTaskDelay(500);   /* 延时500个tick */
        printf("LED1_Task Running,LED1_ON\r\n");
        
        LED1_OFF;     
        vTaskDelay(500);   /* 延时500个tick */		 		
        printf("LED1_Task Running,LED1_OFF\r\n");
    }
}


static void Helloworld_Task(void* parameter)  //Helloworld任务实现函数
{	
	 while(1)
    {
        printf("hello world!\n"); 
        vTaskDelay(2000);  /* 延时2000个tick */			
    }
}

static void AHT20(void *parameter)            //AHT20传感器温湿度检测模拟模块实现函数
{
	while(1)
	{
	 printf("没有找到AH20传感器\n"); 
   vTaskDelay(5000);     /* 延时5000个tick */	
	}		
}

static void BSP_Init(void)  //板级外设初始化,所有板子上的初始化均可放在这个函数里面
{
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	
	/* LED 初始化 */
	LED_GPIO_Config();

	/* 串口初始化	*/
	USART_Config();
  
}

编写完成,将程序烧入进开发板

五、实现效果

在这里插入图片描述

在这里插入图片描述

六、小结

这次实验对FreeRTOS的多任务处理有了一定的了解。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页