# 18级嵌入式三级项目 **Repository Path**: Rbb666/stm32 ## Basic Information - **Project Name**: 18级嵌入式三级项目 - **Description**: 18级物联网工程系嵌入式三级项目 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 3 - **Created**: 2020-12-22 - **Last Updated**: 2023-12-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README --- title: 大三上学期-嵌入式三级项目-stm32 date: 2020-12-23 13:48:06 tags: stm32 --- # 嵌入式三级项目 ## 项目目标 * 1.运用TFTLCD的相关原理与知识实现其输出控制。 * 2.运用单总线通信原理实现DTH11温湿度信息采集与处理。 * 3.运用IIC通信原理,实现24C02的编程控制。 * 4.运用I/O端口的输入/输出控制实现LED显示、按键扫描与识别、蜂鸣器发生控制等控制。 * 5.运用中断知识实现中断程序设计。 * 6.运用定时器原理等知识实现定时控制。 * 7.运用RTC原理与控制要求实现时间的维护。 * 8.掌握基于STM32处理器的综合应用开发与调试。 --- 代码已经放到了我的 [Gitee](https://gitee.com/Rbb996/stm32)上面了,需要的小伙伴可以自己去下载,欢迎交流。 ## 项目内容 直接上图: --- ![项目需求](https://img-blog.csdnimg.cn/20201223140357743.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) ![考察知识点](https://img-blog.csdnimg.cn/20201223140604921.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) ## 作业思路 说一下大体的思路吧: * 1.任务调度:最初我打算使用操作系统完成整个项目的需求,但是整个项目分析下来发现需求并不很复杂,所以没有必要上操作系统。所以我做了一个分时调度器(仿操作系统)处理多任务。每个任务分配不同的时间间隔,当1任务触发完成便会触发第2个任务,以此类推... * 2.按键任务的处理:这里我使用一个小巧简单易用的事件驱动型按键驱动模块--MultiButton。这个项目非常精简,只有两个文件,可无限量扩展按键,按键事件的回调异步处理方式可以简化程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。 > MuliButton 支持如下的按钮事件: > |事件|说明| > |:—:|:—:| > |PRESS_DOWN |按键按下,每次按下都触发| > |PRESS_UP |按键弹起,每次松开都触发| > |PRESS_REPEAT| 重复按下触发,变量repeat计数连击次数| > |SINGLE_CLICK |单击按键事件| > |DOUBLE_CLICK| 双击按键事件| > |LONG_RRESS_START| 达到长按时间阈值时触发一次| > |LONG_PRESS_HOLD| 长按期间一直触发| * 3.温湿度采集:该项目使用的温湿度传感器为:DHT11,大家应该都见过也都使用过,一个国产的很普遍的单总线数字温湿度传感器。优点:简单易上手,占用引脚少,仅需一根时钟线便可以操控。缺点:精度太低只有0.1%,不太灵敏,相应时间长。 ![DHT11基本参数](https://img-blog.csdnimg.cn/20201223142140138.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) * 4.24C02的使用:俗称EEPROM,可以将数据保存到该ic中,具有掉电不丢失的特性。 根据AT24C02的 Datasheet 可知AT24C02有2K bit,即256B,分为32页,每页8个字节,结合数据手册和原理图可以得知,板载AT24C02的读地址为0xA2,写地址为0xA3。 ![24c02](https://img-blog.csdnimg.cn/20201223142638942.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) ## 项目实现 ### 1.分时调度器的实现 ![主函数](https://img-blog.csdnimg.cn/20201223143140120.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) > 可以看见整个main函数轮询执行了任务调度处理。 ![任务定时器实现](https://img-blog.csdnimg.cn/20201223145123820.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) > 可见任务定时器在系统滴答定时器终端回调中调用,每1ms任务定时器会进行递减。 ![任务调用](https://img-blog.csdnimg.cn/20201223145126451.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) ### 2.按键“单击,双击,长按”的实现 ![步骤1](https://img-blog.csdnimg.cn/20201223180338237.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) > ①:包含头文件 > ②:定义一个按键结构(按键对象) > ③:初始化按键对象 ![](https://img-blog.csdnimg.cn/20201223180828417.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) MultiButton支持的按钮事件枚举如下: ![](https://img-blog.csdnimg.cn/20201223180807302.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) 在5ms任务中调用按键的心跳函数: ![](https://img-blog.csdnimg.cn/20201223181208232.png) ![业务代码块](https://img-blog.csdnimg.cn/20201223181521600.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) ### 3.MultiButton设计思想 #### 1.1:面向对象思想 MultiButton中每个按键都抽象为了一个按键对象,每个按键对象是独立的,系统中所有的按键对象使用单链表串起来。 ![](https://img-blog.csdnimg.cn/20201223181809310.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) 其中在变量后面跟冒号的语法称为位域,使用位域的优势是节省内存。 --- #### 1.2:按键对象单链表 MultiButton自己定义了一个头指针: ```c //button handle list head. static struct Button* head_handle = NULL; ``` 用户插入一个按键对象的代码如下: ```c button_start(&button1);//启动按键 ``` ```c /** * @brief Start the button work, add the handle into work list. * @param handle: target handle strcut. * @retval 0: succeed. -1: already exist. */ int button_start(struct Button* handle) { struct Button* target = head_handle; while(target) { if(target == handle) return -1; //already exist. target = target->next; } handle->next = head_handle; head_handle = handle; return 0; } ``` 第一次插入时,因为head_hanler 为 NULL,所以只需要执行while之后的代码. ![](https://img-blog.csdnimg.cn/20201223182400553.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) 如果再插入一个buuton2按键对象: ![](https://img-blog.csdnimg.cn/20201223182440384.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) #### 1.3:状态机处理思想 1. 读取当前引脚状态 ![](https://img-blog.csdnimg.cn/20201223182632103.png) 2. 读取之后,判断当前状态机的状态,如果有功能正在执行(state不为0),则按键对象的tick值加1(后续一切功能的基础) ![](https://img-blog.csdnimg.cn/20201223182749608.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) 3. 按键消抖(连续读取3次,15ms,如果引脚状态一直与之前不同,则改变按键对象中的引脚状态) ![](https://img-blog.csdnimg.cn/20201223203813880.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) 4. 状态机 ![](https://img-blog.csdnimg.cn/20201223203917916.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjEwNDMw,size_16,color_FFFFFF,t_70) ---MultiButton设计思想来源Mculover666,感谢大佬让我学习到很多。    大体上项目的需求就是这些,这次三级项目丰富了我个个人经验,让我尝试用一些之前没有用到的方式去快速开发一个嵌入式项目,使用状态机方式去开发,以及分时调度器提高裸机开发的效率。同时感谢像Mculover666,0x1abin这样的大佬的贡献。我的代码以及开源到我的git,如有错误欢迎指正,共同进步!