stm32——按键(库函数版)

本文介绍了STM32中按键的处理,包括支持连续按和不支持连续按的两种模式,强调了响应优先级,并提到了在中断服务中使用volatile关键字的必要性,以避免编译器优化导致的未知问题。

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

不得不说进程太慢了

感觉很慌 但是干什么事情又非常的从容

学的很慢学着学着发现 不止是要学新东西 那些 以前早该知道的东西也忘了好多

还有 一定一定要好好学习 扩展知识面 什么东西都一定要学精

因为知识的封锁真的真的很可怕 很可怕 所以一定多学习 多动手 要加油

终于可以看这个的重点了 按键

就好像遥控器 当按下换频道的键时候我们一直按会一直换

 但是 当按下电源键的时候 即使一直按也只会开关一次而不会一直开关 知道松开之后再次按下 才会起作用

所以按键分为支持连续按和不支持连续按

首先支持连续按  

注意此函数有响应优先级,KEY0>KEY1>KEY_UP!!

u8 key_Scan(u8 mode)
{
	if(KEY0 == 0 || KEY1 == 0|| WK_UP == 1)   //key按键按下
	{
		delay_ms(10);
		if(KEY0 == 0)             //    if(key 确实按下)
			return KEY0_PRES;     //   返回按键值
		else if(KEY1 == 0)                
			return KEY1_PRES;
		else if(WK_UP == 1)
			return WKUP_PRES;
	}
	else if(KEY1 == 1 && KEY0 == 1 && WK_UP == 0)
	    return 0;                       //没有按键按下 返回无效值
}

如果不支持连续按

注意此

### STM32软件复位的库函数实现方法 STM32控制器提供了多种方式来实现软件复位功能。通过使用标准外设库或HAL库中的特定函数,可以轻松完成这一操作。以下是基于STM32标准外置库的一个典型实现方案。 #### 使用RCC寄存器触发系统复位 在STM32的标准外设库中,可以通过设置`RCC_CR`寄存器的`SYSRESETREQ`位来请求系统复位。具体代码示例如下: ```c void System_Reset(void) { RCC->APB2ENR |= RCC_APB2Periph_SYSCFG; // 启用SYSCFG时钟 SYSCFG->CFGR &= ~SYSCFG_CFGR_SW; // 设置SW为0b00,默认状态 NVIC_SystemReset(); // 触发系统复位 } ``` 此代码片段展示了如何利用NVIC模块下的`NVIC_SystemReset()`函数发起一次完整的系统复位过程[^1]。 #### HAL库中的软件复位实现 对于采用HAL库开发的应用程序而言,可以直接调用预定义好的API接口来进行软重启处理。下面给出了一种可能的方式: ```c #include "stm32f4xx_hal.h" // 执行硬件级别的全局重置动作 __attribute__((noreturn)) void Software_Reset(void){ HAL_NVIC_SystemReset(); } int main(){ ... Software_Reset(); // 当满足某些条件时调用该函数即可达到目的 while(1); } ``` 这里需要注意的是,在实际项目部署前应仔细阅读官方手册确认所使用的MCU型号支持此类操作以及其确切行为表现[^3]。 另外值得注意的一点是,无论是哪种途径达成最终目标——即让设备重新回到初始态并按照预定流程再次运行起来之前,请务必妥善保存重要数据以防丢失! #### 配合GPIO模拟外部按键中断引发复位事件 除了直接作用于内部机制之外,还可以借助外部电路配合指定引脚配置成相应模式从而间接达成同样效果。比如将某个普通IO口设定为准双向开漏输出形式连接至专用RESET管脚上,则只需简单拉低电平一段时间就能激活自动恢复序列了[^4]。 ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值