首页 论坛 原厂专区 ST MCU (干货)【正点原子】阿波罗STM32H743开发板初学习和自己用的按键检测程序

发帖 回复

[分享] (干货)【正点原子】阿波罗STM32H743开发板初学习和自己用的按键检测程序
6123 查看
32 回复
 楼主 | 发布于 2018-07-14 | 只看楼主
分享到:

    首先先在这儿跟郑总说个抱歉,我的问题,抱歉。

    申请的时候有承诺每周至少发一篇帖子,上一周自己的问题一直没弄,这次算上周的。还望大佬下手的时候轻点儿

    上周末就跑了个例程所以也不知道该发什么内容,想着既然发帖子就应该对看帖子的朋友有些作用,此帖的主要说的是我刚开始学STM32H743的过程和遇到的问题,以及分享一个我做项目用的移植别人的关于按键检测的程序。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

一、初学习

    我是直接学习HAL库的例程,新手学习一个新的片子的时候会有一种不知道从哪下手的感觉,此次我既然是学习H7就想要学到位。先是对原子哥开发板对应的资料结构有一定的了解之后,我跟着《STM32H7开发指南-HAL库版本_尝鲜版_V1.0》这个文档开始H7的学习,从头一页一页的看,原子哥的这篇文档讲得非常详细,让一个有些基础的新手很容易就上手H7的学习,为了学的放心,从第一页到我现在看到的第六章,没有拉下一页。从中了解到了HAL库的原理,STM32CubeMX的使用方法,以及对H7架构和时钟树有了初步的了解。原子哥的这个文档已经讲的足够详细了,所以我也不再赘述,这里讲一下我学习文档过程中发现的一些问题。

    1)PDF文件加密了

    可能是为了让PDF文档排版不乱,原子哥的《STM32H7开发指南-HAL库版本_尝鲜版_V1.0》PDF文档是加密的,这样的话PDF中我需要记录的一些东西就没办法复制了。之前有遇到过这种问题,网上有很多在线解密的网站,将文档传上去解密一下就好了,https://smallpdf.com/cn/unlock-pdf,这个是我用的解密的网址,解密后就能复制了,但是复制完粘贴的时候会重复粘贴,还需要自己删减,有朋友有良好的解决方案的话可以分享一下~

    2)个人认为需要稍微修改的地方


    关于中间两张寻找定义的图片我认为比较矛盾,参考《STM32H7开发指南-HAL库版本_尝鲜版_V1.0》第82页内容,如下图,

       因为Target->Output->Browse Information选项是设置我们能否查看参数、结构体或者函数定义的,文档已经有说明,选择Browse Information选项编译会很慢,我也验证了,确实很慢,那不选择的话就没法通过Go To Define的方式查找参数的定义了,我用的方法是Ctrl+Shfit+F查找全局的方法去查找对应的参数,但是仍然很不方便。不知道小伙伴谁有没有好的方法,我有想到用Source Insight这个软件查看变量,还没有尝试,以后尝试下。


二、按键识别

       因为一页一页边看边理解《STM32H7开发指南-HAL库版本_尝鲜版_V1.0》这个文档花了好几个晚上看,才看到按键,光按键识别没有什么东西,也就几个IO口输入的问题嘛,这次我主要就是想分享一个关于按键识别的程序。

       关于按键,这里请大家思考一下如何不用while识别一个按键的单次、双次和长按的按键状态,那如果识别多个按键的呢?相信做过项目的朋友们都有自己的处理方法,我分享一个我做项目用的移植别人的方法,相信如果之前没接触过这方面的朋友看过一定会对你有用的。


关于该按键的介绍我直接转载那篇我看到的文章

MultiButton

简介

MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。


使用方法

1.先申请一个按键结构


struct Button button1;

2.初始化按键对象,绑定按键的GPIO电平读取接口read_button_pin() ,后一个参数设置有效触发电平

button_init(&button1, read_button_pin, 0);

3.注册按键事件

button_attach(&button1, SINGLE_CLICK, Callback_SINGLE_CLICK_Handler);
button_attach(&button1, DOUBLE_CLICK, Callback_DOUBLE_Click_Handler);
...

4.启动按键

button_start(&button1);

5.设置一个5ms间隔的定时器循环调用后台处理函数

while(1) {
    ...
    if(timer_ticks == 5) {
        timer_ticks = 0;
        
        button_ticks();
    }
}

特性

MultiButton 使用C语言实现,基于面向对象方式设计思路,每个按键对象单独用一份数据结构管理:

struct Button {
	uint16_t ticks;
	uint8_t  repeat: 4;
	uint8_t  event : 4;
	uint8_t  state : 3;
	uint8_t  debounce_cnt : 3; 
	uint8_t  active_level : 1;
	uint8_t  button_level : 1;
	uint8_t  (*hal_button_Level)(void);
	BtnCallback  cb[number_of_event];
	struct Button* next;
};

