当前位置: 首页 > news >正文

【STM32嵌入式系统设计与开发】——6矩阵按键应用(4x4)

这里写目录标题

  • 一、任务描述
  • 二、任务实施
    • 1、SingleKey工程文件夹创建
    • 2、函数编辑
      • (1)主函数编辑
      • (2)LED IO初始化函数(LED_Init())
      • (3)开发板矩阵键盘IO初始化(ExpKeyBordInit())
      • (3)开发板矩阵按键LED控制(ExpKeyBordInit())
      • (4)键盘IO(PE12-PE15)设置为输入模式函数(KeyBordSetIn())
      • (5)键盘IO(PE8-PE11)设置为输出模式函数(KeyBordSetOut())
      • (6)矩阵键盘行列读写操作函数(GPIO_KEY_RW())
      • (7)矩阵键盘键值扫描函数(KeyBoardScan())
    • 3、宏定义
      • (1)源文件添加头文件
      • (2)按键头文件编辑
    • 4、知识链接
      • (1)GPIO_SetBits()
      • (2)GPIO_ResetBits()
      • (3)GPIO_ReadOutputData()
      • (4)GPIO_ReadInputData()
    • 5、工程测试


STM32资料包:
百度网盘下载链接:链接:https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd=8888
提取码:8888


一、任务描述

在这里插入图片描述

二、任务实施

观察电路图,DK1-DK16按键有按下PE8 - PE11端口下拉输入,PE12-PE15输出,按键按下从而组合成16种控制led灯。
请添加图片描述
参考排列组合,如同KE1按下时,PE8为与PE12导通。
请添加图片描述

1、SingleKey工程文件夹创建

步骤1:复制工程模板“1_Template”重命名为“4_KeyBoard”
在这里插入图片描述
步骤2:修改项目工程名,先删除projects文件夹内除了Template.uvprojx文件外的所有内容并修改为“KeyBoard.uvprojx”。并删除output/obj和output/lst中的所有文件。
在这里插入图片描述
步骤3:运行“KeyBoard.uvprojx”打开目标选项“Options for Target”中的“Output”输出文件,并修改可执行文件名称为“KeyBoard”点击“OK”保存设置。最后点击“Rebuild”编译该工程生成KeyBoard文件。
在这里插入图片描述
步骤4:复制“2_LEDTest”中的"1_LED"文件复制到hardware中。
请添加图片描述
步骤5:新建“2_KeyBoard”文件,并在该文件夹下新建“KeyBoard.c”和“KeyBoard.h”两个文件。
请添加图片描述
步骤6:工程组文件中添加“led.c”和“KeyBoard.c”文件。
在这里插入图片描述
步骤7:目标选项添加添加头文件路径
在这里插入图片描述

2、函数编辑

(1)主函数编辑

在这里插入图片描述
步骤1:端口初始化准备

	//函数初始化,端口准备delay_init();     //启动滴答定时器,延时函数LED_Init();       //板载LED初始化ExpKeyBordInit(); //开发板按键初始化

在这里插入图片描述

步骤2:循环工作代码编辑,读取按键并判断按键模式,按下则点亮led灯,否则LED灯熄灭

	while(1){KeyValue = ExpKeyScan(0);switch(KeyValue){case 1:LED_MODE1(KeyValue);break;case 2:LED_MODE1(KeyValue);break;case 3:LED_MODE1(KeyValue);break;case 4:LED_MODE1(KeyValue);break;case 5:LED_MODE1(KeyValue);break;case 6:LED_MODE1(KeyValue);break;case 7:LED_MODE1(KeyValue);break;case 8:LED_MODE1(KeyValue);break;case 9:LED_MODE1(KeyValue);break;case 10:LED_MODE1(KeyValue);break;case 11:LED_MODE1(KeyValue);break;case 12:LED_MODE1(KeyValue);break;case 13:LED_MODE1(KeyValue);break;case 14:LED_MODE1(KeyValue);break;case 15:LED_MODE1(KeyValue);break;case 16:LED_MODE1(KeyValue);break;}}

请添加图片描述

(2)LED IO初始化函数(LED_Init())

