【嵌入式-stm32電位器控制以及旋轉編碼器控制LED亮暗】

嵌入式-stm32電位器控制LED亮暗

  • 任務1
  • 代碼1
    • Key.c
    • Key.h
    • Timer.c
    • Timer.h
    • PWM.c
    • PWM.h
    • main.c
  • 實驗現象1
  • 任務2
  • 代碼2
    • Key.c
    • Key.h
    • main.c
  • 實驗現象2
  • 問題與解決
  • 總結

源碼框架取自江協科技,在此基礎上做擴展開發。

任務1

本文主要介紹利用stm32f103C8T6實現電位器控制PWM的占空比大小來改變LED亮暗程度,按鍵實現使用定時器非阻塞式,其中一個按鍵切換3個LED的控制狀態,另一個按鍵是重置當前的LED為熄滅狀態。

代碼1

Key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "oled.h"
#include "PWM.h"
#include "AD.h"
#include "Key.h"
#include <stdio.h>extern uint16_t ADValue;			//定義AD值變量
uint8_t Key_Num;
/*** 函    數:按鍵初始化* 參    數:無* 返 回 值:無*/
void Key_Init(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);	
}  // 定義模式枚舉  
typedef enum {  MODE_PWM_CH2 = 0,  MODE_PWM_CH3,  MODE_PWM_CH4,  MODE_MAX  
} PWM_MODE;  // 全局變量  
volatile PWM_MODE currentMode = MODE_PWM_CH2;  
volatile uint16_t pwmValue = 0;  
volatile uint8_t resetFlag = 0;  
volatile uint8_t systemActive = 0;  //新增系統激活標志// 初始化顯示函數  
void Initial_Display(void) {  // 清屏  OLED_Clear();  // 顯示初始狀態  OLED_ShowString(1, 1, "System Ready");  OLED_ShowString(2, 1, "Active KEY1 ");  // 初始化時關閉所有LED  PWM_SetCompare2(0);  PWM_SetCompare3(0);  PWM_SetCompare4(0);   
}  uint8_t Key_GetNum(void)
{uint8_t Temp;           Temp = Key_Num;         //讀取按鍵鍵值Key_Num = 0; 					  //清零,防止重復觸發return Temp;
}uint8_t Key_GetState(void)
{if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) == 0){return 1;}if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10) == 0){return 2;}return 0;   //無按鍵按下
}void Key_Tick(void)         
{static uint8_t Count; //靜態計數器,記錄中斷次數static uint8_t CurrState, PrevState;Count++;if(Count >= 20)   //20ms執行一次按鍵掃描(中斷周期為1ms){Count = 0;PrevState = CurrState;         //保存前一次按鍵狀態CurrState = Key_GetState();    //讀取當前按鍵狀態//檢測按鍵釋放動作(下降沿)if(CurrState == 0 && PrevState != 0){Key_Num = PrevState;    //記錄按鍵值(1或者2)}}
}// 設置PWM的函數  
void SetPWM(uint16_t value) {  switch (currentMode) {  case MODE_PWM_CH2:  PWM_SetCompare2(value);  break;  case MODE_PWM_CH3:  PWM_SetCompare3(value);  break;  case MODE_PWM_CH4:  PWM_SetCompare4(value);  break;  }  
}  // 更新顯示模式函數  
void Update_ModeDisplay(void) {  // 清除原有模式顯示  OLED_Clear();  // 根據當前模式顯示  switch (currentMode) {  case MODE_PWM_CH2:  OLED_ShowString(1, 1, "Mode: CH2");  break;  case MODE_PWM_CH3:  OLED_ShowString(1, 1, "Mode: CH3");  break;  case MODE_PWM_CH4:  OLED_ShowString(1, 1, "Mode: CH4");  break;  }  // 顯示初始PWM值  OLED_ShowString(2, 1, "PWM:   0");  
}  /*OLED顯示70.5%函數*/
void ShowPwm_Percent(uint8_t Line, uint8_t Colum, uint16_t pwmValue)
{char str[16];uint16_t integer = pwmValue / 10;  //整數部分如70uint16_t decimal = pwmValue % 10;  //小鼠部分如5sprintf(str, "%4d.%1d%%",integer,decimal);OLED_ShowString(Line,Colum,str);
}// 按鍵控制函數  
void Key_control(void) {  uint8_t keyNum = Key_GetNum();  // 處理按鍵1:模式切換  if (keyNum == 1) {  // 重置標志清零  resetFlag = 0; if(systemActive == 0){systemActive = 1;currentMode = MODE_PWM_CH2;Update_ModeDisplay();}else{// 切換模式  currentMode++;  if (currentMode >= MODE_MAX) {  currentMode = MODE_PWM_CH2;  }  // 更新模式顯示  Update_ModeDisplay(); }				}  // 處理按鍵2:重置為全暗  if (keyNum == 2) {  // 設置重置標志  resetFlag = 1;  // 將當前通道設置為0  SetPWM(0);  pwmValue = 0;  // 顯示PWM值  OLED_ShowNum(2, 5, pwmValue, 3);  }  // 僅在非重置狀態下讀取ADC和設置PWM  if (resetFlag == 0 && systemActive) {  // 讀取ADC并設置PWM  //uint16_t adcValue = AD_GetValue();  pwmValue = (AD_GetValue() * 1000)/ 4095 ;  // 設置當前通道PWM  SetPWM(pwmValue);  // 顯示PWM值 OLED_ShowNum(3, 1, pwmValue, 4);  // 直接顯示pwmValue的值			ShowPwm_Percent(2, 4, pwmValue);//OLED_ShowNum(2, 5, pwmValue, 3);  }  
}  

