RK809搞一下长按PWR键重启

2 篇文章 1 订阅
1 篇文章 0 订阅

拿到的源码默认长按关机,短按开机,

不要长按关机,

只要长按重启

那么看一下规格书:

看一下驱动:

没有做这个寄存器的配置?i2cset测试一下:

i2cget -f -y 0 0x20 0xf7
0x86
默认是86,长按关机,

那自己加一下试试:

i2cset -f -y 0 0x20 0xf7 0xc6

测试成功。

自己加一下寄存器初始化:

/* power down configuration 0xf7 */
#define RK817_PWR_KEY_LONG_PRESS_MASK        BIT(6)
#define RK817_PWR_KEY_LONG_PRESS_H            BIT(6)
#define RK817_PWR_KEY_LONG_PRESS_L            (0)

 

static const struct rk808_reg_data rk817_pre_init_reg[] = {

    {RK817_RTC_CTRL_REG, RTC_STOP, RTC_STOP},
    {RK817_GPIO_INT_CFG, RK817_INT_POL_MSK, RK817_INT_POL_L},
    {RK817_SYS_CFG(1), RK817_HOTDIE_TEMP_MSK | RK817_TSD_TEMP_MSK,
                       RK817_HOTDIE_105 | RK817_TSD_140},
    {RK817_PMIC_PWRON_KEY,RK817_PWR_KEY_LONG_PRESS_MASK,RK817_PWR_KEY_LONG_PRESS_H}
                       
};

 

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino和STM32都是常用的单片机开发板,用于各种电子项目和嵌入式系统的开发。下面我将用300字介绍如何使用这两种开发板编写按按和短按的程序。 对于Arduino开发板,可以使用内置的库函数来实现按按和短按的功能。首先,需要通过数字IO口连接一个机械按并设置为输入模式。然后,在程序中设置一个计时器,用来检测按的按下时间。通过判断按按下的持续时间来确定是按还是短按。 以下是Arduino的示例代码: ```Arduino const int buttonPin = 2; // 连接按的数字IO口 int buttonState = 0; // 按状态 unsigned long buttonTimer = 0; // 按计时器 bool isLongPress = false; // 是否按 void setup() { pinMode(buttonPin, INPUT); Serial.begin(9600); } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { if (buttonTimer == 0) { buttonTimer = millis(); // 记录按下的起始时间 } } else { if (buttonTimer != 0) { if (millis() - buttonTimer > 1000) { isLongPress = true; } else { isLongPress = false; } buttonTimer = 0; // 清空计时器 } } if (isLongPress) { Serial.println("Button long press"); } else { Serial.println("Button short press"); } delay(100); // 延时100毫秒 } ``` 对于STM32开发板,可以使用CubeMX和HAL库来实现按按和短按的功能。首先,在CubeMX中配置按对应的GPIO口,并设置为输入模式。然后,在程序中使用HAL库提供的函数来检测按的状态和按下时间。通过判断按按下的持续时间来确定是按还是短按。 以下是STM32的示例代码: ```C #include "main.h" #include "stdio.h" #include "stm32f1xx_hal.h" GPIO_TypeDef* BUTTON_GPIO_Port = GPIOA; uint16_t BUTTON_Pin = GPIO_PIN_0; uint32_t buttonTimer = 0; _Bool isLongPress = 0; void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { if (HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin) == GPIO_PIN_SET) { if (buttonTimer == 0) { buttonTimer = HAL_GetTick(); } } else { if (buttonTimer != 0) { if (HAL_GetTick() - buttonTimer > 1000) { isLongPress = 1; } else { isLongPress = 0; } buttonTimer = 0; } } if (isLongPress) { printf("Button long press\n"); } else { printf("Button short press\n"); } HAL_Delay(100); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /**Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /**Configure the SYSCLKSource, HCLK, PCLK1 and PCLK2 clocks dividers */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_AFIO_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 以上就是使用Arduino和STM32开发板编写按按和短按程序的方法。你可以根据自己的需求进行修改和扩展。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值