/*********************************************************************@Function  : 开发板LED IO初始化@Parameter : N/A @Return    : N/A
**********************************************************************/
void ExpLEDInit(void)
{GPIO_InitTypeDef GPIO_InitStructure; // 定义 GPIO 初始化结构体变量/* 时钟使能 */	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能 GPIOA 时钟/* 引脚配置 */	GPIO_InitStructure.GPIO_Pin = LED_ALL; // D1-D8->PA0-PA7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置引脚为推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚的输出速度为 50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); // 应用以上配置到 GPIOA 上GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭
}

在这里插入图片描述

(3)开发板矩阵键盘IO初始化(ExpKeyBordInit())

初始化PE8 - PE15端口,并为推挽输出。

/*********************************************************************@Function  : 矩阵键盘IO初始化@Parameter : None @Return    : None
**********************************************************************/
void ExpKeyBordInit(void)
{GPIO_InitTypeDef  GPIO_InitStructure;/*时钟使能*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);/*引脚配置*/GPIO_InitStructure.GPIO_Pin = KEY_ALL;           // 将开发板四个按键连接到PE8~PE15GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置 GPIO 输出速度为 50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出		 GPIO_Init(GPIOE, &GPIO_InitStructure);	/*引脚初始电平设置*/GPIO_SetBits(GPIOE,KEY_ALL);
}

在这里插入图片描述

(3)开发板矩阵按键LED控制(ExpKeyBordInit())

初始化PE8 - PE15端口,并为推挽输出。