Key.h

#ifndef __KEY_H
#define __KEY_Hvoid Key_Init(void);
uint8_t Key_GetNum(void);
void Key_control(void);
void Initial_Display(void);
void SetPWM(uint16_t value);
void Key_Tick(void);
uint8_t Key_GetState(void);#endif

Timer.c

#include "stm32f10x.h"                  // Device headervoid Timer_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);TIM_InternalClockConfig(TIM3);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 1000 - 1;TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);TIM_ClearFlag(TIM3, TIM_FLAG_Update);TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);TIM_Cmd(TIM3, ENABLE);
}/*
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}
*/

Timer.h

#ifndef __TIMER_H
#define __TIMER_Hvoid Timer_Init(void);#endif

PWM.c

#include "stm32f10x.h"                  // Device header/*** 函    數:PWM初始化* 參    數:無* 返 回 值:無*/void TIM2_PWM_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;GPIO_InitTypeDef GPIO_InitStruct;	// 打開定時器2時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);																RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //GPIO采用復用推挽輸出模式GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1; //TIM2同時產生三路PWM波 在管腳123 a11GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;  //GPIO速度50MHZGPIO_Init(GPIOA,&GPIO_InitStruct);  //初始化函數 讓剛剛配置的參數 輸入到對應寄存器里面// 配置定時器2為PWM模式TIM_TimeBaseStructure.TIM_Period = 999; // PWM周期TIM_TimeBaseStructure.TIM_Prescaler = 720; // 72MHz/(71+1) = 1MHz,計數頻率為1MHzTIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);// 配置TIM2通道2為PWM模式TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比0%TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC2Init(TIM2, &TIM_OCInitStructure);TIM_OC3Init(TIM2, &TIM_OCInitStructure);TIM_OC4Init(TIM2, &TIM_OCInitStructure);// 使能TIM2TIM_Cmd(TIM2, ENABLE);
}
/*** 函    數:PWM設置CCR* 參    數:Compare 要寫入的CCR的值,范圍:0~1000* 返 回 值:無* 注意事項:CCR和ARR共同決定占空比,此函數僅設置CCR的值,并不直接是占空比*           占空比Duty = CCR / (ARR + 1)*/void PWM_SetCompare2(uint16_t Compare)
{TIM_SetCompare2(TIM2 ,Compare );	//設置CCR1的值
}
void PWM_SetCompare3(uint16_t Compare)
{TIM_SetCompare3(TIM2 ,Compare );	//設置CCR1的值
}
void PWM_SetCompare4(uint16_t Compare)
{TIM_SetCompare4(TIM2 ,Compare );	//設置CCR1的值
}

PWM.h

