主頁 > 作業系統 > STM32 SPI詳解

STM32 SPI詳解

2021-01-30 06:18:28 作業系統

1、SPI簡介

SPI 規定了兩個 SPI 設備之間通信必須由主設備 (Master) 來控制次設備 (Slave). 一個 Master 設備可以通過提供 Clock 以及對 Slave 設備進行片選 (Slave Select) 來控制多個 Slave 設備, SPI 協議還規定 Slave 設備的 Clock 由 Master 設備通過 SCK 管腳提供給 Slave 設備, Slave 設備本身不能產生或控制 Clock, 沒有 Clock 則 Slave 設備不能正常作業,

 

2、SPI特點

2.1、SPI控制方式

采用主-從模式(Master-Slave) 的控制方式,

SPI 規定了兩個 SPI 設備之間通信必須由主設備 (Master) 來控制次設備 (Slave). 一個 Master 設備可以通過提供 Clock 以及對 Slave 設備進行片選 (Slave Select) 來控制多個 Slave 設備, SPI 協議還規定 Slave 設備的 Clock 由 Master 設備通過 SCK 管腳提供給 Slave 設備, Slave 設備本身不能產生或控制 Clock, 沒有 Clock 則 Slave 設備不能正常作業,

 

2.2、SPI傳輸方式

采用同步方式(Synchronous)傳輸資料

Master 設備會根據將要交換的資料來產生相應的時鐘脈沖(Clock Pulse), 時鐘脈沖組成了時鐘信號(Clock Signal) , 時鐘信號通過時鐘極性 (CPOL) 和 時鐘相位 (CPHA) 控制著兩個 SPI 設備間何時資料交換以及何時對接收到的資料進行采樣, 來保證資料在兩個設備之間是同步傳輸的,

2.3、SPI資料交換

SPI資料交換框圖

上圖只是對 SPI 設備間通信的一個簡單的描述, 下面就來解釋一下圖中所示的幾個組件(Module):

SSPBUF,Synchronous Serial Port Buffer, 泛指 SPI 設備里面的內部緩沖區, 一般在物理上是以 FIFO 的形式, 保存傳輸程序中的臨時資料;

SSPSR, Synchronous Serial Port Register, 泛指 SPI 設備里面的移位暫存器(Shift Regitser), 它的作用是根據設定好的資料位寬(bit-width) 把資料移入或者移出 SSPBUF;

Controller, 泛指 SPI 設備里面的控制暫存器, 可以通過配置它們來設定 SPI 總線的傳輸模式,

 

SPI 設備間的資料傳輸之所以又被稱為資料交換, 是因為 SPI 協議規定一個 SPI 設備不能在資料通信程序中僅僅只充當一個 "發送者(Transmitter)" 或者 "接收者(Receiver)". 在每個 Clock 周期內, SPI 設備都會發送并接收一個 bit 大小的資料, 相當于該設備有一個 bit 大小的資料被交換了. 一個 Slave 設備要想能夠接收到 Master 發過來的控制信號, 必須在此之前能夠被 Master 設備進行訪問 (Access). 所以, Master 設備必須首先通過 SS/CS pin 對 Slave 設備進行片選, 把想要訪問的 Slave 設備選上. 在資料傳輸的程序中, 每次接收到的資料必須在下一次資料傳輸之前被采樣. 如果之前接收到的資料沒有被讀取, 那么這些已經接收完成的資料將有可能會被丟棄, 導致 SPI 物理模塊最終失效. 因此, 在程式中一般都會在 SPI 傳輸完資料后, 去讀取 SPI 設備里的資料, 即使這些資料(Dummy Data)在我們的程式里是無用的,

 

上面的程序轉為影片

初始狀態

 

 

 

 主機讀取一個bit程序

 

 

 

 

 

 總結:

沒有讀和寫的說法,因為實質上每次SPI是主從設備在交換資料,也就是說,你發一個資料必然會收到一個資料;你要收一個資料必須也要先發一個資料,

 