/*********************************************************************@Function  : 开发板矩阵按键LED控制@Parameter : KeyValue:矩阵按键状态 每一位表示一个矩阵按键的状态,每位按键对于相应led模式@Return    : N/A
**********************************************************************/
void LED_MODE1(uint32_t KeyValue)
{switch(KeyValue){case 1:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED1 = 0;delay_ms(1000);break;case 2:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED2 = 0;delay_ms(1000);break;case 3:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED3 = 0;delay_ms(1000);break;case 4:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED4 = 0;delay_ms(1000);break;case 5:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED5 = 0;delay_ms(1000);break;case 6:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED6 = 0;delay_ms(1000);break;case 7:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED7 = 0;delay_ms(1000);break;case 8:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED8 = 0;delay_ms(1000);break;case 9:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED1 = 0;LED2 = 0;delay_ms(1000);break;case 10:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED3 = 0;LED4 = 0;delay_ms(1000);break;case 11:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED5 = 0;LED6 = 0;delay_ms(1000);break;case 12:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭LED7 = 0;LED8 = 0;delay_ms(1000);break;case 13:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭delay_ms(1000);break;case 14:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭for(int i = 0;i < 8;i++){PAout(i) = 0;delay_ms(500);}for(int i = 0;i < 8;i++){PAout(i) = 1;delay_ms(500);}break;case 15:GPIO_SetBits(GPIOA, LED_ALL); // 将 GPIOA 的引脚 PA0-PA7 设置为高电平,使得开发板 LED 灭break;}}

在这里插入图片描述

(4)键盘IO(PE12-PE15)设置为输入模式函数(KeyBordSetIn())

将指定的 GPIO 引脚设置为输入模式,并启用下拉输入。

/*********************************************************************@Function  : 键盘IO设置为输入模式@Parameter : KEYIO :要设置的IO@Return    : N/A
**********************************************************************/
void KeyBordSetIn(uint16_t KEYIO)
{GPIO_InitTypeDef  GPIO_InitStructure;/*时钟使能*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);/*引脚配置*/GPIO_InitStructure.GPIO_Pin = KEYIO;	           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;     //下拉输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOE, &GPIO_InitStructure);	
}

在这里插入图片描述

(5)键盘IO(PE8-PE11)设置为输出模式函数(KeyBordSetOut())

将指定的 GPIO 引脚设置为输入模式,并启用下拉输入

/*********************************************************************@Function  : 键盘IO设置为输出模式@Parameter : KEYIO :要设置为输出模式的GPIO引脚@Return    : N/A
**********************************************************************/
void KeyBordSetOut(uint16_t KEYIO)
{GPIO_InitTypeDef GPIO_InitStructure;/* 使能GPIOE时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);/* 配置引脚为输出模式 */GPIO_InitStructure.GPIO_Pin = KEYIO;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOE, &GPIO_InitStructure);
}

在这里插入图片描述

(6)矩阵键盘行列读写操作函数(GPIO_KEY_RW())

从矩阵键盘中读取按键状态,通过设置特定的 GPIO 引脚为输入或输出模式,并根据参数设置写入行或列,并且根据读取的输入和输出数据返回一个表示按键状态的字节值

/*********************************************************************@Function  : 矩阵键盘行列读写操作@Parameter : ReadIo  :读输入的IOWirteIo :写输出的IO@Return    : 行列IO输出状态
**********************************************************************/
uint8_t GPIO_KEY_RW(uint16_t ReadIo,uint16_t WirteIo)
{uint16_t Wdata=0,Rdata=0;	//写KeyBordSetOut(KEY_ALL);             //设置IOif(WirteIo==0x0f00)GPIO_SetBits(GPIOE,KEY_LINE);   //写行		 else GPIO_ResetBits(GPIOE,KEY_LIST); //写列		Wdata = GPIO_ReadOutputData(GPIOE); //读输出	Wdata &= WirteIo;                   //取有效区域//读KeyBordSetIn(ReadIo);               //设置IO Rdata = GPIO_ReadInputData(GPIOE);  //读输入Rdata &= ReadIo;                    //取有效区域//状态返回	Rdata |= Wdata;                     //合并两次读取的数据return (uint8_t)(Rdata>>8);         //移位返回
}

在这里插入图片描述

(7)矩阵键盘键值扫描函数(KeyBoardScan())

扫描矩阵键盘的按键状态,通过检测行列按键的组合来确定按下的具体按键,并在按键按下后进行一定的延时消抖处理,最终返回表示按键值的一个字节。

/*********************************************************************@Function  : 矩阵键盘键值扫描@Parameter : N/A@Return    : 键值
**********************************************************************/
uint8_t KeyBoardScan(void)
{uint8_t KeyValue=0,Key=0;uint8_t a = 0;if(GPIO_KEY_RW(KEY_LIST,KEY_LINE)!=0x0f)    //读取按键是否按下{delay_ms(10);//延时10ms进行消抖if(GPIO_KEY_RW(KEY_LIST,KEY_LINE)!=0x0f)//再次检测键盘是否按下{//测试列Key = GPIO_KEY_RW(KEY_LIST,KEY_LINE);switch(Key){case(0x1F):	KeyValue=1;break;//1列case(0x2F):	KeyValue=2;break;//2列case(0x4F): KeyValue=3;break;//3列case(0x8F):	KeyValue=4;break;//4列}//测试行Key = GPIO_KEY_RW(KEY_LINE,KEY_LIST);switch(Key){case(0x0E):	KeyValue=KeyValue;break;   //1行case(0x0D):	KeyValue=KeyValue+4;break; //2行case(0x0B): KeyValue=KeyValue+8;break; //3行case(0x07):	KeyValue=KeyValue+12;break;//4行}//松手检测		while((a<50)&&(Key!=0x00))	{delay_ms(5);Key = GPIO_KEY_RW(KEY_LINE,KEY_LIST);a+=1;}				}}return KeyValue;
}

在这里插入图片描述

3、宏定义

(1)源文件添加头文件

步骤1:按键功能文件中添加相关头文件,源文件报错消失部分

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include ".\delay\delay.h"
#include "SingleKey.h"

在这里插入图片描述

步骤2:主函数添加所需的led和KeyBoard头文件,主源文件部分报错消失

/***********Hardweare***************/
#include "led.h"
#include "KeyBoard.h"

在这里插入图片描述

(2)按键头文件编辑

点击编译显示报错
在这里插入图片描述
步骤1:创建一个宏定义保护

#ifndef _SINGLEKEY_H
#define _SINGLEKEY_H#endif

在这里插入图片描述

步骤2:添加宏定义

/******************矩阵键盘IO预定义********************/
#define  KEY_LINE 	GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10  | GPIO_Pin_11  	//行#define  KEY_LIST 	GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14  | GPIO_Pin_15 	//列#define  KEY_ALL  	GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10  | GPIO_Pin_11 | \GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14  | GPIO_Pin_15		//行和列
//行列操作定义
#define RLine_WList  0 //读行写列
#define RList_WLine  1 //读列写行

在这里插入图片描述

步骤3:添加函数声明

void    ExpKeyBordInit(void);    //矩阵键盘IO初始化
uint8_t KeyBoardScan(void);      // 矩阵键盘键值扫描

在这里插入图片描述
步骤4:添加数据类型和宏的头文件

#include <stdint.h>
//键值枚举
enum KeyBoard
{KEY_NO=0,KEY_K1,KEY_K2,KEY_K3,KEY_K4,KEY_K5,KEY_K6,KEY_K7,KEY_K8,KEY_K9,KEY_K10,KEY_K11,KEY_K12,KEY_K13,KEY_K14,KEY_K15,KEY_K16
};

在这里插入图片描述

4、知识链接

(1)GPIO_SetBits()

将指定的 GPIO 引脚设置为高电平(或逻辑“1”)状态

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

(2)GPIO_ResetBits()

将指定的 GPIO 引脚设置为低电平(或逻辑“0”)状态

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

(3)GPIO_ReadOutputData()

这个函数用于读取配置为输出的 GPIO(通用输入/输出)引脚的当前状态。换句话说,它读取当前从配置为输出的 GPIO 引脚驱动出去的数据。

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

GPIOx:指定要读取输出数据的 GPIO 端口,如 GPIOA、GPIOB 等

(4)GPIO_ReadInputData()

相反,这个函数用于读取配置为输入的 GPIO 引脚的当前状态。它读取当前在配置为输入的 GPIO 引脚上检测到的数据。

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

GPIOx:指定要读取输出数据的 GPIO 端口,如 GPIOA、GPIOB 等

5、工程测试

在这里插入图片描述

相关文章:

【STM32嵌入式系统设计与开发】——6矩阵按键应用(4x4)

这里写目录标题 一、任务描述二、任务实施1、SingleKey工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;LED IO初始化函数(LED_Init())&#xff08;3&#xff09;开发板矩阵键盘IO初始化&#xff08;ExpKeyBordInit()&#xff09;&…...

乐优商城(九)数据同步RabbitMQ

1. 项目问题分析 现在项目中有三个独立的微服务&#xff1a; 商品微服务&#xff1a;原始数据保存在 MySQL 中&#xff0c;从 MySQL 中增删改查商品数据。搜索微服务&#xff1a;原始数据保存在 ES 的索引库中&#xff0c;从 ES 中查询商品数据。商品详情微服务&#xff1a;做…...

XSS-labs详解

xss-labs下载地址https://github.com/do0dl3/xss-labs 进入靶场点击图片&#xff0c;开始我们的XSS之旅&#xff01; Less-1 查看源码 代码从 URL 的 GET 参数中取得 "name" 的值&#xff0c;然后输出一个居中的标题&#xff0c;内容是 "欢迎用户" 后面…...

设计模式——模板方法模式封装.net Core读取不同类型的文件

1、模板方法模式 模板方法模式&#xff1a;定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 特点&#xff1a;通过把不变的行为搬移到超类&#xff0c;去除子类中重复的代…...

[思考记录]技术欠账

最近对某开发项目做回顾梳理&#xff0c;除了进一步思考整理相关概念和问题外&#xff0c;一个重要的任务就是清理“技术欠账”。 这个“技术欠账”是指在这个项目的初期&#xff0c;会有意无意偏向快速实现&#xff0c;想先做出来、用起来&#xff0c;进而在实现过程中做出…...

React - 实现菜单栏滚动

简介 本文将会基于react实现滚动菜单栏功能。 技术实现 实现效果 点击菜单&#xff0c;内容区域会自动滚动到对应卡片。内容区域滑动&#xff0c;指定菜单栏会被选中。 ScrollMenu.js import {useRef, useState} from "react"; import ./ScrollMenu.css;export co…...

线性筛选(欧拉筛选)-洛谷P3383

#include <bits/stdc.h> using namespace std; int main() {std::ios::sync_with_stdio(false); cin.tie(nullptr); //为了加速int n, q;cin >> n >> q; vector<int>num(n 1); //定义数字表vector<int>prime; //定义素数表数组num[1] …...

企业微信可以更换公司主体吗?

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…...

Qt教程 — 3.6 深入了解Qt 控件:Display Widgets部件(2)

目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QTextBrowser组件-简单的文本浏览器 ​2.2 QGraphicsView组件-简单的图像浏览器 Display Widgets将分为两篇文章介绍 文章1&#xff08;Qt教程 — 3.5 深入了解Qt 控件&#xff1a;Display Widgets部件-CSDN…...

Golang案例开发之gopacket抓包三次握手四次分手(3)

文章目录 前言一、理论知识三次握手四次分手二、代码实践1.模拟客户端和服务器端2.三次握手代码3.四次分手代码验证代码完整代码总结前言 TCP通讯的三次握手和四次分手,有很多文章都在介绍了,当我们了解了gopacket这个工具的时候,我们当然是用代码实践一下,我们的理论。本…...

如何减少pdf的文件大小?pdf压缩工具介绍

文件发不出去&#xff0c;有时就会耽误工作进度&#xff0c;文件太大无法发送&#xff0c;这应该是大家在发送PDF时&#xff0c;常常会碰到的问题吧&#xff0c;那么PDF文档压缩大小怎么做呢&#xff1f;因此我们需要对pdf压缩后再发送&#xff0c;那么有没有好用的pdf压缩工具…...

TypeScript基础类型

string、number、bolean 直接在变量后面添加即可。 let myName: string Tomfunction sayHello(person: string) {return hello, person } let user Tom let array [1, 2, 3] console.log(sayHello(user))function greet(person: string, date: Date): string {console.lo…...

长安链智能合约标准协议第二草案——BNS与DID协议邀请社区用户评审

长安链智能合约标准协议 在智能合约编写过程中&#xff0c;不同的产品及开发人员对业务理解和编程习惯不同&#xff0c;即使同一业务所编写的合约在具体实现上也可能有很大差异&#xff0c;在运维或业务对接中面临较大的学习和理解成本&#xff0c;现有公链合约协议规范又不能完…...

安防监控视频汇聚平台EasyCVR接入海康Ehome设备,设备在线但视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…...

【Python + Django】表结构创建

以员工管理系统为例。 事前呢&#xff0c;我们先把项目和app创建出来&#xff0c;详细步骤可以看我同栏目的第一篇、第二篇文章。 我知道你们是不会下来找的&#xff0c;就把链接贴在下面吧&#xff1a; 【Python Django】启动简单的文本页面-CSDN博客 【Python Django】…...

解锁编程潜能:ChatGPT如何革新软件开发

目录 一、背景 二、功能描述 三、总结 一、背景 在这个飞速发展的数字时代&#xff0c;软件开发的效率和质量成了衡量一个开发者能力的重要标准。随着人工智能技术的不断进步&#xff0c;越来越多的开发者开始寻找能够提升工作效率的新方法。我就是其中之一&#xff0c;最近…...

内网使用rustdesk进行远程协助

文章目录 前言一、搭建rustdesk中继服务器二、搭建文件下载服务器三、创建引导脚本四、使用 前言 内网没有互联网环境&#xff0c;没法使用互联网上有中继服务器的远程协助工具&#xff0c;如teamviewer、todesk、向日癸等&#xff1b;在内网进行远程维护可以自己搭建中继服务…...

linux内核input子系统概述

目录 一、input子系统二、关键数据结构和api2.1 数据结构2.1.1 input_dev2.1.2 input_handler2.1.3 input_event2.1.4 input_handle 2.2 api接口2.2.1 input_device 相关接口input_device 注册流程事件上报 2.2.2 input handle 相关接口注册 handle指定 handle 2.2.3 input han…...

【解决报错】vi/vim修改文件时报错:Found a swap file by the name xxxxx

目录 报错内容报错原因解决方法 报错内容 vim打开文件提示&#xff1a; Found a swap file by the name xxxxx报错原因 使用vi或vim编辑器编写代码时由于网络不稳定&#xff08;或其他种种原因&#xff09;断开了连接&#xff0c;编辑好的代码没有运行和保存&#xff0c;再次…...

BRAM底层原理详细解释(1)

目录 一、原语 二、端口简述 2.1 端口简介 2.2 SDP端口映射 三、端口信号含义补充说明 3.1 字节写使能&#xff08;Byte-Write Enable&#xff09;- WEA and WEBWE&#xff1a; 3.2 地址总线—ADDRARDADDR and ADDRBWRADDR 3.3 数据总线—DIADI, DIPADIP, DIBDI, and D…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...