用STM32完成基于FreeRTOS的多任务程序

一、目的

在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task,具体任务不限,但建议如下:

  • task1,每间隔500ms闪烁(变化)一次LED;
  • task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
  • task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。

二、准备工作

1、ST-link下载线、野火MINIstm32开发板

2、keil5软件、野火串口调试助手

3、现成的SRAM动态创建多任务工程(已将FreeRTOS移植完毕)

三、具体操作步骤

步骤一硬件连线

将野火MINIstm32开发板与ST-link下载线对应接口进行连线。如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GUPqJMri-1606907443640)(E:\大三学习\嵌入式系统开发\第一次实验\image\1.jpg)]

将其与电脑连接,如下图:

步骤2打开现成的工程,进行烧录

打开工程后如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FySzN0Rn-1606907443645)(E:\大三学习\嵌入式系统开发\第一次实验\image\3.png)]

keil中进行编译,生成.axf文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ylh2Hty8-1606907443648)(E:\大三学习\嵌入式系统开发\第一次实验\image\4.png)]

点击魔术棒–>Debug–>ST-link Debugger

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oNxQm42y-1606907443653)(E:\大三学习\嵌入式系统开发\第六次作业\image\1.6.png)]

点击settings–>SW

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cHJBYsGU-1606907443656)(E:\大三学习\嵌入式系统开发\第六次作业\image\1.7.png)]

点击Flash Download–>Erase Full Chip–>add

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jZRKUNlc-1606907443658)(E:\大三学习\嵌入式系统开发\第六次作业\image\1.8.png)]

添加完成后依次点确定,ok完成设置。

点击Download进行下载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7UEZZggf-1606907443659)(E:\大三学习\嵌入式系统开发\第一次实验\image\5.png)]

下载完成后如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XaRumXNF-1606907443660)(E:\大三学习\嵌入式系统开发\第一次实验\image\6.png)]

至此,完成扫烧录。

步骤3打开野火调试助手,进行验证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ioZM4XtE-1606907443661)(E:\大三学习\嵌入式系统开发\第一次实验\image\0.gif)]

MINIstm32开发版led闪烁如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cw86cluM-1606907443663)(E:\大三学习\嵌入式系统开发\第一次实验\image\0.0.gif)]

四、相关代码

相关代码:(因为在野火官网可以下载现成的,故只给出main函数部分)

#include "FreeRTOS.h"
#include "task.h"
#include "bsp_led.h"
#include "bsp_usart.h"

static TaskHandle_t AppTaskCreate_Handle = NULL;
static TaskHandle_t LED1_Task_Handle = NULL;
static TaskHandle_t hello_Task_Handle = NULL;
static TaskHandle_t AHT_Task_Handle = NULL;

static void AppTaskCreate(void);
static void LED1_Task(void* pvParameters);
static void hello_Task(void* pvParameters);
static void AHT_Task(void* pvParameters);
static void BSP_Init(void);
int main(void)
{	
  BaseType_t xReturn = pdPASS;
  BSP_Init();
  printf("这是一个多任务程序实验!\r\n");
  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;
    taskENTER_CRITICAL();
  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");
    
  xReturn = xTaskCreate((TaskFunction_t )hello_Task, 
                        (const char*    )"hello_Task",
                        (uint16_t       )512,  
                        (void*          )NULL,	
                        (UBaseType_t    )3,	 
                        (TaskHandle_t*  )&hello_Task_Handle);
  if(pdPASS == xReturn)
    printf("创建hello_Task任务成功!\r\n");
  
  xReturn = xTaskCreate((TaskFunction_t )AHT_Task, 
                        (const char*    )"AHT_Task",
                        (uint16_t       )512,  
                        (void*          )NULL,
                        (UBaseType_t    )3,	  
                        (TaskHandle_t*  )&AHT_Task_Handle);
  if(pdPASS == xReturn)
    printf("创建AHT_Task任务成功!\r\n");
  
  vTaskDelete(AppTaskCreate_Handle); 
  
  taskEXIT_CRITICAL();   
}
static void LED1_Task(void* parameter)
{	
    while (1)
    {
        LED1_ON;
        vTaskDelay(500);   
        printf("LED1_Task Running,LED1_ON\r\n");
        
        LED1_OFF;     
        vTaskDelay(500);   		
        printf("LED1_Task Running,LED1_OFF\r\n");
    }
}
static void hello_Task(void* parameter)
{	
    while (1)
    {
        vTaskDelay(2000);  
        printf("hello World!\n");
            
    }
}
static void AHT_Task(void* parameter)
{	
    
     /*无硬件,之后实现*/   
            
    
}

static void BSP_Init(void)
{
	
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	LED_GPIO_Config();
	USART_Config(); 
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值