#ifndef __PWM_H
#define __PWM_Hvoid TIM2_PWM_Init(void);void PWM_SetCompare2(uint16_t Compare);
void PWM_SetCompare3(uint16_t Compare);
void PWM_SetCompare4(uint16_t Compare);#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
#include "sys.h"
#include "AD.h"
#include "PWM.h"
#include "Timer.h"/*全局變量*/
uint16_t ADValue;			//定義AD值變量int main(void)
{/*模塊初始化*/OLED_Init();		//OLED初始化Key_Init();			//按鍵初始化AD_Init();			//AD初始化TIM2_PWM_Init();	//定時器2PWM初始化Timer_Init();/*OLED顯示靜態字符*/Initial_Display();while (1){//KeyNum=Key_GetNum();	//獲取鍵碼值Key_control();			//按鍵PWM控制}
}//中斷服務函數
//每次TIM3溢出時觸發中斷,調用Key_Tick()進行按鍵掃描
//清除中斷標志,避免重復進入中斷
void TIM3_IRQHandler(void)
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET){Key_Tick();TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}
}

實驗現象1

以下是通過電位器控制PWM輸出大小的值進而調暗LED
在這里插入圖片描述
在這里插入圖片描述
通過網盤分享的文件:電位器改變PWM輸出控制LED
鏈接: https://pan.baidu.com/s/1JrevfJ2GTsBqLyRb4Do39g 提取碼: 6688
在這里插入圖片描述

任務2

旋轉編碼器控制LED亮暗:
1、LED亮度控制:旋轉編碼器調節PWM占空比,控制LED亮度。
2、狀態顯示:OLED實時顯示當前PWM占空比(格式為XX.X%)。
3、模式切換:通過獨立按鍵切換PWM輸出通道(如CH2、CH3、CH4)。
4、系統激活與重置:按鍵控制系統的啟動和重置。
接線圖片來自江協議科技
在這里插入圖片描述

代碼2

1、模塊化代碼架構
編碼器驅動:通過外部中斷檢測旋轉方向,更新計數值。
PWM生成:配置定時器(如TIM2)的PWM模式,動態調節占空比。
OLED顯示:格式化顯示占空比和模式信息。
主控制邏輯:整合按鍵、編碼器和PWM功能,實現狀態機控制。

