视频演示
【开源】LVGL+FreeRTOS 基于STM32F411的智能健康助手小项目
硬件介绍
-
STM32F411CEU6 主控
-
TFT 1.8inch 显示屏
-
DTH11 温湿度传感器
-
HC-05 蓝牙模块
-
蜂鸣器模块
-
Max30102 心率血氧传感器
-
XGZP6847A 压力传感器
-
波轮按键+独立按键
-
MPU6050 陀螺仪模块
技术栈
STM32
-
SPI协议驱动
-
I2C协议驱动
-
PWM控制
-
UART串口协议驱动
-
ADC模数转换
FreeRTOS
-
任务创建
-
队列
-
事件
-
二值信号量
-
互斥信号量
-
临界区保护
LVGL
-
图片按钮
-
Label标签显示
-
多界面切换
-
进度条
-
开关
代码框架
-
Hardware+MPU6050:STM32硬件驱动相关的文件
-
FreeRTOS/User:创建的任务
-
GUI_Page:为我们创建的页面
User_Task_Init.c
中创建了任务和使用到的其他freertos相关的功能
- #include "User_Task_Init.h"
-
- /*FreeRTOS创建任务句柄*/
- TaskHandle_t AppTaskCreate_Handle = NULL;/* 创建任务句柄 */
- TaskHandle_t LVGL_Task_Handle = NULL;/* 创建任务句柄 */
- TaskHandle_t WDG_task_Handle = NULL;/* 创建任务句柄 */
-
- TaskHandle_t Sensor_Data_Update_Task_Handle = NULL;/* 创建任务句柄 */
- TaskHandle_t Key_Task_Handle = NULL;/* 创建任务句柄 */
- TaskHandle_t Heart_Data_Update_task_Handle = NULL;/* 创建任务句柄 */
- TaskHandle_t UI_Page_Switch_task_Handle = NULL;/* 创建任务句柄 */
- TaskHandle_t key_task_Handle = NULL;/* 创建任务句柄 */
- /*FreeRTOS创建队列句柄*/
- QueueHandle_t Senser_Queue =NULL;
- QueueHandle_t Key_Queue =NULL;
- /*FreeRTOS创建二值信号量*/
- SemaphoreHandle_t Page_Switch_BinarySem = NULL;
- /*FreeRTOS创建事件*/
- EventGroupHandle_t WDG_Event_Handle = NULL;
- /*FreeRTOS一些宏定义*/
-
- /*FreeRTOS任务函数声明*/
- static void AppTaskCreate(void);
- void WDG_task(void const * argument);
-
-
- void FreeRTOS_Task_Init(void)
- {
- BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
- /* 创建AppTaskCreate任务 */
- xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate, /* 任务入口函数 */
- (const char* )"AppTaskCreate",/* 任务名字 */
- (uint16_t )1024, /* 任务栈大小 */
- (void* )NULL,/* 任务入口函数参数 */
- (UBaseType_t )1, /* 任务的优先级 */
- (TaskHandle_t* )&AppTaskCreate_Handle);/* 任务控制块指针 */
- /* 启动任务调度 */
- if(pdPASS == xReturn)
- vTaskStartScheduler(); /* 启动任务,开启调度 */
- else
- return -1;
- }
-
- /***********************************************************************
- * @ 函数名 : AppTaskCreate
- * @ 功能说明: 为了方便管理,所有的任务创建函数都放在这个函数里面
- * @ 参数 : 无
- * @ 返回值 : 无
- **********************************************************************/
- static void AppTaskCreate(void)
- {
- BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
- char buf[64];
-
- taskENTER_CRITICAL(); //进入临界区
-
- Senser_Queue = xQueueCreate((UBaseType_t ) 20,/* 消息队列的长度 */
- (UBaseType_t ) sizeof(SensorData_t));/* 消息的大小 */
-
- Key_Queue = xQueueCreate((UBaseType_t ) 4,/* 消息队列的长度 */
- (UBaseType_t ) sizeof(uint8_t));/* 消息的大小 */
-
- Page_Switch_BinarySem = xSemaphoreCreateBinary();
-
- WDG_Event_Handle = xEventGroupCreate();
-
- xTaskCreate((TaskFunction_t )lvgl_task, /* 任务入口函数 */
- (const char* )"lvgl_task",/* 任务名字 */
- (uint16_t )512, /* 任务栈大小 */
- (void* )NULL, /* 任务入口函数参数 */
- (UBaseType_t )4, /* 任务的优先级 */
- (TaskHandle_t* )&LVGL_Task_Handle);/* 任务控制块指针 */
-
- xTaskCreate((TaskFunction_t )WDG_task, /* 任务入口函数 */
- (const char* )"WDG_task",/* 任务名字 */
- (uint16_t )128, /* 任务栈大小 */
- (void* )NULL, /* 任务入口函数参数 */
- (UBaseType_t )3, /* 任务的优先级 */
- (TaskHandle_t* )&WDG_task_Handle);/* 任务控制块指针 */
-
- xTaskCreate((TaskFunction_t )Sensor_Data_Update_task, /* 任务入口函数 */
- (const char* )"Sensor_Data_Update_Task",/* 任务名字 */
- (uint16_t )256, /* 任务栈大小 */
- (void* )NULL, /* 任务入口函数参数 */
- (UBaseType_t )3, /* 任务的优先级 */
- (TaskHandle_t* )&Sensor_Data_Update_Task_Handle);/* 任务控制块指针 */
-
- // xTaskCreate((TaskFunction_t )UI_Page_Switch_task, /* 任务入口函数 */
- // (const char* )"UI_Page_Switch_task",/* 任务名字 */
- // (uint16_t )128*8, /* 任务栈大小 */
- // (void* )NULL, /* 任务入口函数参数 */
- // (UBaseType_t )4, /* 任务的优先级 */
- // (TaskHandle_t* )&UI_Page_Switch_task_Handle);/* 任务控制块指针 */
-
- vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
-
- taskEXIT_CRITICAL(); //退出临界区
- }
-
- uint8_t WDG_task_Flag;
- void WDG_task(void const * argument)
- {
- EventBits_t r_event;
- while(1)
- {
- r_event = xEventGroupWaitBits(WDG_Event_Handle,
- LVGL_EVENT|SENSOR_EVENT,
- pdTRUE,
- pdTRUE,
- portMAX_DELAY);
-
- if ((r_event & (LVGL_EVENT|SENSOR_EVENT)) == (LVGL_EVENT|SENSOR_EVENT))
- {
- WDG_task_Flag = 1;
- IWDG_Feed();
- }
- }
- }
-
-
-
-
-
-
-
main.c
初始化硬件、LVGL、调用任务创建函数创建任务和其他功能
- #include "main.h"
-
- void vApplicationTickHook()
- {
- // 告诉lvgl已经过去了1毫秒
- lv_tick_inc(1);
- }
-
- static void Hard_Init(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
- SystemInit();
- dwt_delay_init();
- BEEP_PWM_Init();
- Blue_Hc05_Init();
- Lcd_Init();
- Lcd_Clear(0xffff);
- lv_init();
- lv_port_disp_init();
- lv_port_indev_init();
- EXTI_Key_Config();
- MPU_Init();
- mpu_dmp_init();
- RTC_Config();
- MAX30102_Init();
- XGZP_Init();
-
- IWDG_Config(IWDG_Prescaler_64, 3125); //5s
- }
-
- int main(void)
- {
- Hard_Init();
- FreeRTOS_Task_Init();
-
- while (1)
- {}
- }
评论记录:
回复评论: