视频演示
【开源】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)
{}
}
网盘链接
通过百度网盘分享的文件:STM32F4_Health Assistant.zip
链接:https://pan.baidu.com/s/1pAHKBgsChtsiSPcHAIBLAg?pwd=9xeg
提取码:9xeg
--来自百度网盘超级会员V5的分享
版权归原作者 嵌入式crafter 所有, 如有侵权,请联系我们删除。