HAL STM32+EC11编码器实现增减调节及单击、双击、长按功能

HAL STM32+EC11编码器实现增减调节及单击、双击、长按功能


  • 📺实现效果演示:
    在这里插入图片描述

📘内容提要

  • 📝本文主要实现,通过STM32 HAL库开发,实现的EC11编码器功能,按键结合状态机思想实现的拓展单击、双击、长按的综合功能。单片机硬件上使用了2个外部中断引脚实现。
  • 🗝该功能可以很方便实现移植,例如使用在OLED屏幕显示菜单上。
  • 🔖验证对象:STM32F401
  • 🍁EC11编码器部分的原理图:
    在这里插入图片描述

🛠stm32cubemx配置

  • 🔧将EC11中键引脚配置为输入模式、开启内部上拉模式,其余2个引脚配置为外部中断引脚(一个配置为下降沿中断,另外一个配置为上、下降沿中断,这一点很关键!)。

在这里插入图片描述

✅EC11编码器增减功能,通过外部中断实现

  • 🌿外部中断回调处理函数:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{/* Prevent unused argument(s) compilation warning */UNUSED(GPIO_Pin);static uint8_t count = 0;static uint8_t b_flag;GPIO_PinState a_value = HAL_GPIO_ReadPin(EC11_A_GPIO_Port, EC11_A_Pin);GPIO_PinState b_value = HAL_GPIO_ReadPin(EC11_B_GPIO_Port, EC11_B_Pin);if(GPIO_Pin == EC11_A_Pin) {if(a_value == RESET && count == 0) {b_flag = 0;if(b_value) b_flag = 1;count = 1;}if(a_value == SET && count == 1) {if(b_value == RESET && b_flag == 1) { //开始逆时针转动test_num--;dir_flag = 1;}if(b_value && b_flag == 0) { //开始顺时针转动test_num++;dir_flag = 0;}count = 0;}}/* EC11中键,按键中断 */// if(GPIO_Pin == EC11_KEY_Pin)// {// key_click_flag = 1;// }
}

📓单击、双击、长按功能实现驱动代码

  • 📝KEY.C
#include "key.h"//代码来源网络 侵权联系删除
/*--------------------------------------------------------------------
|  short click                                                       |
|  ______                   ________                                 |
|     |  \                 /  |                                      |
|     |   \_______________/   |                                      |
|     |     |           |     |                                      |
|     |shake|  < long   |shake|                                      |
|                                                                    |-------------------------------------------------------------------
|  double click                                                      |
|  ______                   _____________                   ____     |
|     |  \                 /  |       |  \                 /  |      |
|     |   \_______________/   |       |   \_______________/   |      |
|     |     |           |     | < max |     |           |     |      |
|     |shake|  < long   |shake|dclick |shake|  any time |shake|      |
|                                                                    |--------------------------------------------------------------------
|  long click                                                        |
|  ______                                           ________         |
|     |  \                                         /  |              |
|     |   \_______________________________________/   |              |
|     |     |                                   |     |              |
|     |shake|             > long click          |shake|              |
|                                                                    |--------------------------------------------------------------------*/#define KEY_STATUS_DOWN_CHECK                0x00       
#define KEY_STATUS_DOWN_SHAKE                0x01
#define KEY_STATUS_DOWN_HANDLE               0x02
#define KEY_STATUS_LONG_CHECK                0x03
#define KEY_STATUS_SHORT_UP_SHAKE            0x04
#define KEY_STATUS_DOUBLE_CHECK              0x05
#define KEY_STATUS_SHORT_UP_HANDLE           0x06
#define KEY_STATUS_DOUBLE_DOWN_SHAKE         0x07
#define KEY_STATUS_DOUBLE_UP_CHECK           0x08
#define KEY_STATUS_DOUBLE_UP_SHAKE           0x09
#define KEY_STATUS_DOUBLE_UP_HANDLE          0x0a
#define KEY_STATUS_LONG_HANDLE               0x0b
#define KEY_STATUS_CONTINUE_CHECK            0x0c
#define KEY_STATUS_LONG_UP_SHAKE             0x0d
#define KEY_STATUS_LONG_UP_HANDLE            0x0e#define KEY_READ_DOWN                        0x00  /* key is pressed          */
#define KEY_READ_UP                          0x01  /* Key isn't pressed       */ #define KEY_BUF_SIZE                         0x10  /* key value buffer size   */struct
{unsigned short value[KEY_BUF_SIZE];unsigned char rd;unsigned char wr;
}key_buf;struct key_dev
{unsigned char status;              /* state machine status                */unsigned char num;                 /* number                              */unsigned short count_ms;           /* ms counter                          */unsigned short long_click_ms;      /* long click check min time           */unsigned short shake_filter_ms;    /* shake filter time                   */unsigned short max_dclick_ms;      /* double click max interval time      */unsigned short continue_send_ms;   /* after long, continue send interval  */unsigned char (*read_key)(void);   /* key read pin status function pointer*/
};/******************************************************************************User Interface [START]
*******************************************************************************/unsigned char key0_read(void)
{if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET){return KEY_READ_DOWN;}else{return KEY_READ_UP;}
}struct key_dev key_dev[] = {{KEY_STATUS_DOWN_CHECK,KEY0_NUM,0,1500,20,300,1000,(unsigned char (*)(void))key0_read,},/*..user add other key ..*/};/******************************************************************************User Interface [END]
*******************************************************************************/static void key_write_value(unsigned short key_val);
static void key_status_down_check(struct key_dev *key_dev);
static void key_status_down_shake(struct key_dev *key_dev);
static void key_status_down_handle(struct key_dev *key_dev);
static void key_status_long_check(struct key_dev *key_dev);
static void key_status_short_up_shake(struct key_dev *key_dev);
static void key_status_double_check(struct key_dev *key_dev);
static void key_status_short_up_handle(struct key_dev *key_dev);
static void key_status_double_down_shake(struct key_dev *key_dev);
static void key_status_double_up_check(struct key_dev *key_dev);
static void key_status_double_up_shake(struct key_dev *key_dev);
static void key_status_double_up_handle(struct key_dev *key_dev);
static void key_status_long_hanle(struct key_dev *key_dev);
static void key_status_continue_check(struct key_dev *key_dev);
static void key_status_long_up_shake(struct key_dev *key_dev);
static void key_status_long_up_handle(struct key_dev *key_dev);/**
description : write key vaule to buffer
param :  key_val - key value , (KEY_EVENT | KEY_NUMBER<<8) 
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_write_value(unsigned short key_val)
{   key_buf.value[key_buf.wr++] = key_val;key_buf.wr %= KEY_BUF_SIZE;/*overflow handle*/if(key_buf.wr == key_buf.rd){key_buf.rd++;key_buf.rd %= KEY_BUF_SIZE;}
}/**
description : read key vaule from buffer
param : None
retval : key_val - key value , (KEY_EVENT | KEY_NUMBER<<8)
author : huohongpeng
data : 2017-03-02
*/
unsigned short key_read_value(void)
{unsigned short key_val;if(key_buf.wr == key_buf.rd){key_val = KEY_EVENT_NULL;}else{key_val = key_buf.value[key_buf.rd++];key_buf.rd %= KEY_BUF_SIZE;}return key_val;
}/**
description : check key whether press down
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_down_check(struct key_dev *key_dev)
{unsigned char key_read;key_read = key_dev->read_key();if(key_read == KEY_READ_DOWN){key_dev->status = KEY_STATUS_DOWN_SHAKE;key_dev->count_ms = 0;}
}/**
description : filter shake after key pressed down
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_down_shake(struct key_dev *key_dev)
{unsigned char key_read;key_dev->count_ms++;if(key_dev->count_ms < key_dev->shake_filter_ms){return;}key_read = key_dev->read_key();if(key_read == KEY_READ_DOWN){key_dev->status = KEY_STATUS_DOWN_HANDLE;}else{key_dev->status = KEY_STATUS_DOWN_CHECK;}
}/**
description : key press down handle after pressed down filter shake  
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_down_handle(struct key_dev *key_dev)
{unsigned short key_val = key_dev->num<<8 | KEY_EVENT_DOWN;key_write_value(key_val);key_dev->status = KEY_STATUS_LONG_CHECK;key_dev->count_ms = 0;}/**
description : check key whether long click   
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_long_check(struct key_dev *key_dev)
{unsigned char key_read;key_dev->count_ms++;key_read = key_dev->read_key();if(key_dev->count_ms < key_dev->long_click_ms){if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_SHORT_UP_SHAKE;                 }return;}key_dev->status = KEY_STATUS_LONG_HANDLE;            }/**
description : short cilck key up filter shake   
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_short_up_shake(struct key_dev *key_dev)
{unsigned char key_read;static unsigned short old = 0xffff;if(old == 0xffff){old = key_dev->count_ms;key_dev->count_ms = 0;}key_dev->count_ms++;if(key_dev->count_ms < key_dev->shake_filter_ms){return;}key_read = key_dev->read_key();if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_DOUBLE_CHECK;key_dev->count_ms = 0;}else{key_dev->status = KEY_STATUS_LONG_CHECK;key_dev->count_ms += old;        }old = 0xffff;
}/**
description : double cilck check. we consider double click event if key pressed down when after short click up and within max double click interval
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_double_check(struct key_dev *key_dev)
{unsigned char key_read;key_dev->count_ms++;key_read = key_dev->read_key();if(key_dev->count_ms < key_dev->max_dclick_ms){if(key_read == KEY_READ_DOWN){key_dev->status = KEY_STATUS_DOUBLE_DOWN_SHAKE;key_dev->count_ms = 0;                 }}else{key_dev->status = KEY_STATUS_SHORT_UP_HANDLE;            }}/**
description : short click key up handle
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_short_up_handle(struct key_dev *key_dev)
{unsigned short key_val;key_val= key_dev->num<<8 | KEY_EVENT_SHORT;key_write_value(key_val);key_val= key_dev->num<<8 | KEY_EVENT_UP_SHORT;key_write_value(key_val);key_dev->status = KEY_STATUS_DOWN_CHECK;
}/**
description : double click key down filter shake
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_double_down_shake(struct key_dev *key_dev)
{unsigned char key_read;static unsigned short old = 0xffff;if(old == 0xffff){old = key_dev->count_ms;key_dev->count_ms = 0;}key_dev->count_ms++;if(key_dev->count_ms < key_dev->shake_filter_ms){return;}key_read = key_dev->read_key();if(key_read == KEY_READ_DOWN){unsigned short key_val;key_val= key_dev->num<<8 | KEY_EVENT_DOUBLE;key_write_value(key_val);key_dev->status = KEY_STATUS_DOUBLE_UP_CHECK;key_dev->count_ms = 0;}else{key_dev->status = KEY_STATUS_DOUBLE_CHECK;key_dev->count_ms += old;        }old = 0xffff;
}/**
description : double click key up check
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_double_up_check(struct key_dev *key_dev)
{unsigned char key_read;key_read = key_dev->read_key();if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_DOUBLE_UP_SHAKE;key_dev->count_ms = 0;}
}/**
description : double click key up filter shake
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_double_up_shake(struct key_dev *key_dev)
{unsigned char key_read;key_dev->count_ms++;if(key_dev->count_ms < key_dev->shake_filter_ms){return;}key_read = key_dev->read_key();if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_DOUBLE_UP_HANDLE;}else{key_dev->status = KEY_STATUS_DOUBLE_UP_CHECK;}}/**
description : double click key up handle
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_double_up_handle(struct key_dev *key_dev)
{unsigned short key_val;key_val= key_dev->num<<8 | KEY_EVENT_UP_DOUBLE;key_write_value(key_val);key_dev->status = KEY_STATUS_DOWN_CHECK;
}/**
description : long click handle after long click check
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_long_hanle(struct key_dev *key_dev)
{unsigned short key_val;key_val= key_dev->num<<8 | KEY_EVENT_LONG;key_write_value(key_val);key_dev->status = KEY_STATUS_CONTINUE_CHECK;key_dev->count_ms = 0;
}/**
description : continue send short click if long click time overflow
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_continue_check(struct key_dev *key_dev)
{unsigned char key_read;unsigned short key_val;key_dev->count_ms++;key_read = key_dev->read_key();if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_LONG_UP_SHAKE;}if(key_dev->count_ms < key_dev->continue_send_ms){return;}if(key_dev->continue_send_ms == 0){return;}key_val= key_dev->num<<8 | KEY_EVENT_SHORT;key_write_value(key_val);key_dev->count_ms = 0;
}/**
description : long click key up filter shake
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_long_up_shake(struct key_dev *key_dev)
{unsigned char key_read;static unsigned short old = 0xffff;if(old == 0xffff){old = key_dev->count_ms;key_dev->count_ms = 0;}key_dev->count_ms++;if(key_dev->count_ms < key_dev->shake_filter_ms){return;}key_read = key_dev->read_key();if(key_read == KEY_READ_UP){key_dev->status = KEY_STATUS_LONG_UP_HANDLE;}else{key_dev->status = KEY_STATUS_CONTINUE_CHECK;key_dev->count_ms += old;      }old = 0xffff;
}/**
description : long click key up filter handle
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_status_long_up_handle(struct key_dev *key_dev)
{unsigned short key_val;key_val= key_dev->num<<8 | KEY_EVENT_UP_LONG;key_write_value(key_val);key_dev->status = KEY_STATUS_DOWN_CHECK;
}/**
description : run key state machine once every 1ms
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
*/
static void key_check_1ms(struct key_dev *key_dev)
{switch(key_dev->status){case KEY_STATUS_DOWN_CHECK :key_status_down_check(key_dev);break;      case KEY_STATUS_DOWN_SHAKE : key_status_down_shake(key_dev);break;           case KEY_STATUS_DOWN_HANDLE : key_status_down_handle(key_dev);break;          case KEY_STATUS_LONG_CHECK : key_status_long_check(key_dev);break;              case KEY_STATUS_SHORT_UP_SHAKE :  key_status_short_up_shake(key_dev);break;case KEY_STATUS_DOUBLE_CHECK :key_status_double_check(key_dev);break;case KEY_STATUS_SHORT_UP_HANDLE :key_status_short_up_handle(key_dev);break;case KEY_STATUS_DOUBLE_DOWN_SHAKE : key_status_double_down_shake(key_dev);break;case KEY_STATUS_DOUBLE_UP_CHECK :key_status_double_up_check(key_dev);break;case KEY_STATUS_DOUBLE_UP_SHAKE :key_status_double_up_shake(key_dev);break;case KEY_STATUS_DOUBLE_UP_HANDLE :key_status_double_up_handle(key_dev);break;         case KEY_STATUS_LONG_HANDLE :key_status_long_hanle(key_dev);break;case KEY_STATUS_CONTINUE_CHECK : key_status_continue_check(key_dev);break;case KEY_STATUS_LONG_UP_SHAKE : key_status_long_up_shake(key_dev);break;case KEY_STATUS_LONG_UP_HANDLE :  key_status_long_up_handle(key_dev);break;default:key_dev->status = key_dev->status;}
}/**
description : run all key state machine once every 1ms
param : key_dev - key device pointer
retval : None
author : huohongpeng
data : 2017-03-02
call :timer(1ms) interrupt handle 
*/
void key_check_all_loop_1ms(void)
{unsigned char key_num, i;key_num = sizeof(key_dev)/sizeof(struct key_dev);for(i = 0; i < key_num; i++){key_check_1ms(&key_dev[i]);}}
  • 📄KEY.h
#ifndef __key_H
#define __key_H#ifdef __cplusplusextern "C" {
#endif #include "main.h"#define shortmaxclickms (300)
#define shortminclickms (10)
#define longclickms (800)#define KEY_EVENT_NULL                     0x0000  
#define KEY_EVENT_DOWN                     0x0001
#define KEY_EVENT_UP_SHORT                 0x0002  // 短按后松开事件
#define KEY_EVENT_UP_LONG                  0x0003  // 长按后松开事件
#define KEY_EVENT_UP_DOUBLE                0x0004  // 双击后松开事件
#define KEY_EVENT_SHORT                    0x0005
#define KEY_EVENT_LONG                     0x0006
#define KEY_EVENT_DOUBLE                   0x0007#define KEY_READ_DOWN                        0x00  /* key is pressed          */
#define KEY_READ_UP                          0x01  /* Key isn't pressed       */ /******************************************************************************User Interface [START]
*******************************************************************************/#define KEY0_NUM                           0x0001#define KEY0_DOWN               (KEY_EVENT_DOWN      | KEY0_NUM<<8)
#define KEY0_UP_SHORT           (KEY_EVENT_UP_SHORT  | KEY0_NUM<<8)
#define KEY0_UP_LONG            (KEY_EVENT_UP_LONG   | KEY0_NUM<<8)
#define KEY0_UP_DOUBLE          (KEY_EVENT_UP_DOUBLE | KEY0_NUM<<8)
#define KEY0_SHORT              (KEY_EVENT_SHORT     | KEY0_NUM<<8)
#define KEY0_LONG               (KEY_EVENT_LONG      | KEY0_NUM<<8) 
#define KEY0_DOUBLE             (KEY_EVENT_DOUBLE    | KEY0_NUM<<8)/******************************************************************************User Interface [END]
*******************************************************************************/void key_check_all_loop_1ms(void);
unsigned short key_read_value(void);#ifdef __cplusplus
}
#endif#endif

