2.LED燈的控制和按鍵檢測

目錄

STM32F103的GPIO口

????????GPIO口的作用

????????GPIO口的工作模式

????????input輸入檢測 -- 向內檢測

????????output控制輸出 -- 向外輸出

寄存器

????????寄存器地址的確定

????????配置GPIO口的工作模式

????????時鐘的開啟和關閉

軟件編程驅動 LED 燈

??????? 硬件

????????軟件

軟件編程驅動 KEY 按鍵?

????????硬件

????????軟件

?? ????????按鍵消抖

代碼


STM32F103的GPIO口

根據 STM32F103ZET6 的命名規范,總共 144 個引腳

????????PA0--PA15?

????????PB0--PB15?

????????PC0--PC15?

????????PD0--PD15?

????????PE0--PE15?

????????PF0--PF15?

????????PG0--PG15 16*7=112?

????????以上稱為 GPIO(通用的輸入輸出接口)?

????????11 個 VDD -- 數字電源的正

????????11 個 VSS -- 數字電源的負? 134?

????????1 個 VDDA -- 模擬電源的正

????????1 個 VSSA -- 模擬電源的負?

????????1 個 VREF+ -- 參考電壓的正

????????1 個 VREF-?參考電壓的負?

????????1 個 NRST -- 復位引腳?139

????????2 個 OSC_IN OSC_OUT 141 --高速晶振?

????????1 個 VBAT 142 -- 接電池?

????????1 個 NC -- 未使用?

????????1 個 BOOT0 -- 下載引腳?

????????PE2 P 指端口(Port),E 指 E 端口,1 個端口一般有 16 個 GPIO 口 0--15?

????????PE2 指 E 端口的第二個引腳?

????????PG11 指 G 端口的第十一引腳?

????????PA0 指 A 端口的第零引腳?

上面信息從:數據手冊中文:圖 5,芯片的外觀中獲取

????????GPIO口的作用

????????????????芯片內部和外部通信的媒介。?

????????????????如何確定配置輸入還是輸出??

????????????????? 向內輸入檢測:檢測開關是否按下,檢測屏幕是否按下。?

????????????????? 向外輸出控制:控制 LED,蜂鳴器,控制繼電器,控制顯示屏?

????????????????? 后期程序配置中,是否需要配置 GPIO,取決于單片機是否需要借助 GPIO 口和外界連接

????????GPIO口的工作模式

????????????????總共八種?

????????????????四種輸入?

????????????????????????模擬輸入?

????????????????????????上拉輸入?

????????????????????????下拉輸入?

????????????????????????浮空輸入?

????????????????四種輸出?

????????????????????????通用推挽輸出?

????????????????????????通用開漏輸出?

????????????????????????復用推挽輸出?

????????????????????????復用開漏輸出

????????input輸入檢測 -- 向內檢測

????????????????極端(數字)輸入:3.3V 或者 0V,正好對應數字量的邏輯 1 和邏輯 0?

????????????????模擬輸入: 0v~3.3V 之間的中間值,一般結合 ADC 使用

????????????????TTL 肖特基觸發器:把高低電平電壓值轉換為邏輯值(0 和 1);?

????????????????如何確定選擇哪種輸入模式:?

????????????????????????? 外部電路的電壓是 0—3.3 的任意電壓,選擇模擬輸入?

????????????????????????? 外部電路有靠譜高和低兩種狀態,選擇浮空輸入?

????????????????????????? 外部電路只有靠譜的高,選擇下拉輸入?

????????????????????????? 外部電路只有靠譜的低,選擇上拉輸入

????????output控制輸出 -- 向外輸出

????????????????輸出模擬量:0--3.3V 之間的電壓,DAC 功能使用

????????????????輸出數字量:只有邏輯 0(對應 0V),邏輯 1(對應 3.3V)

????????????????推挽輸出:既可以輸出高電平,也可以輸出低電平,PMOS 和 NMOS 都可以導通,直接把邏輯值輸出成高低電平

