【开源】LVGL+FreeRTOS 基于STM32F411CEU6的健康助手项目制作

视频演示

【开源】LVGL+FreeRTOS 基于STM32F411的智能健康助手小项目

网盘链接在最底下!!!无套路!!!直接分享!!!


硬件介绍

  1. STM32F411CEU6 主控

  2. TFT 1.8inch 显示屏

  3. DTH11 温湿度传感器

  4. HC-05 蓝牙模块

  5. 蜂鸣器模块

  6. Max30102 心率血氧传感器

  7. XGZP6847A 压力传感器

  8. 波轮按键+独立按键

  9. MPU6050 陀螺仪模块


技术栈

STM32

  1. SPI协议驱动

  2. I2C协议驱动

  3. PWM控制

  4. UART串口协议驱动

  5. ADC模数转换

FreeRTOS

  1. 任务创建

  2. 队列

  3. 事件

  4. 二值信号量

  5. 互斥信号量

  6. 临界区保护

LVGL

  1. 图片按钮

  2. Label标签显示

  3. 多界面切换

  4. 进度条

  5. 开关


代码框架

  1. Hardware+MPU6050:STM32硬件驱动相关的文件

  2. FreeRTOS/User:创建的任务

  3. GUI_Page:为我们创建的页面

User_Task_Init.c

中创建了任务和使用到的其他freertos相关的功能

cpp 复制代码
#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、调用任务创建函数创建任务和其他功能

cpp 复制代码
#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的分享

相关推荐
HUI-47429 分钟前
EG1177|SOP‑7 内置 100V‑NMOS 异步降压,20‑90V 高压恒压恒流小功率电源优选
嵌入式硬件·硬件工程
Doraemomo1 小时前
IMX6ULL裸机开发——I2C通信协议
arm开发·嵌入式硬件·imx6ull
国产HT1621B1 小时前
显示省不了电,休眠才见真章:1621 低功耗实操
驱动开发·单片机·嵌入式硬件·led驱动·lcd驱动
国科安芯1 小时前
低轨卫星姿轨控系统中高可靠嵌入式控制单元的设计与验证
单片机·mcu·低轨卫星·星间链路·卫星姿轨控
zhangzhangkeji3 小时前
stm32 5-2 : 中断,代码篇,对射式红外计数器,旋转编码器。 本 M3中等密度的中断向量列表
stm32
尼喃3 小时前
Type-C快充取电芯片工作流程:从适配器识别到电压输出
嵌入式硬件
昌原的儿子LEO3 小时前
ARM 汇编核心知识点总结
嵌入式硬件·学习
老当益壮梁奶奶4 小时前
ARM 汇编学习笔记(二)启动代码、指令、函数调用与 C 混合编程
c语言·arm开发·单片机·嵌入式硬件·51单片机
学习FPGA的电气小兴兴4 小时前
基于FPGA的CORDIC向量模式实现arctan运算,Verilog HDL实现
嵌入式硬件·fpga开发·数字信号处理·verilog·fpga·cordic·arctan
国科安芯4 小时前
商业航天星载数据管理单元的存储容错与接口集成方案研究
嵌入式硬件·架构·ecc·商业航天·抗辐射