1 Star 0 Fork 3

Sean_long / 18级嵌入式三级项目

forked from Rb / 18级嵌入式三级项目 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
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上面了,需要的小伙伴可以自己去下载,欢迎交流。

项目内容

直接上图:


项目需求

考察知识点

作业思路

说一下大体的思路吧:

  • 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基本参数

  • 4.24C02的使用:俗称EEPROM,可以将数据保存到该ic中,具有掉电不丢失的特性。 根据AT24C02的 Datasheet 可知AT24C02有2K bit,即256B,分为32页,每页8个字节,结合数据手册和原理图可以得知,板载AT24C02的读地址为0xA2,写地址为0xA3。 24c02

项目实现

1.分时调度器的实现

主函数

可以看见整个main函数轮询执行了任务调度处理。

任务定时器实现

可见任务定时器在系统滴答定时器终端回调中调用,每1ms任务定时器会进行递减。

任务调用

2.按键“单击,双击,长按”的实现

步骤1

①:包含头文件 ②:定义一个按键结构(按键对象) ③:初始化按键对象

MultiButton支持的按钮事件枚举如下:

在5ms任务中调用按键的心跳函数:

业务代码块

3.MultiButton设计思想

1.1:面向对象思想

MultiButton中每个按键都抽象为了一个按键对象,每个按键对象是独立的,系统中所有的按键对象使用单链表串起来。

其中在变量后面跟冒号的语法称为位域,使用位域的优势是节省内存。


1.2:按键对象单链表

MultiButton自己定义了一个头指针:

//button handle list head.
static struct Button* head_handle = NULL;

用户插入一个按键对象的代码如下:

button_start(&button1);//启动按键
/**
  * @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之后的代码.

如果再插入一个buuton2按键对象:

1.3:状态机处理思想

  1. 读取当前引脚状态

  1. 读取之后,判断当前状态机的状态,如果有功能正在执行(state不为0),则按键对象的tick值加1(后续一切功能的基础)

  1. 按键消抖(连续读取3次,15ms,如果引脚状态一直与之前不同,则改变按键对象中的引脚状态)

  1. 状态机

---MultiButton设计思想来源Mculover666,感谢大佬让我学习到很多。

   大体上项目的需求就是这些,这次三级项目丰富了我个个人经验,让我尝试用一些之前没有用到的方式去快速开发一个嵌入式项目,使用状态机方式去开发,以及分时调度器提高裸机开发的效率。同时感谢像Mculover666,0x1abin这样的大佬的贡献。我的代码以及开源到我的git,如有错误欢迎指正,共同进步!

空文件

简介

18级物联网工程系嵌入式三级项目 展开 收起
C
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C
1
https://gitee.com/shawn_long/stm32.git
git@gitee.com:shawn_long/stm32.git
shawn_long
stm32
18级嵌入式三级项目
master

搜索帮助