2.4、SPI傳輸模式

上升沿、下降沿、前沿、后沿觸發,當然也有MSB和LSB傳輸方式.

 

3、作業機制

3.1、相關縮寫

SPI的極性Polarity和相位Phase,最常見的寫法是CPOL和CPHA,不過也有一些其他寫法,簡單總結如下:

(1) CKPOL (Clock Polarity) = CPOL = POL = Polarity = (時鐘)極性

(2) CKPHA (Clock Phase) = CPHA = PHA = Phase = (時鐘)相位

(3) SCK=SCLK=SPI的時鐘

(4) Edge=邊沿,即時鐘電平變化的時刻,即上升沿(rising edge)或者下降沿(falling edge)

對于一個時鐘周期內,有兩個edge,分別稱為:

Leading edge=前一個邊沿=第一個邊沿,對于開始電壓是1,那么就是1變成0的時候,對于開始電壓是0,那么就是0變成1的時候;

Trailing edge=后一個邊沿=第二個邊沿,對于開始電壓是1,那么就是0變成1的時候(即在第一次1變成0之后,才可能有后面的0變成1),對于開始電壓是0,那么就是1變成0的時候;

 

3.2、CPOL極性

先說什么是SCLK時鐘的空閑時刻,其就是當SCLK在數發送8個bit位元資料之前和之后的狀態,于此對應的,SCLK在發送資料的時候,就是正常的作業的時候,有效active的時刻了,

先說英文,其精簡解釋為:Clock Polarity = IDLE state of SCK,

再用中文詳解:

SPI的CPOL,表示當SCLK空閑idle的時候,其電平的值是低電平0還是高電平1:

CPOL=0,時鐘空閑idle時候的電平是低電平,所以當SCLK有效的時候,就是高電平,就是所謂的active-high;

CPOL=1,時鐘空閑idle時候的電平是高電平,所以當SCLK有效的時候,就是低電平,就是所謂的active-low;

 

3.3、CPHA相位

首先說明一點,capture strobe = latch = read = sample,都是表示資料采樣,資料有效的時刻,相位,對應著資料采樣是在第幾個邊沿(edge),是第一個邊沿還是第二個邊沿,0對應著第一個邊沿,1對應著第二個邊沿,

對于:

CPHA=0,表示第一個邊沿:

對于CPOL=0,idle時候的是低電平,第一個邊沿就是從低變到高,所以是上升沿;

對于CPOL=1,idle時候的是高電平,第一個邊沿就是從高變到低,所以是下降沿;

CPHA=1,表示第二個邊沿:

對于CPOL=0,idle時候的是低電平,第二個邊沿就是從高變到低,所以是下降沿;

 

3.4、極性和相位圖示

圖例1

圖例2

3.5 、軟體設定極性和相位

SPI分主設備和從設備,兩者通過SPI協議通訊,

而設定SPI的模式,是從設備的模式,決定了主設備的模式,

所以要先去搞懂從設備的SPI是何種模式,然后再將主設備的SPI的模式,設定和從設備相同的模式,即可正常通訊,

對于從設備的SPI是什么模式,有兩種:

 

1.固定的,有SPI從設備硬體決定的

SPI從設備,具體是什么模式,相關的datasheet中會有描述,需要自己去datasheet中找到相關的描述,即:

關于SPI從設備,在空閑的時候,是高電平還是低電平,即決定了CPOL是0還是1;

然后再找到關于設備是在上升沿還是下降沿去采樣資料,這樣就是,在定了CPOL的值的前提下,對應著可以推算出CPHA是0還是1了,

 

2.可配置的,由軟體自己設定

從設備也是一個SPI控制器,4種模式都支持,此時只要自己設定為某種模式即可,

然后知道了從設備的模式后,再去將SPI主設備的模式,設定為和從設備模式一樣,即可,

