J20航模遥控器开源项目系列教程(三)开发说明 | 想要本身改造程序,扩充功能,怎么实现?


咱们的开源宗旨:自由 协调 开放 合做 共享git

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

和一群志同道合的人,作本身所热爱的事!数组

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

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

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

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

一. KEIL5使用技巧

1. 美化编辑界面

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

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

 

 

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

将其复制到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结构体的变量值,再将结构体写入寄存器便可。

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

注意程序的总大小不能超过63k字节,即Code+RO Data+RW Data会烧录进FLASH中,18140+9468+2124=29732(再除以1024,约29k)

程序运行的时候:RW Data + ZI Data。

5. 多级菜单

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

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

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

 

 

写在最后

首先感谢项目中全部的贡献者!(截止2020.08.20)

 * 蔡子CaiZi(B站up主)  https://space.bilibili.com/349576976
 * A-XIN;
 * 小何;
 * ZL_Studio(B站up主)https://space.bilibili.com/364251289
 * 王每天@WangTiantian139  https://wangtiantian139.github.io/
 * 刘桶桶;
 * 简繁;
 * 王博;
 * 与非门;
 * Talons;
 * 大米粥;
 * P a S S ||;

特别感谢正点原子提供的STM32例程和开源社区http://www.openedv.com/

因为笔者学业繁忙,时间有限,没法投入过多的精力,因此欢迎更多学有余力的模友,加入到项目的开发和维护工做中哈,如今基础的程序框架已经搭建完成,剩下的要作的就是填充、优化和扩展了,有意愿的模友加群后请私聊群主喔~

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


 

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

 

相关文章
相关标签/搜索