这样每个按键使用单向链表相连,依次进入 button_handler(struct Button* handle) 状态机处理,所以每个按键的状态彼此独立。

按键事件

事件 说明
PRESS_DOWN 按键按下,每次按下都触发
PRESS_UP 按键弹起,每次松开都触发
PRESS_REPEAT 重复按下触发,变量repeat计数连击次数
SINGLE_CLICK 单击按键事件
DOUBLE_CLICK 双击按键事件
LONG_RRESS_START 达到长按时间阈值时触发一次
LONG_PRESS_HOLD 长按期间一直触发

Examples

#include "button.h"

struct Button btn1;

int read_button1_GPIO() 
{
	return HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
}

int main()
{
	button_init(&btn1, read_button1_GPIO, 0);
	button_attach(&btn1, PRESS_DOWN,       BTN1_PRESS_DOWN_Handler);
	button_attach(&btn1, PRESS_UP,         BTN1_PRESS_UP_Handler);
	button_attach(&btn1, PRESS_REPEAT,     BTN1_PRESS_REPEAT_Handler);
	button_attach(&btn1, SINGLE_CLICK,     BTN1_SINGLE_Click_Handler);
	button_attach(&btn1, DOUBLE_CLICK,     BTN1_DOUBLE_Click_Handler);
	button_attach(&btn1, LONG_RRESS_START, BTN1_LONG_RRESS_START_Handler);
	button_attach(&btn2, LONG_PRESS_HOLD,  BTN1_LONG_PRESS_HOLD_Handler);
	button_start(&btn1);
	
	//make the timer invoking the button_ticks() interval 5ms.
	//This function is implemented by yourself.
	__timer_start(button_ticks, 0, 5); 
	
	while(1) 
	{}
}

void BTN1_PRESS_DOWN_Handler(void* btn)
{
	//do something...
}

void BTN1_PRESS_UP_Handler(void* btn)
{
	//do something...
}

...


转自: https://github.com/0x1abin/MultiButton        


      以上就是该按键程序的简介,它是以面向对象的思维写的程序,当使用过后就会知道该程序的优势了,我会上传到附件里。

      我这里还有另外一个同样原理的按键检测程序,会传到附件上去。

      既然是基于阿波罗STM32H743开发板学习的分享,我将我之前在项目中使用的与上面介绍原理相似的程序移植到了阿波罗STM32H743开发板上,并且用SYSTIC中断写了时间片程序的框架,这里主要讲按键。


使用方法

1.先申请一个按键结构

2.初始化按键对象,绑定按键的GPIO电平读取接口KEY0、KEY1、KEY2


3.创建(注册)一个按键,相当于是初始化Key结构体变量。


4.设置一个10ms间隔的定时器循环调用后台处理函数


5.查看按键状态做出处理




我移植的程序也会发到附件里,该按键程序的思维非常值得借鉴,脱离硬件层,直接面向对象的方式,在使用过程中我用着还是很顺手的。


这次分享就这些了,再次说声,抱歉,这周的分享会在周日发出~~


做出一个臆想,我在WORD里面把要发的东西排好版,如果直接能够复制粘贴到我们融创这个发帖页面就好了,排的版还不乱,那就更方便了。中间误关闭了一次网页,气死了


最后感谢原子哥!感谢郑总!感谢融创!愿大佬事业越来越好~~


 

本帖有更多资源,需 登录 才可以下载,没有帐号?立即 注册

(0 ) (0 )
回复 举报

楼主 | 回复于 2018-07-14 沙发

字体弄的小了,发现阅读起来比较费劲,下次改正,晚安啦
(0 )
评论 (1) 举报

回复于 2018-07-14 2#

挺好 的
(0 )
评论 (1) 举报

回复于 2018-07-14 3#

挺好 的
(0 )
评论 (0) 举报

回复于 2018-07-14 4#

挺好 的
(0 )
评论 (0) 举报

回复于 2018-07-14 5#

挺好 的
(0 )
评论 (0) 举报

回复于 2018-07-14 6#

挺好 的
(0 )
评论 (0) 举报

回复于 2018-07-14 7#

挺好 的
(0 )
评论 (0) 举报

回复于 2018-07-14 8#

挺好 的
(0 )
评论 (0) 举报

回复于 2018-07-14 9#

挺好 的
(0 )
评论 (0) 举报

回复于 2018-07-14 10#

感谢分享;
(0 )
评论 (1) 举报
发表回复
0/3000





举报

请选择举报类别

  • 广告垃圾
  • 违规内容
  • 恶意灌水
  • 重复发帖

全部板块

返回顶部