????????????????開漏輸出:只能輸出低電平,輸出為 1 時是高阻態(未知狀態,電路上電壓由電路來決定);經常應用在總線,需要增加上拉電阻配合使用;具有讀取(線與)的功能。

????????????????DHT11 的采集電路 -- 用開漏模式?

????????????????復用:來至于片上外設,USART,硬件 SPI,硬件 IIC,定時器 PWM?

????????????????通用:普通的 GPIO 口,控制 LED、蜂鳴器、繼電器?

????????????????如何確定輸出選擇哪種模式:?

????????????????????????? 既需要輸出高電平,也需要輸出低電平,選擇推挽模式?

????????????????????????? 只需要輸出低電平,選擇開漏模式?

????????????????????????? 普通 GPIO 口的輸出,例如控制 LED,蜂鳴器,繼電器等通過操作 ODR 寄存器實現的,配置通用輸出?

????????????????????????? 外設控制的輸出,例如 USART,硬件 SPI,硬件 IIC,定時器 PWM,選擇復用功能

寄存器

寄存器存放的是:工作模式,輸入或者輸出的電平狀態。

(GPIOx_CRL) (x=A..G) :每個端口都有 1 個這樣的寄存器(STM32F103ZET6 有 7 個端口)

偏移地址:相對于這個外設基地址的偏移

復位值:單片機復位之后,寄存器中存放的值

????????寄存器地址的確定

????????????????GPIOA_CRL 寄存器地址?

????????????????1. 確定屬于哪個端口,找到該端口的外設基地址 -- 從數據手冊 存儲器映像找

????????????????2. 找到 CRL 寄存器相對于外設基地址的偏移值 -- 從參考手冊對應寄存器介紹?

偏移地址:0x00

????????????????3. 計算該寄存器的地址?

????????????????寄存器的地址=外設基地址+偏移地址=0x40010800+0x00=0x40010800

????????配置GPIO口的工作模式

????????????????(1) 確認端口?

????????????????(2) 確認哪個 GPIO 口,0--7 在 CRL 寄存器中,8--15 在 CRH 寄存器中?

????????????????(3) 先配置 MODE 的兩位,確定好輸入和輸出模式?

????????????????(4) 在配置 CNF 位,確定具體的模式

????????時鐘的開啟和關閉

????????????????各個功能模塊有獨立的時鐘開關,設備廠商考慮到功耗的問題,如果不使用該模塊,時鐘默認是關閉的。開啟時鐘之后,對應模塊才可以正常工作

????????????????使用功能模塊 一定要開啟時鐘

????????????????RCC_APB2ENR 寄存器地址?

????????????????????????(1) 找 RCC 的外設基地址?

????????????????????????(2) 找到寄存器相對于外設基地址的偏移

????????????????????????(3) 計算寄存器地址?

????????????????????????????????RCC_APB2ENR=0x40021000+0x18=0x40021018

軟件編程驅動 LED 燈

??????? 硬件

????????軟件

????????????????1.看硬件圖,LED分別接在PE2-PE5

????????????????2.開啟PE端口時鐘

????????????????3.設置工作模式,以PE2為例

????????結合硬件電路, 首先選擇通用還是復用,復用功能需要結合外設(UART_TX 等)使用,我們選擇通用輸出,開漏和推挽選擇,推挽一定可以,為了有穩定的狀態,所以選擇推挽,所以最終選擇通用推挽輸出。

????????????????4.分別控制輸出高低電平。假如以 PE2 為例,操作 GPIOE_ODR 的位 2,分別設置為 0 和 1

軟件編程驅動 KEY 按鍵?

????????硬件

????????軟件

????????????????1.結合硬件原理圖,確定 KEY 分別接在 PA0 PC4 PC5 PC6?

????????????????2.開啟對應的端口時鐘,開啟 C 端口和 A 端口時鐘