對于如何配置SPI的CPOL和CPHA的話,不多細說,多數都是直接去寫對應的SPI控制器中對應暫存器中的CPOL和CPHA那兩位,寫0或寫1即可,

 

4、STM32的SPI控制模塊

SPI是英語Serial Peripheral interface的縮寫,顧名思義就是串行外圍設備介面,是Motorola首先在其MC68HCXX系列處理器上定義的,SPI介面主要應用在EEPROM,FLASH,實時時鐘,AD轉換器,還有數字信號處理器和數字信號解碼器之間,SPI,是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節約了芯片的管腳,同時為PCB的布局上節省空間,提供方便,正是出于這種簡單易用的特性,現在越來越多的芯片集成了這種通信協議,STM32也有SPI介面,

SPI介面一般使用4條線通信:

MISO  主設備資料輸入,從設備資料輸出,

MOSI  主設備資料輸出,從設備資料輸入,

SCLK  時鐘信號,由主設備產生,

CS  從設備片選信號,由主設備控制,

SPI主要特點有:可以同時發出和接收串行資料;可以當作主機或從機作業;提供頻率可編程時鐘;發送結束中斷標志;寫沖突保護;總線競爭保護等,

STM32的SPI功能很強大,SPI時鐘最多可以到18Mhz,支持DMA,可以配置為SPI協議或者I2S協議

 

關于SPI,從資料手冊查到

STM32F207VCT6共有3個SPI,

從下表查出每個SPI對應的管腳

STM32標準外設庫SPI_InitTypeDef的定義

 
typedef struct
{
    uint16_t SPI_Direction; // 設定SPI 的通信方式,可以選擇為半雙工,全雙工,以及串行發和串行收方式
   uint16_t SPI_Mode; // 設定SPI 的主從模式
   uint16_t SPI_DataSize; // 為8 位還是16 位幀格式選擇項
   uint16_t SPI_CPOL; // 設定時鐘極性
   uint16_t SPI_CPHA; // 設定時鐘相位
   uint16_t SPI_NSS;   //設定NSS 信號由硬體(NSS管腳)還是軟體控制
   uint16_t SPI_BaudRatePrescaler;  //設定SPI 波特率預分頻值
   uint16_t SPI_FirstBit;    //設定資料傳輸順序是MSB 位在前還是LSB 位在前
   uint16_t SPI_CRCPolynomial; //設定CRC 校驗多項式,提高通信可靠性,大于1 即可
}SPI_InitTypeDef;

第一個引數SPI_Direction 是用來設定SPI的通信方式,可以選擇為半雙工,全雙工,以及串行發和串行收方式,這里我們選擇全雙工模式SPI_Direction_2Lines_FullDuplex,

第二個引數SPI_Mode用來設定SPI的主從模式,這里我們設定為主機模式 SPI_Mode_Master,當然有需要你也可以選擇為從機模式 SPI_Mode_Slave,

第三個引數SPI_DataSiz為8位還是16位幀格式選擇項,這里我們是8位傳輸,選擇SPI_DataSize_8b,

第四個引數SPI_CPOL用來設定時鐘極性,我們設定串行同步時鐘的空閑狀態為高電平所以我們選擇SPI_CPOL_High,

第五個引數SPI_CPHA 用來設定時鐘相位,也就是選擇在串行同步時鐘的第幾個跳變沿(上升或下降)資料被采樣,可以為第一個或者第二個條邊沿采集,這里我們選擇第二個跳變沿,所以選擇 SPI_CPHA_2Edge

第六個引數SPI_NSS設定NSS信號由硬體(NSS管腳)還是軟體控制,這里我們通過軟體控制NSS關鍵,而不是硬體自動控制,所以選擇 SPI_NSS_Soft,