Key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "oled.h"
#include "PWM.h"
#include "AD.h"
#include "Key.h"
#include "Encoder.h"
#include <stdio.h>uint8_t Key_Num;
signed Key_Encoder_Count = 0;
/*** 函    數:按鍵初始化* 參    數:無* 返 回 值:無*/
void Key_Init(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);	
}  // 定義模式枚舉  
typedef enum {  MODE_PWM_CH2 = 0,  MODE_PWM_CH3,  MODE_PWM_CH4,  MODE_MAX  
} PWM_MODE;  // 全局變量  
volatile PWM_MODE currentMode = MODE_PWM_CH2;  
volatile uint16_t pwmValue = 0;  
volatile uint8_t resetFlag = 0;  
volatile uint8_t systemActive = 0;  //新增系統激活標志// 初始化顯示函數  
void Initial_Display(void) {  // 清屏  OLED_Clear();  // 顯示初始狀態  OLED_ShowString(1, 1, "System Ready");  OLED_ShowString(2, 1, "Active KEY1 ");  // 初始化時關閉所有LED  PWM_SetCompare2(0);  PWM_SetCompare3(0);  PWM_SetCompare4(0);   
}  uint8_t Key_GetNum(void)
{uint8_t Temp;           Temp = Key_Num;         //讀取按鍵鍵值Key_Num = 0; 					  //清零,防止重復觸發return Temp;
}uint8_t Key_GetState(void)
{if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) == 0){return 1;}if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10) == 0){return 2;}return 0;   //無按鍵按下
}void Key_Tick(void)         
{static uint8_t Count; //靜態計數器,記錄中斷次數static uint8_t CurrState, PrevState;Count++;if(Count >= 20)   //20ms執行一次按鍵掃描(中斷周期為1ms){Count = 0;PrevState = CurrState;         //保存前一次按鍵狀態CurrState = Key_GetState();    //讀取當前按鍵狀態//檢測按鍵釋放動作(下降沿)if(CurrState == 0 && PrevState != 0){Key_Num = PrevState;    //記錄按鍵值(1或者2)}}
}// 設置PWM的函數  
void SetPWM(uint16_t value) {  switch (currentMode) {  case MODE_PWM_CH2:  PWM_SetCompare2(value);  break;  case MODE_PWM_CH3:  PWM_SetCompare3(value);  break;  case MODE_PWM_CH4:  PWM_SetCompare4(value);  break;  }  
}  // 更新顯示模式函數  
void Update_ModeDisplay(void) {  // 清除原有模式顯示  OLED_Clear();  // 根據當前模式顯示  switch (currentMode) {  case MODE_PWM_CH2:  OLED_ShowString(1, 1, "Mode: CH2");  break;  case MODE_PWM_CH3:  OLED_ShowString(1, 1, "Mode: CH3");  break;  case MODE_PWM_CH4:  OLED_ShowString(1, 1, "Mode: CH4");  break;  }  // 顯示初始PWM值  OLED_ShowString(2, 1, "PWM:   0");  
}  /*OLED顯示70.5%函數*/
void ShowPwm_Percent(uint8_t Line, uint8_t Colum, uint16_t pwmValue)
{char str[16];uint16_t integer = pwmValue / 10;  //整數部分如70uint16_t decimal = pwmValue % 10;  //小鼠部分如5sprintf(str, "%4d.%1d%%",integer,decimal);OLED_ShowString(Line,Colum,str);
}// 按鍵控制函數  
void Key_control(void) {  uint8_t keyNum = Key_GetNum();  // 處理按鍵1:模式切換  if (keyNum == 1) {  // 重置標志清零  resetFlag = 0; if(systemActive == 0){systemActive = 1;currentMode = MODE_PWM_CH2;Update_ModeDisplay();}else{// 切換模式  currentMode++;  if (currentMode >= MODE_MAX) {  currentMode = MODE_PWM_CH2;  }  // 更新模式顯示  Update_ModeDisplay(); }				}  // 處理按鍵2:重置為全暗  if (keyNum == 2) {  // 設置重置標志  resetFlag = 1;  // 將當前通道設置為0  SetPWM(0);  pwmValue = 0;  // 顯示PWM值  OLED_ShowNum(2, 5, pwmValue, 3);  }  // 僅在非重置狀態下讀取ADC和設置PWM  if (resetFlag == 0 && systemActive) {  Key_Encoder_Count += Encoder_Get();if(Key_Encoder_Count < 0){Key_Encoder_Count = 0;}if(Key_Encoder_Count > 100){Key_Encoder_Count = 100;}pwmValue = (Key_Encoder_Count * 10) ;  // 設置當前通道PWM  SetPWM(pwmValue);  // 顯示PWM值 OLED_ShowNum(3, 1, pwmValue, 4);  // 直接顯示pwmValue的值			ShowPwm_Percent(2, 4, pwmValue);//OLED_ShowNum(2, 5, pwmValue, 3);  }  
}  

Key.h

#ifndef __KEY_H
#define __KEY_Hvoid Key_Init(void);
uint8_t Key_GetNum(void);
void Key_control(void);
void Initial_Display(void);
void SetPWM(uint16_t value);
void Key_Tick(void);
uint8_t Key_GetState(void);#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"
#include "sys.h"
#include "AD.h"
#include "PWM.h"
#include "Timer.h"
#include "Encoder.h"int main(void)
{/*模塊初始化*/OLED_Init();		//OLED初始化Key_Init();			//按鍵初始化TIM2_PWM_Init();	//定時器2PWM初始化Timer_Init();Encoder_Init();/*OLED顯示靜態字符*/Initial_Display();while (1){Key_control();			//按鍵PWM控制}
}//中斷服務函數
//每次TIM3溢出時觸發中斷,調用Key_Tick()進行按鍵掃描
//清除中斷標志,避免重復進入中斷
void TIM3_IRQHandler(void)
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET){Key_Tick();TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}
}

實驗現象2

在這里插入圖片描述

在這里插入圖片描述

問題與解決

一上電程序卡死,原因是Timer3的中斷服務函數忘記清除相應的標志位。

總結

旋轉編碼器和電位器控制LED亮暗的區別
在這里插入圖片描述核心邏輯在于旋轉編碼器時中斷服務函數檢測旋轉方向,更新計數值,而電位器時ADC采樣。

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

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

相關文章