🔱main函数中按键处理内容

#include "stdio.h"
#include "key.h"
int32_t test_num = 0;//支持正负数值增减
uint8_t dir_flag = 2; /*  方向标志 0: 顺时 1: 逆时 2: 未动*/
uint8_t key_click_flag = 0;//EC11 中键unsigned short key_value;int main(void)
{/* USER CODE BEGIN 1 */uint32_t tick2, tick3;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */uint32_t Main_Fosc = HAL_RCC_GetSysClockFreq();printf("Main_Fosc:%dHz \r\n", Main_Fosc);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1) {/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(dir_flag != 2) {switch(dir_flag) {case 0:printf("顺时针转动\r\n");break;case 1:printf("逆时针转动\r\n");break;}dir_flag = 2;printf("num: %d\n", test_num);}if(HAL_GetTick() - tick2 >= 1) {tick2 = HAL_GetTick();key_check_all_loop_1ms();}/* Key按键按下查询 */if(HAL_GetTick() - tick3 >= 10) {tick3 = HAL_GetTick();key_value = key_read_value();if(key_value == KEY0_UP_SHORT) {	//单击事件HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);// 实现单击KEYtest_num++;printf("Press 单击,num:%d\r\n", test_num);} else if(key_value == KEY0_UP_DOUBLE) {	//双击事件HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);test_num += 2;printf("\r\nDouble Press 双击,num:%d\r\n", test_num);} else if(key_value == KEY0_LONG) {	//长按事件printf("\r\nLong Press 长按\r\n");// 实现长按KEYtest_num = 0;//清除编码器计数值printf("按键计数清零,num:%d\r\n", test_num);}}}/* USER CODE END 3 */
}

📚工程源码

链接:https://pan.baidu.com/s/1zTMkY8iEGSCu_gSavR_I3A?pwd=4m2q 
提取码:4m2q

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/647038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web--HTML基础

文章目录 安装环境HTMLhtml框架html基础标签语义标签html特殊符号 安装环境 安装vscode后 安装插件 可以先不写后台直接将前度界面展示出来 自动补全tag&#xff0c;同时修改tag时自动改另一半 在设置里将保存自动格式化的选项勾上 创建一个index.htm文件&#xff0c;这个…

力扣80、删除有序数组中的重复项Ⅱ(中等)

1 题目描述 图1 题目描述 2 题目解读 对于有序数组nums&#xff0c;要求在不使用额外数组空间的条件下&#xff0c;删除数组nums中重复出现的元素&#xff0c;使得nums中出现次数超过两次的元素只出现两次。返回删除后数组的新长度。 3 解法一&#xff1a;双指针 双指针法可以…

防御第三次作业-防火墙组网实验(3)

目录 实验拓扑图 要求 1 2 针对10.0.2.10设备的安全策略&#xff1a; 针对10.0.2.20设备的安全策略&#xff1a; 3 4 实验拓扑图 各设备ip和接口已配好&#xff0c;均可可ping通防火墙。 要求 1.生产区在工作时间内可以访问dmz区域&#xff0c;仅可以访问http服…

Kali如何启动SSH服务并实现无公网ip环境远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh 远程连接kali! …

最佳的reCAPTCHA v3验证码解析器,使用API或扩展自动解析reCAPTCHA v3

在在线安全领域&#xff0c;reCAPTCHA v3作为一种重要工具&#xff0c;用于保护网站免受自动机器人和恶意活动的侵害。在本文中&#xff0c;我们探讨了Capsolver的能力&#xff0c;这是征服reCAPTCHA v3挑战的终极解决方案。凭借其先进的功能&#xff0c;包括API集成和多功能的…

AI新工具(20240124) ComfyUI-InstantID-ComfyUI下的非官方InstantID实现;Lumiere是由谷歌时空扩散模型

ComfyUI-InstantID-ComfyUI下的非官方InstantID实现 ComfyUI InstantID是对InstantID的非官方实现&#xff0c;支持本地和huggingface hub模型&#xff0c;同时支持通用styler。它包括基础模型加载、InsightFace模型加载、ID ControlNet模型加载、Ipadapter_instantid模型加载…

【ProtoBuf】使用指南

一.什么是ProtoBuf 特点&#xff1a;ProtoBuf是用于序列化和反序列化的一种方法&#xff0c;类似xml和json&#xff0c;但是效率更高&#xff0c;体积更小。ProtoBuf具有语⾔⽆关、平台⽆关&#xff0c;扩展性、兼容性好等特点。 ProtoBuf是需要依赖通过编译生成的头文件和源…

1.25学习总结

今天学习了二叉树&#xff0c;了解了二叉树的创建和遍历的过程 今天所了解的遍历过程主要分为三种&#xff0c;前序中序和后序&#xff0c;都是DFS的想法 前序遍历&#xff1a;先输出在遍历左节点和右节点&#xff08;输出->左->右&#xff09; 中序遍历&#xff1a;先…

华为云磁盘性能指标(参考)

MD[华为云磁盘性能指标(参考)] 云硬盘&#xff08;Elastic Volume Service, EVS&#xff09; 根据性能&#xff0c;磁盘可分为极速型SSD V2、极速型SSD、通用型SSD V2、超高IO、通用型SSD、高IO、普通IO。 性能指标(参考)&#xff0c;测速说明&#xff1a;操作系统-windows …

如何配置Tomcat服务环境并实现无公网ip访问本地站点

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…

conda环境下使用youtube_dl模块下载youtube视频异常解决方法

1 问题描述 使用python的youtube_dl模块下载youtube视频时失败&#xff0c;错误信息如下&#xff1a; ERROR: Unable to extract uploader id; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/up…

jquery练习

jquery练习 1.多图片展示 <!doctype html> <html> <head> <meta charset"utf-8"> <title>多图片展示效果</title> <link href"zns_style.css" rel"stylesheet" type"text/css" /> <sc…

从 Apk 提取代码到单独 dex

从 Apk 提取代码到单独 dex Android 中动态加载是指应用程序在运行时加载和执行 Dex 文件的过程&#xff0c;可以在运行时加载不同的代码或功能&#xff0c;而无需重新编译整个应用程序&#xff0c;动态加载 Dex 文件通常涉及以下步骤&#xff1a; 创建 Dex 文件 我们接触到的…

Redis的五种常用数据类型详解及相关面试问题

目录 Redis的五种常用数据类型详解 简述 Redis五种基本数据类型 String字符串 常用命令 应用场景 Hash散列表 常用命令 使用场景 List链表 常用命令 应用场景 Set( 集合) 常用命令 应用场景 SortedSet( 有序集合) zset 常用命令介绍 应用场景 面试题常问的数…

退货通知单下推销售退货单,无法下推问题排查

文章目录 退货通知单下推销售退货单&#xff0c;无法下推问题排查报错界面排查原因 退货通知单下推销售退货单&#xff0c;无法下推问题排查 报错界面 排查 检验单已做。 原因 合格未勾选判退。

按键协管指南针加速计陀螺仪GPS等原理图纸2

1.imu电路。 加速计包含重力感应。 到传感器芯片u8, U16, U18的信息都是用的spi接口&#xff0c;如下图所示。OSCAR_TO_IMU_SPI_SCLK_FL, IMU_TO_OSCAR_SPI_MISO_FL, OSCAR_TO_IMU_SPI_MOSI_FL接了u8, u16, u18,通过片选信号cs选择哪个芯片接收。 加速计&#xff0c;陀螺仪&…

Redash 默认key漏洞(CVE-2021-41192)复现

Redash是以色列Redash公司的一套数据整合分析解决方案。该产品支持数据整合、数据可视化、查询编辑和数据共享等。 Redash 10.0.0及之前版本存在安全漏洞&#xff0c;攻击者可利用该漏洞来使用已知的默认值伪造会话。 1.漏洞级别 中危 2.漏洞搜索 fofa "redash"…

289. 生命游戏

根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 &am…

主播考核体系相关基础

1.主播薪资类型 2.主播考核体系 1.分为日常考核、月度考核 日常考核分为三部曲&#xff1a;播前、播中、播后 &#xff08;1&#xff09;播前 &#xff08;2&#xff09;播中 &#xff08;3&#xff09;播后 月度考核 月度考核表列举 主播等级划分要素 主播晋升考核方…

JVM篇----第六篇

系列文章目录 文章目录 系列文章目录前言一、堆(Heap-线程共享) -运行时数据区二、方法区/永久代(线程共享)三、JVM 运行时内存四、新生代前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看…