引言:这里我采用的实验平台可能跟大家的不太一样,文章的图像是一块资源拓展板, 主控板式fs_mp1a, 该板子的SOC是stm32mp157a, 有两个内核一个A7, 一个M4.但是实验的流程肯定都是一样的, 因为都是裸机程序嘛。
一、按键简介
在单片机应用中,按键是一种常见的输入设备,用于接收用户的操作信号。按键通常由金属触点和弹簧组成,当按键被按下时,触点闭合,产生一个输入电平信号。
以下是关于单片机中使用的按键的一些简要说明:
1. 使用方法:按下按键,则按键闭合,单片机可以检测到按键的状态变化。可以通过轮询(Polling)或中断(Interrupt)的方式来检测按键的状态。
2. 接线方法:按键通常需要连接到单片机的IO口上。按键一端连接到单片机的IO引脚,另一端连接到电源或地线。为了防止按键抖动的干扰,可以在按键与IO引脚之间添加一个适量的电容或者使用软件消抖算法。
3. 按键状态检测: - 轮询方式:在主循环中通过查询IO口的电平状态来检测按键是否按下。缺点是资源浪费,需要不断轮询IO口,可能造成系统响应慢。 - 中断方式:通过将按键引脚配置为中断引脚,在按键状态改变时触发中断,单片机可以立即响应。这种方式能够减少对处理器资源的占用。
4. 按键的多功能应用:通过编程的方式,可以实现按键的多功能应用,例如单击、长按、双击等不同动作触发不同的事件。
5. 按键防抖:由于按键本身的物理性质,可能会出现按键抖动问题。为了消除抖动的影响,可以设置一个适当的延迟时间,在此时间范围内检测到按键的变化,才认定为有效按键。 总之,在单片机应用中,按键的使用可以方便地实现用户交互,增加了单片机系统的灵活性和可操作性。
二、 实验步骤
1. 查看按键原理图
可以看到, 当按键按下,与KEY1网络标号相连接的引脚读到的将是低电平
2. 配置工程
将KEY1对应的引脚配置为输入模式, 也可以将其配置为GPIO的外部中断模式, 这里也就是上面按键介绍的类中工作模式一种是轮询, 一种是中断异步的方式。这里采用的是第二种实验方式。
大家不要奇怪我的SOC的封装怎么这么奇怪, 这里给大家介绍一下SOC的常见封装。
SOC(System on a Chip)是指将所有系统功能集成到一颗芯片中的集成电路。它集成了处理器、存储器、外设接口、电源管理等功能,使得一个完整的计算系统能够放入一个单一的芯片中。SOC芯片是现代嵌入式系统中常见的核心组件。
常见的SOC封装有以下几种:
1. BGA(Ball Grid Array)封装:BGA封装是目前应用最广泛的封装之一,芯片底部有一定数量的焊点球形排列成网状,通过焊接与印刷电路板(PCB)相连接。它具有密集的引脚布局和良好的热散发能力,适用于高性能和高集成度的SOC芯片。
2. LGA(Land Grid Array)封装:LGA封装与BGA非常相似,芯片的引脚以方形或长方形排列在芯片底部,通过焊接连接到PCB。LGA封装通常比BGA封装更容易维修和更容易替换。 3. QFN(Quad Flat No-leads)封装:QFN封装是一种表面焊接封装,引脚位于封装底部的芯片引脚焊盘上,没有外露引脚。它具有尺寸小、体积小、成本低、性能良好等优点,适用于小型和低功耗的SOC芯片。
4. LQFP(Low-profile Quad Flat Package)封装:LQFP封装是一种具有四个平坦的边框和引脚的封装,引脚沿封装底部延伸。LQFP封装具有良好的热散发能力和可靠性,并且广泛应用于各种芯片封装。
5. CSP(Chip Scale Package)封装:CSP封装是一种非常紧凑的封装形式,芯片尺寸接近封装的尺寸,因此称为芯片级封装。它具有小尺寸、低成本、低功耗等优点,适用于小型和低功耗SOC芯片的集成。
这些是SOC芯片常见的几种封装类型,不同的封装具有不同的特点和适用场景,开发者可以根据具体需求选择合适的封装来设计和应用SOC芯片。
这里博主采用的实验平台是引脚处于soc下面的封装形式。
3. 函数编写
在这个位置可以找到我们的中断处理函数的定义
下面让我们一起追一下这个代码, 可以看到在这个中断处理函数中调用了别的函数, 这种函数的专业术语叫做非叶子函数。让我们跳过去看一下这个函数。
在这个函数中我们可以看到,这个函数根据我们设置的中断触发方式区分了一下调用的函数, 也就是图中光标的所在位置的那个函数。
我们再跳转, 对了, 跳转时鼠标右键, 打开声明那一项。
这个函数之前的__weak是一个__atrribute__参数属性, 这个符号的可以弱化这个函数符号, 当在整个的工程中出现这个函数名时, 也就是强符号, 就是我们可以对这个函数进行重写,类似C++中的多态, 这个__weak修饰的函数可以理解为基类中的虚函数。
接着我们对这个函数进行重写, 在里面完成我们想要的代码逻辑
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == GPIO_PIN_9) {if(HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_9) == GPIO_PIN_RESET) {GPIO_LED1_TOOGLE();GPIO_LED2_TOOGLE();GPIO_LED3_TOOGLE();}}
}
到这里还不算完, 记得根据自己实验的平台判断按键是否需要消去机械抖动。