圖撲可視化點亮智慧城市垃圾分類新未來

圖撲基于 HT 開發的智慧城市廢棄物可視化管理系統&#xff0c;通過智能感知與三維可視化技術&#xff0c;構建全流程數字化監管平臺。系統實現固體廢物從源頭投放到終端處置的全程可視化追蹤&#xff0c;提供智能收運路徑規劃與資源回收管理方案&#xff0c;助力城市環境治理向…

Elasticsearch安全加固指南:啟用登錄認證與SSL加密

在之前文章中我們介紹了Elasticsearch安全與權限控制&#xff0c;本篇文章我們將詳細介紹 啟用登錄認證與SSL加密實踐配置操作 。 1 為什么需要安全加固&#xff1f; Elasticsearch默認不啟用安全功能&#xff0c;會導致以下風險&#xff1a; 未授權訪問&#xff1a;任何人都能…

前端知識點---本地存儲(javascript)

localStorage 是瀏覽器提供的一個 本地存儲 API&#xff0c;可以在用戶的瀏覽器中存儲數據&#xff0c;數據不會隨頁面刷新而丟失。 1. 基本用法 (1) 存儲數據&#xff08;setItem&#xff09; localStorage.setItem("username", "zhangsan");存儲 “use…

神經網絡能不能完全擬合y=x2 ???

先說結論&#xff1a;關鍵看激活函數的選擇 ReLU神經網絡對非線性函數的擬合分析 ReLU神經網絡對非線性函數&#xff08;如 y x 2 y x^2 yx2&#xff09;的擬合只能是逼近&#xff0c;而無法實現數學意義上的完全重合。這一結論源于ReLU的分段線性本質與目標函數的非線性結…

14.流程自動化工具:n8n和家庭自動化工具:node-red

n8n 安裝 docker方式 https://docs.n8n.io/hosting/installation/docker/ #https://hub.docker.com/r/n8nio/n8n docker pull n8nio/n8n:latest docker rm -f n8n; docker run -it \ --network macvlan --hostname n8n \ -e TZ"Asia/Shanghai" \ -e GENERIC_TIME…

哈密爾頓路徑(Hamiltonian Path)及相關算法題目

哈密爾頓路徑要求訪問圖中每個頂點恰好一次&#xff0c;通常用于解決旅行商問題&#xff08;TSP&#xff09;或狀態壓縮DP問題。 哈密爾頓路徑&#xff08;Hamiltonian Path&#xff09;是指在一個圖中經過每個頂點恰好一次的路徑。如果這條路徑的起點和終點相同&#xff08;即…

面試算法高頻02-樹

樹類型對比 數據結構定義節點特點遍歷方式常見操作時間復雜度&#xff08;平均&#xff09;時間復雜度&#xff08;最壞&#xff09;空間復雜度&#xff08;最壞&#xff09;與其他結構關系應用場景樹有根節點&#xff0c;分層級&#xff0c;包含父子、兄弟節點及子樹關系的非…

數論4 組合數

目錄 前言 求法一 代碼 求法二 代碼 求法三 代碼 求法四 代碼 前言 今天要將最后一部分&#xff0c;主要涉及組合數的四種求法。 前置知識 組合數的通項公式&#xff1a; 組合數的遞推公式&#xff1a; 盧卡斯定理&#xff1a; 我們今天需要求的四種求法主要基…

構建自己的私有 Git 服務器:基于 Gitea 的輕量化部署實戰指南

對于個人開發者、小型團隊乃至企業來說&#xff0c;將項目代碼托管在 GitHub、Gitee 等公共平臺雖然方便&#xff0c;但也存在一定的隱私與可控性問題。 搭建一套私有 Git 代碼倉庫系統&#xff0c;可以實現對源碼的完全控制&#xff0c;同時不依賴任何第三方平臺&#xff0c;…

Linux操作系統 4.Linux實用操作

一、各類小技巧&#xff08;快捷鍵&#xff09; 1.CTRL C 強制停止 1.Linux某些程序的運行&#xff0c;如果想要強行停止它&#xff0c;可以使用ctrlc 2.命令輸入錯誤&#xff0c;也可以通過快捷鍵ctrl c,退出當前輸入&#xff0c;重新輸入&#xff0c;或者ctrlc跳過當前這…