第七個引數 SPI_BaudRatePrescaler很關鍵,就是設定 SPI 波特率預分頻值也就是決定 SPI 的時鐘的引數,從不分頻道256分頻8個可選值,初始化的時候我們選擇256分頻值SPI_BaudRatePrescaler_256,傳輸速度為36M/256=140.625KHz,

第八個引數 SPI_FirstBit設定資料傳輸順序是 MSB 位在前還是LSB位在前,這里我們選擇SPI_FirstBit_MSB高位在前,

第九個引數 SPI_CRCPolynomial是用來設定CRC校驗多項式,提高通信可靠性,大于1即可,

示例代碼:

void  SPIInit( void )
{
    SPI_InitTypeDef SPI_InitStructure;
    FLASH_GPIO_Init();
    /*!< Deselect the FLASH: Chip Select high */
    GPIO_SetBits( GPIOA, GPIO_Pin_4 );
    /*!< SPI configuration */
    SPI_InitStructure.SPI_Direction     = SPI_Direction_2Lines_FullDuplex;      /* 雙線雙向全雙工 */
    SPI_InitStructure.SPI_Mode      = SPI_Mode_Master;                      /* 主 SPI */
    SPI_InitStructure.SPI_DataSize      = SPI_DataSize_8b;                      /* SPI 發送接收 8 位幀結構 */
    SPI_InitStructure.SPI_CPOL      = SPI_CPOL_High;                        /* 串行同步時鐘的空閑狀態為高電平 */
    SPI_InitStructure.SPI_CPHA      = SPI_CPHA_2Edge;                       /* 第二個跳變沿資料被采樣 */
    SPI_InitStructure.SPI_NSS       = SPI_NSS_Soft;                         /* NSS 信號由軟體控制 */
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;             /* 預分頻 16 */
 
    SPI_InitStructure.SPI_FirstBit      = SPI_FirstBit_MSB;                     /* 資料傳輸從 MSB 位開始 */
    SPI_InitStructure.SPI_CRCPolynomial = 7;                                    /* CRC 值計算的多項式 */
    SPI_Init( SPI1, &SPI_InitStructure );
    /*!< Enable the sFLASH_SPI  */
    SPI_Cmd( SPI1, ENABLE );
}

看到這里,可能覺的前面講原理并沒有太大的用處,因為STM32集成了SPI控制器,配置一下即可,

 

一方面我們學習原理是為了更好的理解SPI,用于對接不同的SPI設備,像norflash的spi驅動網上有大量的例子,不容易出錯,但并不是特別常見的,spi驅動SD卡,SPI驅動網路PHY,SPI驅動ESP8266,甚至在設計兩個IC通信時,由于沒有過多GPIO,又覺的IIC通信速度慢的話,可以設計兩個IC之間使用SPI通信,顯然這些場景就需要了解SPI的原理

 

另外一方面,實際應用中,有可能因為芯片其他管腳用于特殊功能,留下的管腳沒有硬體SPI功能,只能模擬實作,這個時候學習SPI原理就很有必要了,

5、SPI的應用

SPI的常用應用NorFlash

從資料手冊上看到,SPI傳輸:CKPOL=1 , CKPHA=1

所以STM32的SPI讀取NorFlash的配置如下

抓取下面代碼波形

抓取的波形如下

0100 1011 就是0X4B

 

其中看到:

起始電平是高電平,也就是CKPOL=1

第二個邊沿采樣,也就是CKPHA=1

其實說成類似IIC的高電平有效也是沒有問題的

下面這句話是寫模擬SPI的核心

自己的理解:在下降沿轉換資料,在上升沿采樣資料

 

除了抓取波形,在華邦Flash也看到了時序圖

6、code

讀取norflash

使用STM32F207硬體SPI模塊

/**
  * @brief  Initializes the peripherals used by the SPI FLASH driver.
  * @param  None
  * @retval None
  */
