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操作系统。