react redux的學習,單個reducer

redux系列文章目錄 一 什么redux&#xff1f; redux是一個專門用于做狀態管理的JS庫(不是react插件庫)。它可以用在react, angular, vue等項目中, 但基本與react配合使用。集中式管理react應用中多個組件共享的狀 簡單來說&#xff0c;就是存儲頁面的狀態值的一個庫&#xf…

PCI與PCIe接口的通信架構是主從模式嗎?

PCI&#xff08;Peripheral Component Interconnect&#xff09;總線在通信架構上本質是主從模式&#xff0c;但其具體實現和角色分配在不同版本&#xff08;如傳統PCI與PCI Express&#xff09;中存在差異。以下是詳細分析&#xff1a; 傳統PCI總線的主從模式 (1) 基本架構 主…

java項目掛機自動重啟操作指南

前段時間有個伙伴問我&#xff0c;java項目掛機怎么自動重啟。。。。。。今天就寫一個 .sh腳本來實現應用掛機的自動重啟功能 #!/bin/bash # 查詢mita的進程個數 countps -ef | grep mita.jar | grep -v "grep" | wc -l # echo $count nowtimedate "%Y-%m-%d %H…

開放最短路徑優先 - OSPF【LSA詳細】

目錄 LSA的頭部結構 LSA類型 LSA數據包 LSA的主要作用是傳遞路由信息。 LSA的頭部結構 共占20個字節&#xff0c;不同類型的LSA頭部字段部分都是相同的。 鏈路狀態老化時間(Link-State Age) 2個字節。指示該條LSA的老化時間&#xff0c;即它存在了多長時間&#xff0c;單位…

SpringBoot+Spring+MyBatis相關知識點

目錄 一、相關概念 1.spring框架 2.springcloud 3.SpringBoot項目 4.注解 5.SpringBoot的文件結構 6.啟動類原理 二、相關操作 1.Jar方式打包 2.自定義返回的業務狀態碼 3.Jackson 4.加載配置文件 5.異常處理 三、優化配置 1.簡化sql語句 2.查詢操作 復雜查詢 一…

《雙影奇境》手機版上線?ToDesk用跨平臺技術實現「全設備云電腦3A游戲」

《雙影奇境》是由Hazelight Studios研發發行的一款雙人合作冒險類游戲&#xff0c;玩家們在游戲中將扮演米歐和佐伊兩位風格迥異的女作家&#xff0c;劇情講述的是她們被騙進入一臺意在竊取創意的機器后便陷入了自己創作的故事之中&#xff0c;并且必須相互依靠&#xff0c;努力…

【教程】Windows下 Xshell 連接跳板機和開發機

需求 使用遠程連接工具 Xshell 連接跳板機&#xff0c;再從跳板機連接開發機&#xff0c;用戶登陸方式為使用密鑰。 方法 首先&#xff0c;建立一個會話&#xff0c;用于配置跳板機信息和開發機轉跳信息&#xff1a; 在【連接】頁面&#xff0c;給跳板機取個名字&#xff0c…

如何快速入門物聯網單片機開發?

背景 物聯網單片機硬件開發涉及多個階段&#xff0c;元器件是否“自己設計”取決于具體需求。以下是詳細解答和學習方案&#xff1a; 一、元器件是否自己設計&#xff1f; 通用元器件&#xff1a; 大多數情況下&#xff0c;開發者直接使用現成的標準化元器件&#xff08;如電阻…

每日一題(小白)模擬娛樂篇11

由題可知就是要求計算一個數字&#xff0c;可以整除10進制的每一位&#xff0c;亦可以整除8進制和16進制的每一位。要求找出第2023個能夠在三個進制下同時被10進制整除的數字。 Java中已經封裝了進制轉換的方法&#xff0c;以下是一些常用的轉換方法&#xff1a;&#x1f447;…

阿里巴巴langengine二次開發大模型平臺

阿里巴巴LangEngine開源了&#xff01;支撐億級網關規模的高可用Java原生AI應用開發框架 - Leepy - 博客園 阿里國際AI應用搭建平臺建設之路(上) - 框架篇 基于java二次開發 目前Spring ai、spring ai alibaba 都是java版本的二次基礎能力 重要的是前端工作流 如何與 服務端的…