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是需要依赖通过编译生成的头文件和源…

oracle 12 查询数据库锁

在Oracle 12c中&#xff0c;查询数据库锁信息可以通过以下视图进行&#xff1a; v$locked_object&#xff1a;这个视图显示了当前被锁定的对象&#xff08;如表、行等&#xff09;的信息。 SELECT l.session_id sid, s.serial#, l.locked_mode,o.object_name,s.osuser,s.userna…

1.25学习总结

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

网络工程师:新兴科技基础知识面试题(十四)

116.简述模拟信号到数字信号是怎么转化的。 模拟信号到数字信号的转化过程是通过模数转换器&#xff08;ADC&#xff09;完成的&#xff0c;该过程也被称为采样和量化。 1. 采样&#xff1a; 模拟信号是连续的&#xff0c;而数字信号是离散的。在转换过程中&#xff0c;模拟信…

ip数据库.

IP库(也叫IP地址数据库)&#xff0c;是由专业技术人员经过长时间通过多种技术手段收集而来的&#xff0c;并且长期有专业人员进行更新、维护、补充。 IP库里面存放了大量的IP地址&#xff0c;方便用户查询&#xff0c;比如&#xff0c;你知道了某个IP&#xff0c;就可以查到这…

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

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…

LeeCode 438.找到字符串中所有字母异位词.

给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s “cbaebabacd”, p “abc” 输出:…

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 常用命令介绍 应用场景 面试题常问的数…

【Pytorch 第一讲】 如何加载预训练模型

一. 封装Pytorch的Model 加载pre-trianed Model import torch import torchvision.models as models from torchvision import transforms# 1. 下载并加载预训练模型 model models.resnet18(pretrainedFalse) # 设置pretrainedFalse&#xff0c;表示不加载预训练权重# 2. 下载…

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

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