加入freertos技术

freertos_demo.h文件
#ifndef __FREERTOS_H
#define __FREERTOS_H
​
void freertos_demo(void);
​
#endif
freertos_demo.c文件
#include "freertos_demo.h"
#include "./BSP/LED/led.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/DS18B20/ds18b20.h"
#include "./BSP/OLED/oled.h"
#include "./BSP/FENGMINGQI/fengmingqi.h"
#include "./BSP/DIANJI/dianji.h"
//添加freertos实时操作系统的头文件
#include "FreeRTOS.h"
#include "task.h"//创建任务是需要的头文件
#include "queue.h"//队列头文件
​
/*开始任务的配置信息*/
#define START_TASK_PRIO     1
#define START_TASK_SIZE     128
TaskHandle_t Start_TaskHandel;
void start_task(void *params);
​
/*测温任务的配置信息*/
#define CEWEN_TASK_PRIO     2               
#define CEWEN_TASK_SIZE     128         
TaskHandle_t    CEWEN_TaskHandle;   
void CEWEN_task(void *params);          
/*电机任务的配置信息*/
#define DIANJI_PRIO             3
#define DIANJI_STACK_SIZE   128
TaskHandle_t DIANJI_TaskHandel;
void DIANJI_task(void *params);
/*oled任务配置*/
#define OLED_PRIO                   4
#define OLED_STACK_SIZE 128
TaskHandle_t OLED_TaskHandel;
void OLED_task(void *params);
/*蜂鸣器任务配置*/
#define FMQ_PRIO                    5
#define FMQ_STACK_SIZE  128
TaskHandle_t FMQ_TaskHandel;
void FMQ_task(void *params);
​
//创建队列句柄
QueueHandle_t dianjiduilie;
QueueHandle_t wenduduilie;
QueueHandle_t wenduduilie1;
QueueHandle_t fengmingqi;
//启动start函数,他是main函数进入freertos的唯一途径
void freertos_demo(void)
{
     xTaskCreate((TaskFunction_t         )   start_task,
                (char *                 )   "start_task",
                (configSTACK_DEPTH_TYPE )   START_TASK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   START_TASK_PRIO,
                (TaskHandle_t *         )   &Start_TaskHandel);
    vTaskStartScheduler();
​
}
​
void start_task(void *params)
{
    taskENTER_CRITICAL();
    dianjiduilie=xQueueCreate(2,sizeof(int));//括号里第一个代表队列的长度,第二是每一个位置可以放几个字节
    wenduduilie=xQueueCreate(2,sizeof(int));
    wenduduilie1=xQueueCreate(2,sizeof(int));
    fengmingqi=xQueueCreate(2,sizeof(int));
    
​
    xTaskCreate((TaskFunction_t)CEWEN_task,
                            (const char *)"CEWEN_task" , 
              (uint16_t)CEWEN_TASK_SIZE,
                            (void*)NULL,
                            (UBaseType_t)CEWEN_TASK_PRIO,
              (TaskHandle_t *) &CEWEN_TaskHandle);
    
    xTaskCreate((TaskFunction_t)DIANJI_task,
                            (const char *)"DIANJI_task",
                            (uint16_t)DIANJI_STACK_SIZE,
                            (void*)NULL,
                            (UBaseType_t)DIANJI_PRIO,
                            (TaskHandle_t *) &DIANJI_TaskHandel);           
                            
    xTaskCreate((TaskFunction_t)OLED_task,
                            (const char *)"OLED_task",
                            (uint16_t)OLED_STACK_SIZE,
                            (void*)NULL,
                            (UBaseType_t)OLED_PRIO,
                            (TaskHandle_t *) &OLED_TaskHandel);     
    
    xTaskCreate((TaskFunction_t)FMQ_task,
                            (const char *)"FMQ_task",
                            (uint16_t)FMQ_STACK_SIZE,
                            (void*)NULL,
                            (UBaseType_t)FMQ_PRIO,
                            (TaskHandle_t *) &FMQ_TaskHandel);                              
                            
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();                
​
}   
​
​
​
void CEWEN_task(void *params)
{
    char temp_str[20];
    while (1)
    {   
        float temperature = ds18b20_get_temperature();  
        static int i = 0; 
        int temp=temperature;//强转成int类型假如说温度是26.1让他变成26
        int temp1=temperature*10-temp*10;//得到小数后边的数26.1乘10减去26乘10得到1
        printf("temperature:%.2f\r\n",temperature);
        printf("temp:%d\r\n",temp);
        printf("temp1:%d\r\n",temp1);
        if(i%300==0)//读取三百次转换成一次
        {
            
            if(temperature<0)
            {
                sprintf(temp_str,"-%.1f",(float)(-temperature)/10);
            }
            else
            {
                sprintf(temp_str, "%.1f", (float)temperature/10);
            }
            
        }
        //led灯显示
        if(temperature>30)
        {
                LED1(0);
                delay_ms(100);
                LED1(1);
        }
//      i++;
        xQueueSend(dianjiduilie,&temp,portMAX_DELAY);//portMAX_DELAY的意思为队列死等
        xQueueSend(wenduduilie,&temp,5);
        xQueueSend(wenduduilie1,&temp1,5);
        xQueueSend(fengmingqi,&temp,5);
    }
}
void DIANJI_task(void *params)
{
    uint8_t wendu;
    while(1){
    xQueueReceive(dianjiduilie,&wendu,portMAX_DELAY);//接收队列内容,把temperature赋值给wendu
    if(wendu>=30)
        {
            DIANJI(1);
            vTaskDelay(10);
        }else{
            DIANJI(0);
            vTaskDelay(10);
        }
        vTaskDelay(30);//任务延时把cpu放开让给其他任务用
        }
}
void OLED_task(void *params)
{
    while(1)
    {
            uint8_t wendu1;
            uint8_t wendu2;
            xQueueReceive(wenduduilie,&wendu1,5);
            xQueueReceive(wenduduilie1,&wendu2,5);
        
​
            OLED_ShowFontHZ(15,24,2,16,1);//得到"温"字
            OLED_ShowFontHZ(31,24,3,16,1);//得到"度"字
            OLED_ShowString(46,24,":",16);//得到":"这个符号
            OLED_ShowNum(60,24,wendu1,2,16);//得到一个整数温度
            OLED_ShowString(80,24,".",16);//得到"."这个符号
            OLED_ShowNum(90,24,wendu2,1,16);//得到这个温度小数点后的数
            OLED_ShowFontHZ(100,24,3,16,1);//得到"度"这个字
    
            OLED_Refresh_Gram();
            vTaskDelay(50);
    }
​
}
void FMQ_task(void *params)
{
    int fmq;
    while(1)
    {   
        int time=20;
        xQueueReceive(fengmingqi,&fmq,5);
        //蜂鸣器延时设置在200-660,数字越大越响1.5v-5v电压越大声音越响
        if(fmq>=30)
        {
            while(time--)
            {
                BEEP(0);
                delay_us(100);
                BEEP(1);
                delay_us(400);
            }
      } 
            vTaskDelay(60);
    }
}
main.c文件
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/DS18B20/ds18b20.h"
#include "./BSP/OLED/oled.h"
#include "./BSP/FENGMINGQI/fengmingqi.h"
#include "./BSP/DIANJI/dianji.h"
#include "freertos_demo.h"
​
int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
    delay_init(72);                     /* 延时初始化 */
      usart_init(115200);
    led_init();                         /* LED初始化 */
      oled_init();
        dianji_init();
        beep_init();
        ds18b20_init();
​
​
​
        freertos_demo();
​
}

代码不是很完美,希望对您有所帮助,这个文章和我上个基于STM32设计汽车空调自动控温系统用的是一套代码,只是加入了freertos操作系统。

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值