????????????????????????RCC_APB2ENR 的位 2 置 1,開啟端口 A 的時鐘?

????????????????????????RCC_APB2ENR 的位 4 置 1,開啟端口 C 的時鐘?

????????????????3.設置工作模式,假如以 PC4 PC5 為例,操作 GPIOE_CRL 寄存器的位 23:16 結合硬件電路, 按鍵按下和未按下有穩定的高電平和低電平,所以選擇浮空輸入 GPIOC_CRL 寄存器的位 23:16 寫入 0100 0100?

????????????????4.分別檢測(讀取)PC4,PC5 的引腳電平,來確定按鍵是否按下GPIOC_IDR 的位 4 或者位 5 判斷按鍵是否按下

?? ????????按鍵消抖

代碼

led.c

#include "led.h"
#include "main.h"
void LED_Config(void)
{
#if (USB_STD_LIB==0)//1.開啟GPIOE的時鐘	結合硬件:LED4接在PE5上	6.3.7RCC_APB2ENR/*RCC的外設地址 0x40021000RCC_APB2ENR寄存器相對于基地址偏移0x18RCC_APB2ENR寄存器地址:0x40021000+0x18 + 0x18= 0x40021018*///*(uint32_t *)(0x40021018) = (*(uint32_t *)(0x40021018)) | (0x01<<6);//RCC->APB2ENR = RCC->APB2ENR | (0x01<<6);RCC->APB2ENR |= (0x01<<6);//2.設置gpio模式,設置通用推挽輸出//LED4初始化GPIOE->CRL &= ~(0xFFFF << 8);//先清0GPIOE->CRL |= (0x1111 << 8);//在置1/* GPIOE->CRL &= ~(0xF << 20);//先清0GPIOE->CRL |= (0x01 << 20);//在置1//LED3初始化GPIOE->CRL &= ~(0xF << 16);//先清0GPIOE->CRL |= (0x01 << 16);//在置1//LED2初始化GPIOE->CRL &= ~(0xF << 12);//先清0GPIOE->CRL |= (0x01 << 12);//在置1//LED1初始化GPIOE->CRL &= ~(0xF << 8);//先清0GPIOE->CRL |= (0x01 << 8);//在置1  */
#elif (USB_STD_LIB==1)//1.開E端口時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//2.定義結構體 xxx需要傳遞結構體地址GPIO_InitTypeDef GPIO_InitStruct = {0};//3.給結構體賦值GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5;//代配置引腳GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//工作模式GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;//引腳速率//4.調用xxx_Init函數,將參數寫入寄存器中GPIO_Init(GPIOE, &GPIO_InitStruct);
#endif
}void LED1_ON(void)//開燈,低電平亮
{
#if (USB_STD_LIB==0)GPIOE->ODR &= ~(0x01 << 2);
#elif (USB_STD_LIB==1)GPIO_ResetBits(GPIOE, GPIO_Pin_2);
#endif
}
void LED1_OFF(void)//關燈,高電平滅
{
#if (USB_STD_LIB==0)GPIOE->ODR |= (0x01 << 2);
#elif (USB_STD_LIB==1)GPIO_SetBits(GPIOE, GPIO_Pin_2);
#endif
}
void LED1_TOGGLE(void)//翻轉 ^相同為0不同為1
{
#if (USB_STD_LIB==0)GPIOE->ODR ^= (0x01 << 2);
#elif (USB_STD_LIB==1)GPIO_WriteBit(GPIOE, GPIO_Pin_2, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_2)));
#endif
}
void LED4_ON(void)//開燈,低電平亮
{
#if (USB_STD_LIB==0)GPIOE->ODR &= ~(0x01 << 5);
#elif (USB_STD_LIB==1)GPIO_ResetBits(GPIOE, GPIO_Pin_5);
#endif
}
void LED4_OFF(void)//關燈,高電平滅
{
#if (USB_STD_LIB==0)GPIOE->ODR |= (0x01 << 5);
#elif (USB_STD_LIB==1)GPIO_SetBits(GPIOE, GPIO_Pin_5);
#endif
}
void LED3_ON(void)//開燈,低電平亮
{
#if (USB_STD_LIB==0)GPIOE->ODR &= ~(0x01 << 4);
#elif (USB_STD_LIB==1)GPIO_ResetBits(GPIOE, GPIO_Pin_4);
#endif
}
void LED3_OFF(void)//關燈,高電平滅
{
#if (USB_STD_LIB==0)GPIOE->ODR |= (0x01 << 4);
#elif (USB_STD_LIB==1)GPIO_SetBits(GPIOE, GPIO_Pin_4);
#endif
}
void LED2_ON(void)//開燈,低電平亮
{
#if (USB_STD_LIB==0)GPIOE->ODR &= ~(0x01 << 3);
#elif (USB_STD_LIB==1)GPIO_ResetBits(GPIOE, GPIO_Pin_3);
#endif
}
void LED2_OFF(void)//關燈,高電平滅
{
#if (USB_STD_LIB==0)GPIOE->ODR |= (0x01 << 3);
#elif (USB_STD_LIB==1)GPIO_SetBits(GPIOE, GPIO_Pin_3);
#endif
}

