我们的开源宗旨:自由 协调 开放 合作 共享

拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~

和一群志同道合的人,做自己所热爱的事!

项目开源地址:https://github.com/Cai-Zi/STM32_RC_Transmitter

QQ交流群:1091996634 【密码:J20】

这篇文章一方面是为了方便初学者阅读修改程序,另一方面是便于团队成员快速了解程序框架,做到心中有数。

受限于篇幅,这里只是对程序做一个简要的介绍,要做更深入的了解还是要通读源代码的,毕竟数千行代码无法一五一十地讲解。

一. KEIL5使用技巧

1. 美化编辑界面

keil默认的主题是白色的,比较伤眼且不美观。

先来看美化后的效果,黑色的主题看起来舒服多了~

下载文件 https://files.cnblogs.com/files/cai-zi/global.zip,解压后得到global.prop文件;

将其复制到keil5安装目录(笔者的是D:\Keil_v5\MDK\UV4\global.prop),重启keil即可。

2. 断点调试代码

工具栏中点击魔法棒图标,选择Debug窗口,选择下载器为ST-Link Debugger;

将ST-Link V2下载器与STM32连接,USB端连接电脑。

GND       电源地
3V3         接3.3v
SWCLK  接DCLK
SWDIO   接DIO

每次修改完程序,需要先编译,通过后再点击序号3图标,进入调试。

在行数旁边点击鼠标左键,打断点,然后点击序号2图标,运行程序,程序会在断点处停止;

此时可查看程序运行的时长,各个变量当前的值等等。

3. 查看变量值

有时候变量结构过于复杂,并且想要实时查看,不适合通过串口输出,这时就要用调试手段了。

完成第2步操作,进入调试后,选择某个变量名(以PWMvalue数组为例),点击鼠标右键,如图选择,即可在Watch1中查看变量。

4. 查看GPIO状态

GPIO的状态实际上是由寄存器控制的,所以查看对应的寄存器的值就可以了,这里以PC13的高低电平为例。

完成第2步操作,进入调试后,如图选择。

先运行程序至断点。选择ODR13,勾选代表寄存器的数值为1,未勾选为0。

勾选与否能够控制LED灯的亮灭,可以尝试一下哈~

5. 快速查找变量定义

选择函数名或者变量名,按F12即可快速到达其定义的位置。

打开.h文件方法如下:

二. 程序框架说明

1. ADC采样

设置GPIO为模拟输入,应先查看芯片数据手册的引脚定义,看是否支持ADC。

2. 按键检测

使用有限状态机识别按钮的短按、长按,这样做可以避免延时消抖带来的阻塞问题,具体可参考笔者的这篇博客 https://blog.csdn.net/weixin_42268054/article/details/107393669

若要添加按钮,在key.h文件中增加按钮名(写在KEY_NUM之前),在key.c文件中添加初始化程序。

中断服务程序里面只进行变量的读写操作,不要添加耗时的程序!

3. 旋转编码器

使用上升沿触发中断,在中断服务程序里面检测旋转方向,而旋转编码器的按钮则当作普通的按键处理。

4. 永久存储用户数据(FLASH模拟EEPROM)

先捋一捋这三个概念:

FLASH闪存(程序存储空间)是C程序的存储位置。

SRAM是程序在运行时创建和操纵变量的地方。

EEPROM是可以用来存储长期信息的存储空间。

FLASH和EEPROM存储器是非易失性的(电源关闭后该信息仍然存在),SRAM是易失性的,重启后会丢失。(FLASH闪存存储器(PROGMEM)只能在程序刻录时填充。程序开始运行后,您将无法更改闪存中的值。)

由于STM32F103C8T6芯片中只有64k的FLASH,而没有EEPROM,所以我们使用FLASH的最后1页(64k分成了64页,所以1页是1k字节的存储空间)来永久存储数据。

我们把用户数据都存储在了setData结构体中,程序开始运行时,从最后一页的地址中读取对应字节至setData结构体中,就可以获取到用户数据了。

每次用户更改数据,直接修改setData结构体的变量值,再将结构体写入寄存器的地址即可。

如图两行代码实现以上操作。

5. 多级菜单

同样使用状态机的思想,定义结构体如下,其中最后一个函数指针即是要显示的界面函数。

