当前位置: 首页 > news >正文

【开源】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相关的功能

#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();   /* 启动任务,开启调度 */elsereturn -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的分享

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 解决uniapp开发的app,手机预览,上下滑动页面,页面出现拉伸,抖动的效果问题,
  • Gitlab学习(009 gitlab冲突提交)
  • Shiro-认证绕过漏洞(CVE-2020-1957)
  • 排序----数据结构
  • Lanterns (dp 紫 线段树 二分 维护dp)
  • Java 入门指南:Java 8 新特性 —— Stream 流
  • golang操作mysql利器-gorm
  • 大学生必看!60万人在用的GPT4o大学数学智能体有多牛
  • 大数据新视界 --大数据大厂之 Node.js 与大数据交互:实现高效数据处理
  • Codeforces Round 973 (Div. 2) - D题
  • 数据库事务中的四大问题:脏读、脏写、不可重复读与幻读详解
  • 【HTTPS】对称加密和非对称加密
  • RocketMQ控制台手动新增主题,报错:clusterName or brokerName can not be all blank
  • 【设计模式-备忘录】
  • Redisson 总结
  • 【Leetcode】101. 对称二叉树
  • AngularJS指令开发(1)——参数详解
  • Date型的使用
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES6--对象的扩展
  • GitUp, 你不可错过的秀外慧中的git工具
  • Hibernate最全面试题
  • java2019面试题北京
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript创建对象的四种方式
  • JAVA多线程机制解析-volatilesynchronized
  • Java反射-动态类加载和重新加载
  • js写一个简单的选项卡
  • LeetCode29.两数相除 JavaScript
  • LeetCode算法系列_0891_子序列宽度之和
  • log4j2输出到kafka
  • Lsb图片隐写
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Vue2.0 实现互斥
  • 对超线程几个不同角度的解释
  • 复杂数据处理
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 简单基于spring的redis配置(单机和集群模式)
  • 阿里云服务器购买完整流程
  • 积累各种好的链接
  • ​力扣解法汇总946-验证栈序列
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #传输# #传输数据判断#
  • #图像处理
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $NOIp2018$劝退记
  • (2)(2.10) LTM telemetry
  • (二) 初入MySQL 【数据库管理】
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (算法)区间调度问题
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)