杰理AC692X---GPIO按键

本文详细介绍如何配置GPIO按键,包括宏定义的开启、按键引脚的修改、按键功能的设定及长按时间的调整。适用于嵌入式系统开发人员,帮助理解和实现GPIO按键控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GPIO按键介绍

打开按键宏定义

把以下位置的GPIO按键宏定义置1:

这样我们就选择了使用GPIO按键了。

按键引脚修改

这里我们定义了IO_KEY_ONLY_ONE,所以只有一个按键,引脚使用的是PR2引脚,如果想用多个按键,则注销IO_KEY_ONLY_ONE这个宏定义,然后参照下面额#else后面的KEY_INIT()去增加自己的按键引脚定义。

 

 

 

 

然后打开IO按键的C文件:

 

可以看到当KEY0按下时,键值返回0,这个0对应到按键列表里面的0,如下:

意思是当KEY0按下是,执行MSG_BT_PP这个消息,这个消息就是控制手机的音乐播放暂停的功能。另外按键还可以分为长按、按住、长按抬起的功能:

这里做的功能是长按关机,至于关机长按时间的设置在如下位置:

根据项目需求,改成符合项目的值即可。

 

 

 

在692X的SDK中,各个模式(U盘,AUX,FM,蓝牙)的按键消息是分开的,都需要单独配置,跟上面以蓝牙按键为例的配置是一样的:

### 杰理AC696X芯片实现按键开机功能 对于杰理AC696X芯片而言,在实现按键开机这一特性时,需关注几个方面来确保配置正确无误。通常情况下,这类操作涉及到初始化特定的GPIO端口作为输入用于检测按键状态,并编写相应的中断服务程序处理按键事件。 #### GPIO设置 在`board_config.h`文件中定义与按键相连的GPIO引脚模式。这一步骤至关重要,因为只有当引脚被正确定义为输入之后才能响应外部信号变化。例如: ```c #define KEY_GPIO_PORT GPIOA /* 假设按键连接到了PA0 */ #define KEY_PIN LL_GPIO_PIN_0 ``` 此部分设定应当依据实际硬件连线情况调整相应参数[^1]。 #### 中断配置 为了提高系统的实时性和效率,建议采用边沿触发方式捕获按键按下动作并产生中断请求IRQ。通过修改启动代码中的向量表项指向自定义的服务例程ISR可以完成此项工作。下面是一个简单的模板用来说明如何注册一个针对指定GPIO通道的上升沿/下降沿敏感型中断源: ```c void EXTI0_IRQHandler(void){ if(LL_EXTI_IsActiveFallingFlag_0_31(LL_EXTI_LINE_0)!= RESET){ // 清除标志位以防重复进入该函数体内部逻辑执行区域 LL_EXTI_ClearFallingFlag_0_31(LL_EXTI_LINE_0); // 执行上电重启或其他所需的任务... } } ``` 值得注意的是,上述代码片段仅为示意用途;具体实现细节可能因不同版本固件库而有所差异[^2]。 #### 软件去抖动机制 机械开关存在接触不稳定的问题即所谓的“弹跳”,它会在短时间内造成多次高低电压转换从而影响正常判断。因此有必要加入一段延时循环等待一段时间后再确认最终读取的状态值是否稳定不变。考虑到精度要求不高以及资源占用率等因素,这里推荐利用内置定时器而非依赖于CPU周期计数来进行短时间间隔测量[^3]。 #### 完整示例代码框架 综合以上几点考虑,给出如下所示的一个较为完整的C语言编程范例供参考学习之用: ```c #include "ac696x_hal.h" // 初始化全局变量存储当前系统运行状态 volatile uint8_t system_state = SYSTEM_OFF; int main(){ HAL_Init(); // 系统初始化 SystemClock_Config(); // 设置系统时钟频率 MX_GPIO_Init(); // 配置外设IO口属性 while (true){ switch(system_state){ case SYSTEM_ON : // 进入待机监听模式准备接收指令... break; default : // 默认状态下保持低功耗休眠直至唤醒条件满足为止 __WFI(); } } } /** * @brief 外部中断回调函数 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ static uint32_t last_press_time=0; if(GPIO_Pin == KEY_PIN && ((HAL_GetTick()-last_press_time)>DEBOUNCE_DELAY)){ last_press_time = HAL_GetTick(); if(system_state==SYSTEM_OFF){ PowerOnSequence(); // 启动电源序列 system_state = SYSTEM_ON; }else{ EnterSleepMode(); // 或者其他行为取决于应用场景需求 } } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jim天河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值