OLED屏幕每一个界面都对应着一个显示函数,也拥有唯一的索引值(这里是0-13),可继续扩充。

具体可参考笔者这篇博客:https://blog.csdn.net/weixin_42268054/article/details/107613192


本文欢迎转载,请注明出处哈~

J20航模遥控器开源项目系列教程(三)开发说明 | 想要自己改造程序,扩充功能,怎么实现?的更多相关文章

  1. J20航模遥控器开源项目系列教程(一)制作教程 | 基础版V1.0发布,从0到1

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  2. J20航模遥控器开源项目系列教程(七)PPM输出 | 关于按键版本和旋转编码器版本的兼容说明、布局建议 | 关于MINI版PCB的兼容说明

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/J ...

  3. J20航模遥控器开源项目系列教程(五)| 制作STM32F0接收机,8路PWM输出,SBUS输出,PPM输出 | 加密狗无线化,畅玩飞行模拟器

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/J ...

  4. J20航模遥控器开源项目系列教程(二)使用说明 | 遥控器制作完成了,怎么用?

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  5. J20航模遥控器开源项目系列教程(四)PCB打印 | 嘉立创PCB下单教程,5元顺丰包邮解君愁!

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/J ...

  6. J20航模遥控器开源项目系列教程(六)亚克力外壳制作

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/J ...

  7. 致敬学长!J20航模遥控器开源项目计划【开局篇】 | 先做一个开机界面 | MATLAB图像二值化 | Img2Lcd图片取模 | OLED显示图片

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  8. Laravel大型项目系列教程(三)之发表文章

    Laravel大型项目系列教程(三)之发表文章 一.前言 上一节教程中完成了用户管理,这节教程将大概完成发表Markdown格式文章并展示的功能. 二.Let's go 1.数据库迁移 文章模块中我们 ...

  9. ABP框架搭建项目系列教程基础版完结篇

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...

随机推荐

  1. springboot(九)文件上传

    在企业级项目开发过程中,上传文件是最常用到的功能.SpringBoot集成了SpringMVC,当然上传文件的方式跟SpringMVC没有什么出入.下面我们来创建一个SpringBoot项目完成单个. ...

  2. HTML骨架

    本文只是复习HTML笔记 html 骨架: DTD:文档类型定义,规定了使用哪个版本的html规范 html 标签:双标签,表示整个网页 head 标签: 配置HTML页面 title: 网页标题 m ...

  3. 缓存利器、Lua模块下的共享内存

    上一节讲到了worker进程的共享内存,它利用丰富的指令使数据的缓存操作变得非常简单,但它也存在一些缺点. 1.worker进程之间会有锁竞争,在高并发的情况下会增加性能开销.2.只支持Lua布尔值. ...

  4. 06_Python基础课程

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"软件测试"获取视频和教程资料! b站在线视频 Pyth ...

  5. MySQL数据库常见命令

    数据库的操作 MySQL服务器的常见命令 开启:sudo service mysql start关闭:sudo service mysql stop重启:sudo service mysql rest ...

  6. 51nod 1584 加权约数和 约数和函数小trick 莫比乌斯反演

    LINK:加权约数和 我曾经一度认为莫比乌斯反演都是板子题. 做过这道题我认输了 不是什么东西都是板子. 一个trick 设\(s(x)\)为x的约数和函数. 有 \(s(i\cdot j)=\sum ...

  7. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

  8. luogu P5826 【模板】子序列自动机 主席树 vector 二分

    LINK:子序列自动机 想了一些很有趣的做法. dp 容易看出 f[i][j]表示前i个数匹配了j个数的dp 不过复杂度很高. 贪心 容易想到匹配的时候每个数字尽量往前匹配 这样显然是最优的 复杂度Q ...

  9. Docker学习日记-安装Docker

    Docker是什么: 简单理解就是基于go语言开发的开源的应用容器引擎. 对进程进行封装隔离,属于操作系统层面的虚拟化技术. Docker的优势: 1.更高效的利用系统资源 2.更快速的启动时间 3. ...

  10. Spring 参数注入

    一个(类)Bean可能包含多种属性,这些属性怎么配置???  见下: 用People  Dog Cat Tiger  Panda五个类来学习一些常用的=_= 重点在XML <!--基本类型注入- ...