led.h

#ifndef __LED_H__
#define __LED_H__#include "stm32f10x.h"void LED_Config(void);
void LED4_ON(void);
void LED4_OFF(void);
void LED4_TOGGLE(void);void LED3_ON(void);
void LED3_OFF(void);
void LED3_TOGGLE(void);void LED2_ON(void);
void LED2_OFF(void);
void LED2_TOGGLE(void);void LED1_ON(void);
void LED1_OFF(void);
void LED1_TOGGLE(void);#endif

key.c

#include "key.h"
#include "delay.h"
#include "led.h"
#include "BUZZER.h"
#include "main.h"
#include "RGB.h"
#include "relay.h"
uint8_t RBG_state = 3;
void KEY_Config(void)
{
#if (USB_STD_LIB==0)//RCC->APB2ENR |= (0x01<<2);//RCC->APB2ENR |= (0x01<<4);RCC->APB2ENR |= (0x05 << 2);//KEY1GPIOA->CRL &= ~(0xF << 0);//先清0GPIOA->CRL |= (0x4 << 0);//在置1//KEY2 KEY3 KEY4GPIOC->CRL &= ~(0xFFF << 16);//先清0GPIOC->CRL |= (0x444<< 16);//在置1
#elif (USB_STD_LIB==1)//1.開A C端口時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC,ENABLE);//2.定義結構體 xxx需要傳遞結構體地址GPIO_InitTypeDef GPIO_InitStruct = {0};//3.GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//工作模式,浮空輸入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;//待配置的引腳//GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz; 輸入可以不配置引腳速率//4.調用xxx_Init函數,將參數寫入寄存器中GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5 |GPIO_Pin_6;//代配置引腳GPIO_Init(GPIOC, &GPIO_InitStruct);#endif
}//按鍵掃描函數
/*返回值0無按鍵按下1按鍵1按按下并松手2按鍵2按按下并松手3按鍵3按按下并松手4按鍵4按按下并松手
*/
uint8_t KEY_SCAN(void)
{
#if (USB_STD_LIB==0)	uint8_t KEY_Sate;if((GPIOA->IDR & (0x01 << 0)) != 0)//判斷KEY1是否按下,按下為1高電平{Delay_ms(10);//消抖if((GPIOA->IDR & (0x01 << 0)) != 0){while((GPIOA->IDR & (0x01 << 0)) != 0)//確定松手{}KEY_Sate = 1;}}if((GPIOC->IDR & (0x01 << 4)) == 0)//判斷KEY2是否按下,按下為0低電平{Delay_ms(10);//消抖if((GPIOC->IDR & (0x01 << 4)) == 0){while((GPIOC->IDR & (0x01 << 4)) == 0){}KEY_Sate = 2;}}if((GPIOC->IDR & (0x01 << 5)) == 0)//判斷KEY3是否按下,按下為0低電平{Delay_ms(10);//消抖if((GPIOC->IDR & (0x01 << 5)) == 0){while((GPIOC->IDR & (0x01 << 5)) == 0){}KEY_Sate = 3;}}if((GPIOC->IDR & (0x01 << 6)) == 0)//判斷KEY4是否按下,按下為0低電平{Delay_ms(10);//消抖if((GPIOC->IDR & (0x01 << 6)) == 0){while((GPIOC->IDR & (0x01 << 6)) == 0){}KEY_Sate = 4;}}return KEY_Sate;
#elif (USB_STD_LIB==1)uint8_t KEY_Sate = 0;if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET){Delay_ms(10);//消抖if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET){while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET)//確定松手{}KEY_Sate = 1;}}if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4) == Bit_RESET){Delay_ms(10);//消抖if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4) == Bit_RESET){while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_4) == Bit_RESET)//確定松手{}KEY_Sate = 2;}}if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5) == Bit_RESET){Delay_ms(10);//消抖if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5) == Bit_RESET){while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5) == Bit_RESET)//確定松手{}KEY_Sate = 3;}}if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6) == Bit_RESET){Delay_ms(10);//消抖if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6) == Bit_RESET){while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_6) == Bit_RESET)//確定松手{}KEY_Sate = 4;}}return KEY_Sate;
#endif}void KEY_Handle(void)
{uint8_t KEY_Sate = 0;KEY_Sate = KEY_SCAN();switch(KEY_Sate){case 0: break;case 1: LED1_ON(); LED2_ON(); LED3_ON(); LED4_ON();break;case 2: LED1_OFF(); LED2_OFF(); LED3_OFF(); LED4_OFF();break;case 3: Relay_ON();break;case 4: Relay_OFF();//Update_RGB();break;}
}

key.h

#ifndef __KEY_H__
#define __KEY_H__#include "stm32f10x.h"void KEY_Config(void);
uint8_t KEY_SCAN(void);
void KEY_Handle(void);
//void Tim2_Init();
//void TIM2_IRQHandler();
//void Update_RGB();#endif

main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "RGB.h"
#include "relay.h"
#include "key.h"
#include "BUZZER.h"
#include "exti.h"
#include "main.h"int main(void)
{#if (USB_STD_LIB==0)	//開機調用一次配置的搶占和次級優先級必須符合該分組情況//搶占0-3,次級0-3NVIC_SetPriorityGrouping(5);#elif (USB_STD_LIB==1)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);#endifLED_Config();LED4_OFF();LED3_OFF();LED2_OFF();LED1_OFF();RGB_Config();R_OFF();G_OFF();B_OFF();Relay_Init();Relay_OFF();KEY_Config();BUZZER_Config();EXIT_Confing();while(1){R_ON();Delay_ms(100);R_OFF();Delay_ms(100);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81606.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flink 的狀態機制

在實時流處理領域&#xff0c;狀態管理是構建復雜業務邏輯的核心能力。Apache Flink 通過統一的狀態抽象和高效的容錯機制&#xff0c;為開發者提供了從毫秒級窗口聚合到 TB 級歷史數據關聯的全場景支持。本文將深入剖析 Flink 狀態機制的底層原理&#xff0c;結合實際案例展示…

【查看.ipynp 文件】

目錄 如何打開 .ipynb 文件&#xff1f; 如果確實是 .ipynp 文件&#xff1a; .ipynp 并不是常見的 Jupyter Notebook 文件格式。通常&#xff0c;Jupyter Notebook 文件的擴展名是 .ipynb&#xff08;即 Interactive Python Notebook&#xff09;。如果你遇到的是 .ipynb 文…

Runnable組件重試機制降低程序錯誤率

一、LangChain 重試機制深度解析 當構建生產級AI應用時&#xff0c;with_retry() 機制可有效提升系統容錯性&#xff0c;典型應用場景包括&#xff1a; API調用頻率限制時的自動恢復模型服務臨時不可用的故障轉移網絡波動導致的瞬時異常處理 參數詳解與配置策略 1. 參數配置…

k8s筆記——kubebuilder工作流程

kubebuilder工作流程 Kubebuilder 工作流程詳解 Kubebuilder 是 Kubernetes 官方推薦的 Operator 開發框架&#xff0c;用于構建基于 Custom Resource Definitions (CRD) 的控制器。以下是其核心工作流程的完整說明&#xff1a; 1. 初始化項目 # 創建項目目錄 mkdir my-opera…

Java框架“若依RuoYi”前后端分離部署

運行環境 Eclipse IDE for Enterprise Java and Web Developers 下載Eclipse解壓Eclipse到文件夾 Maven 下載Maven解壓Maven到文件夾配置環境變量MAVEN_HOME為Maven安裝位置配置環境變量path為%MAVEN_HOME%\bin Redis 下載Redis解壓Redis到文件夾配置環境變量path為Redis安裝位…

游戲引擎學習第249天:清理調試宏

歡迎大家&#xff0c;讓我們直接進入調試代碼的改進工作 接下來&#xff0c;我們來看一下上次停留的位置。如果我沒記錯的話&#xff0c;上一場直播的結尾我有提到一些我想做的事情&#xff0c;并且在代碼中留下了一個待辦事項。所以也許我們今天首先做的就是解決這個問題。但…

二極管反向恢復的定義和原理

二極管的反向恢復定義 二極管的反向恢復是指二極管從正向導通狀態切換到反向阻斷狀態時&#xff0c;電流從正向變為負向并最終回到零所需的時間。具體過程如下&#xff1a; 正向導通&#xff1a;當二極管正向偏置時&#xff0c;電流可以順利通過&#xff0c;此時二極管處于導…

音視頻開發技術總結報告

音視頻開發技術總結報告 一、音視頻開發基礎 1、音頻基礎 聲音原理 聲波特性&#xff1a;頻率、振幅、波長人耳聽覺范圍&#xff1a;20Hz-20kHz聲音三要素&#xff1a;音調、音量、音色 數字音頻基礎 采樣率&#xff1a;常見44.1kHz、48kHz、96kHz量化位數&#xff1a;8bit、…

中間件和組件

文章目錄 1. 前言2. 中間件介紹3. 組件介紹4. 區別對比5. 簡單類比6. 總結 中間件和組件 1. 前言 中間件和組件是軟件開發中兩個重要的概念&#xff0c;但它們的定位和作用完全不同。中間件解決的事通信、跨系統、安全等問題&#xff0c;組件是解決具體業務模塊&#xff0c;提高…

AI超級智能體教程(五)---自定義advisor擴展+結構化json輸出

文章目錄 1.自定義攔截器1.2自定義Advisor1.2打斷點調試過程1.3Re-reading Advisor自定義實現 2.戀愛報告開發--json結構化輸出2.1原理介紹2.1代碼實現2.3編寫測試用例2.4結構化輸出效果 1.自定義攔截器 1.2自定義Advisor spring里面的這個默認的是SimpleloggerAdvisor&#…

02_使用 AES 算法實現文件加密上傳至阿里云、解密下載

02_使用 AES 算法實現文件加密上傳至阿里云、解密下載 一、文件上傳下載接口 controller 層 RestController RequestMapping("/api/common/file") Api(tags "公共文件上傳") AllArgsConstructor Slf4j public class FileV2Controller {private final Os…

力扣:24兩兩交換鏈表的節點

目錄 1.題目描述&#xff1a; 2.算法思路&#xff1a; 3.代碼展示&#xff1a; 1.題目描述&#xff1a; 給你一個鏈表&#xff0c;兩兩交換其中相鄰的節點&#xff0c;并返回交換后鏈表的頭節點。你必須在不修改節點內部的值的情況下完成本題&#xff08;即&#xff0c;只能…

smss源代碼分析之smss!SmpLoadSubSystemsForMuSession函數分析加載csrss.exe

第一部分&#xff1a; Next SmpSubSystemsToLoad.Flink; while ( Next ! &SmpSubSystemsToLoad ) { p CONTAINING_RECORD( Next, SMP_REGISTRY_VALUE, Entry )…

MIT6.S081-lab8前置

MIT6.S081-lab8前置 注&#xff1a;本部分除了文件系統還包含了調度的內容。 調度 調度涉及到保存寄存器&#xff0c;恢復寄存器&#xff0c;就這一點而言&#xff0c;和我們的 trap 很像&#xff0c;但是實際上&#xff0c;我們實現并不是復用了 trap 的邏輯&#xff0c;我…

哈希函數詳解(SHA-2系列、SHA-3系列、SM3國密)案例:構建簡單的區塊鏈——密碼學基礎

文章目錄 一、密碼哈希函數概述1.1 哈希函數的基本概念1.2 哈希函數在數據安全中的應用 二、SHA-2系列算法詳解2.1 SHA-2的起源與發展2.2 SHA-256技術細節與實現2.3 SHA-384和SHA-512的特點2.4 SHA-2系列算法的安全性評估 三、SHA-3系列算法詳解3.1 SHA-3的起源與設計理念3.2 K…

待驗證---Oracle 19c 在 CentOS 7 上的快速安裝部署指南

Oracle 19c 在 CentOS 7 上的快速安裝部署指南 Oracle Database 19c 是一個功能強大的企業級數據庫系統&#xff0c;下面我將為您提供在 CentOS 7 上快速安裝部署 Oracle 19c 的詳細步驟。 一、準備工作 1. 系統要求 CentOS 7 (64位)最小內存: 2GB (推薦 8GB 以上)最小磁盤…

stm32 HAI庫 SPI(一)原理

基本特點 通信方式&#xff1a;同步、串行&#xff08;串行、并行、并發&#xff0c;別再傻傻分不清了&#xff01;_串行和并行的區別-CSDN博客&#xff09;、全雙工 &#xff08;也可以選擇半雙工&#xff09;速率&#xff1a;50MHZ以下數據格式&#xff1a;8位/16位傳輸順序…

OpenResty技術深度解析:原理、應用與生態對比-優雅草卓伊凡

OpenResty技術深度解析:原理、應用與生態對比-優雅草卓伊凡 一、OpenResty技術概述 1.1 OpenResty是什么? OpenResty是一個基于Nginx的高性能Web平臺,它將標準的Nginx核心與一系列強大的第三方模塊(主要是LuaJIT)捆綁在一起,形成了一個全功能的Web應用服務器。不同于傳…

二維碼批量識別—混亂多張二維碼識別-物品分揀—-未來之窗-仙盟創夢IDE

仙盟模型 用途 精準分揀&#xff1a;快速準確識別物品上復雜或多個二維碼&#xff0c;依據碼中信息&#xff08;如目的地、品類等&#xff09;實現物品自動化分揀&#xff0c;提高分揀效率與準確性。庫存管理&#xff1a;識別入庫、出庫物品二維碼&#xff0c;更新庫存數據&am…

scikit-learn在監督學習算法的應用

shiyonguyu大家好&#xff0c;我是我不是小upper&#xff01;最近行業大環境不是很好&#xff0c;有人苦惱別人都開始著手項目實戰了&#xff0c;自己卻還卡在 scikit-learn 的代碼語法上&#xff0c;連簡單的示例運行起來都磕磕絆絆。確實&#xff0c;對很多機器學習初學者來說…