void FLASH_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  
  /*!< Enable the SPI clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  
  /*!< Enable GPIO clocks */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); 
  /*!< SPI pins configuration *************************************************/
  
  /*!< Connect SPI pins to AF5 */  
  GPIO_PinAFConfig(GPIOA, 5, GPIO_AF_SPI1);
  GPIO_PinAFConfig(GPIOA, 6, GPIO_AF_SPI1);
  GPIO_PinAFConfig(GPIOB, 5, GPIO_AF_SPI1);
  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;//GPIO_PuPd_DOWN;
  
  /*!< SPI SCK pin configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /*!< SPI MISO pin configuration */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /*!< SPI MOSI pin configuration */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  /*!< Configure sFLASH Card CS pin in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
}
 
/**
  * @brief  Initializes the peripherals used by the SPI FLASH driver.
  * @param  None
  * @retval None
  */
void  FLASH_SPIInit(void)
{  
  
  SPI_InitTypeDef  SPI_InitStructure;
  
  FLASH_GPIO_Init();
  
  /*!< Deselect the FLASH: Chip Select high */
  GPIO_SetBits(GPIOE,GPIO_Pin_12);
  
  /*!< SPI configuration */
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//雙線雙向全雙工
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//主 SPI
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;// SPI 發送接收 8 位幀結構
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//串行同步時鐘的空閑狀態為高電平 
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//第二個跳變沿資料被采樣
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//NSS 信號由軟體控制
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;//預分頻 16
  
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//資料傳輸從 MSB 位開始
  SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC 值計算的多項式
  SPI_Init(SPI1, &SPI_InitStructure);
  /*!< Enable the sFLASH_SPI  */
  SPI_Cmd(SPI1, ENABLE);
}

軟體模擬SPI協議

/**
  * @brief  Sends a byte through the SPI interface and return the byte received
  *         from the SPI bus.
  * @param  byte: byte to send.
  * @retval The value of the received byte.
  */
uint8_t SPI_ReadWriteByte(uint8_t data)
{
  uint8_t i,data_read = 0;  
  if(data!=0xA5){
    for(i=0;i<8;i++){
      MSPI_CLK_L();                                                        
      if(data&0x80){                                                        
    MSPI_MOSI_H();
      }else{
    MSPI_MOSI_L();
      }
      MSPI_DELAY();
      data = data<<1;                                                        
      MSPI_CLK_H();                                                         
      MSPI_DELAY();                                                            
    }
    return data_read;
  }else{
    for(i=0;i<8;i++){
      MSPI_CLK_L();                                             
      MSPI_DELAY();                                             
      data_read = data_read<<1;                                           
      MSPI_CLK_H();                                            
      if(MSPI_READ_IN()){                                                    
    data_read |= 0x01;                                       
      }
      MSPI_DELAY();
    }
    return data_read;
  }                                              
}
 
/**
  * @brief  Initializes the peripherals used by the SPI FLASH driver.
  * @param  None
  * @retval None
  */
void FLASH_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
 
  /*!< Enable GPIO clocks */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  
  /*!< Configure sFLASH Card CS pin in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
  
  /*!< SPI SCK pin configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  MSPI_CLK_H();
  
  /*!< SPI MOSI pin configuration */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  MSPI_MOSI_H();
  
  /*!< SPI MISO pin configuration */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}
 
/**
  * @brief  Initializes the peripherals used by the SPI FLASH driver.
  * @param  None
  * @retval None
  */
void  FLASH_SPIInit(void)
{  
  
  FLASH_GPIO_Init();
  
  /*!< Deselect the FLASH: Chip Select high */
  GPIO_SetBits(GPIOE,GPIO_Pin_12);
}

開源地址:

https://github.com/strongercjd/STM32F207VCT6

 

點擊查看本文所在的專輯,STM32F207教程

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/254284.html

標籤:其他

上一篇:使用tcpdump查看原始資料包

下一篇:avalonia專案在銀河麒麟作業系統arm架構上運行報錯:default font family is not be null or empty

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more