目录
前言
Hey,我是Moyiji,一个嵌入式小白,也是一名大三在读生,这是我的第一篇博客,在这里我将向你介绍过去一段时间我开发这个项目的经历和感受。并且通过这篇博客来记录自己的开发过程。
程序现象
my_watch_video
项目背景
在四月份我使用标准库在裸机上复刻了谷歌小恐龙游戏和一个类似于天天酷跑炫飞模式的游戏,并且写了一个多级菜单,在那之后我就决定写一个游戏机项目来集成这些游戏。同时我也在学习韦东山的FREERTOS教程,学习完FREERTOS之后我就感觉这玩意儿用来做这个项目实在太合适了!于是我便决定使用FREERTOS来开发这个项目。不过在五一前夕到五月中旬这段时间里我有足足四门考试要准备, 因此进度便搁置了一段时间。在考完试之后,我便着手开发这个项目(考试中也有缓慢推进)。在写了无数个bug之后,我终于完成了这个项目的软件开发(不过我转换了方向,从做游戏机换成了做多功能手表)。
项目介绍
基于FREERTOS的STM32多功能手表:正如标题所言,这个项目所使用的硬件平台是STM32(stm32f103c8t6),然后使用freerrtos来管理和协同各个任务。
目前版本实现的功能
- 时间显示
- 多级菜单显示
- 万年历(显示2024年份的日历)
- 模拟手电
- 温湿度显示
- 电子闹钟
- 设置(开关系统声音)
这里补充一下,本来我是准备加上血氧监测模块的,因为之前花了十几块大洋买了一个MAX30102一直在搁置,但是当我移植完之后发现这个驱动运行需要占用10K左右的RAM!这你受得了,因为c8t6只有20k RAM, 再加上freertos的占用,就,就没内存了,,,因此只能放弃这个功能了。。。
设计到的freertos知识
- 任务管理(创建,删除,状态转换)
- 软件定时器(创建,启动,停止)
- 队列(创建,写队列,读队列)
- 二值信号量(创建,give,take)
- 中断管理(中断与任务通信)
- 资源管理(主要是堆栈大小的处理)
使用到的硬件
- stm32f103c8t6(20k RAM, 64KROM)
- 0.96寸oled显示屏(黄蓝双色, u8g2库)
- 四个独立按键(中断中写入队列与任务协调)
- 无源蜂鸣器(按键或者电子时钟触发)
- DHT11(显示温湿度信息)
硬件连线图
OLED | KEY | 蜂鸣器 | DHT11 |
SCL(PB6) | key.rdata(PB11) | I/O(PA8) | DAT(PA1) |
SDA(PB7) | key.ldata(PB10) | ||
key.updata(PB1) | |||
key.exdata(PB0) |
实现思路
在freertos初始化时创建除默认任务之外的七个任务,分别是显示时间task,菜单task以及五个功能task,在默认任务中创建两个软件定时器,分别是时间显示Timer和电子闹钟Timer,在中断中向队列写入数据与各个任务完成通信并响应操作,在显示时间task中挂起其它六个任务,在按键触发任务切换时恢复下一个任务,并且挂起自己。