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

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

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

项目开源地址: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. Java基础之常用知识点博客汇总

    正则: 正则表达式 :https://www.cnblogs.com/lzq198754/p/5780340.html 正则表达式大全:https://blog.csdn.net/zpz2411232 ...

  2. Springboot(二)springboot之jsp支持

    参考恒宇少年的博客:https://www.jianshu.com/p/90a84c814d0c springboot内部对jsp的支持并不是特别理想,而springboot推荐的视图是Thymele ...

  3. 清晰架构(Clean Architecture)的Go微服务—重大升级

    去年,我创建了一个清晰架构(Clean Architecture)微服务框架,它功能强大,但有些重.我写了一个系列文章来讲述它,请参阅"清晰架构(Clean Architecture)的Go ...

  4. 数据库(十三):MySQL内置方法

    进击のpython ***** 数据库--MySQL内置方法 目录 数据库--MySQL内置方法 视图 增加 修改 删除 触发器 创建 使用 删除 存储过程 无参 有参 事务 代码实现 视图 视图是一 ...

  5. Linux版 乐影音下载器(视频下载器) 使用方法

    如果你不知道Linux为何物,那么请回去选择前两种下载方式之一. 只提供Linux 64位的乐影音下载器(点击下载),在Linux Mint 19.1  64位.Python 3.6环境下测试能正常运 ...

  6. PHP array_diff() 函数

    实例 比较两个数组的值,并返回差集: <?php $a1=array("a"=>"red","b"=>"gree ...

  7. Python time tzset()方法

    描述 Python time tzset() 根据环境变量TZ重新初始化时间相关设置.高佣联盟 www.cgewang.com 标准TZ环境变量格式: std offset [dst [offset ...

  8. PHP date_interval_format() 函数

    ------------恢复内容开始------------ 计算两个日期间的间隔,然后格式化时间间隔: 实例 <?php $date1=date_create("2013-01-01 ...

  9. DOM标签属性和对象属性

    DOM元素的属性分为两种 (1)标签属性 直接写在标签上的属性 (2)对象属性 由于所有的DOM元素都是Object类型,所以我们可以通过对象的方式为DOM元素设置属性 1.标签属性 (1)设置标签属 ...

  10. luogu P4590 [TJOI2018]游园会 dp套dp

    LINK:游园会 容易想到 设\(f[i][j][k][l]\)前i个字符 j表示状压的w个字符状态为j 长度<=k 匹配到了NOI的第l个位置的方案数. 不过只能得到30分. 考虑优化 其实优 ...