NOR FLASH介紹

參考

http://t.csdnimg.cn/gHcrG

一、NOR FLASH簡介

XIP技術:https://blog.csdn.net/ffdia/article/details/87437872?fromshare=blogdetail
在這里插入圖片描述

在這里插入圖片描述

NOR Flash 和 NAND Flash 的特點和應用舉例:
NOR Flash:
特點:
支持隨機訪問,可以直接像讀取內存一樣通過獨立的地址線和數據線進行字節級讀取,不需要額外的解碼電路。
提供快速的讀取速度,通常比NAND Flash快,特別適合于執行代碼(XIP,eXecute-In-Place)的場合。
擦除和寫入是以區塊(sector)為單位,但也可以支持單個字節的編程。
通常沒有壞塊管理問題,出廠時質量較為均勻。
容量相對較小,成本相對較高。

應用舉例:
存儲程序代碼,例如微控制器的Bootloader、嵌入式系統的固件、計算機BIOS等。
快速讀取要求較高的小型存儲應用,如無線通信模塊、工業控制設備中的程序存儲。

NAND Flash:
特點:

不支持隨機訪問,讀取操作需要通過I/O口間接進行,地址和數據共用總線。
讀取速度略低于NOR Flash,但寫入和擦除速度較快,尤其是以頁(page)為單位的大批量操作。
通常以較大的塊(block)為擦除單位,且存在壞塊管理問題,需要專門的管理機制。
成本較低,容量較大,體積緊湊,適合大規模數據存儲。

應用舉例:
大容量存儲設備,如嵌入式系統的文件系統、消費類電子產品中的數據存儲、SSD(固態硬盤)。
移動設備的內置存儲,如智能手機和平板電腦的eMMC(Embedded MultiMedia Card)。
U盤、存儲卡等便攜式存儲設備。

二、NM25Q128簡介

在這里插入圖片描述
在這里插入圖片描述
NM25Q128是一款128Mb(16MB)容量的NOR型串行閃存芯片,專為需要高速、可靠數據存儲的應用而設計。該器件通過SPI(Serial Peripheral Interface)接口與主控設備通信,提供了一種節省引腳、易于集成到系統中的存儲方案。

特點概述:
容量:128Mb,即16,777,216比特(約2MB)。
擦寫次數:具有很高的耐用性,可承受至少10萬次的擦寫周期。
數據保存期長:數據可保存長達20年以上,體現了NOR Flash優異的數據保留性能。
SPI接口:支持SPI模式0(CPOL=0, CPHA=0)和模式3(CPOL=1, CPHA=1),適用于多種工作環境和系統設計需求。
數據格式:采用8位數據寬度傳輸,遵循先發高位(MSB)再發低位(LSB)的傳輸規則。
傳輸速度:標準模式下支持高達104M bit/s的數據傳輸速率,具有高效的讀寫性能。

接口信號說明:
CS(Chip Select):片選信號輸入,用于選擇NM25Q128作為SPI總線上的活動設備。
HOLD:暫停通訊信號,當該信號為低電平時,暫時停止SPI通信。
SO(Serial Output):數據輸出引腳,從NM25Q128向主控設備傳送數據。
CLK(Clock):時鐘輸入引腳,為主設備與NM25Q128之間的數據傳輸提供同步時鐘信號。
WP(Write Protect):寫保護功能引腳,用于禁止或允許對閃存進行寫入操作。
SI(Serial Input):數據輸入引腳,用于將數據從主設備寫入NM25Q128。

總的來說,NM25Q128因其高密度、高速度、易用性和耐用性等特點,被廣泛應用于嵌入式系統、固件存儲、微控制器的代碼存儲、數據記錄等多種場合。

三、NM25Q128存儲結構

在這里插入圖片描述
在這里插入圖片描述

NM25Q128的存儲結構按照地址范圍、頁、扇區和塊進行組織,其具體劃分如下:

**地址范圍:**NM25Q128的地址范圍是從0x00000000到0x00FFFFFF,共計16,777,216個地址,對應128Mbit(16,777,216比特)或16MByte(16,777,216字節)的存儲容量。

存儲單元劃分:
Page:NM25Q128的一個頁面(Page)大小為256字節(1byte * 256)。
Sector:一個扇區(Sector)由16個連續的頁面組成,因此一個扇區的大小為16 * 256字節 = 4096字節。
Block:一個塊(Block)由16個連續的扇區組成,所以一個塊的大小為16 * 4096字節 = 65,536字節(即64KB)。

**整體結構:**整個NM25Q128由256個這樣的塊組成,因此其總容量為256 * 65,536字節 = 16,777,216字節(即16MByte)。

這種分層結構使得NM25Q128在進行數據管理和維護時具有良好的靈活性,最小擦除單位為一個扇區,數據讀寫則以字節為單位。在進行擦除操作時,必須以扇區為單位進行,這樣有助于提升使用壽命并簡化固件升級等操作。

四、NM25Q128常用指令

在這里插入圖片描述
在這里插入圖片描述
NM25Q128或者其他NOR Flash常用的指令還包括但不限于以下幾種:
指令(十六進制):0x06
名稱:寫使能(Write Enable)
作用:在對NOR Flash進行任何寫入操作(包括頁寫和擦除)之前,必須先發送這條指令,使得NOR Flash進入寫入允許狀態。

指令(十六進制):0x05
名稱:讀狀態寄存器1(Read Status Register 1)
作用:用于讀取NOR Flash的狀態寄存器1,確認NOR Flash是否處于空閑狀態,是否準備好進行下一步操作,特別是擦除操作之前需要確認設備是否已完成上一次操作。

指令(十六進制):0x03
名稱:讀數據(Read Data)
作用:用于從NOR Flash中讀取數據,通過指定地址讀取連續的數據流。

指令(十六進制):0x02
名稱:頁編程(Page Program)
作用:用于向NOR Flash的指定地址開始的連續256字節區域寫入數據。注意,寫入數據必須按照頁的邊界進行,不能跨越頁的邊界。

指令(十六進制):0x20
名稱:扇區擦除(Sector Erase)
作用:對NOR Flash中最小擦除單位(扇區)進行擦除操作,通常NM25Q128的一個扇區大小為4096字節(4KB)。

除此之外,還有其他的指令,例如:

指令(十六進制):0xD8
名稱:塊擦除(Bulk Erase)
作用:擦除整個芯片的所有數據,對于NM25Q128來說,一次性擦除所有256個塊。

指令(十六進制):0xB0~0xBF
名稱:讀取標識符(Read Manufacturer and Device ID)
作用:讀取制造商ID和設備ID,用于驗證和識別具體的NOR Flash型號。

指令(十六進制):0x04
名稱:寫禁止(Write Disable)
作用:結束寫入操作序列,防止意外的寫入動作發生,使NOR Flash退出寫入允許狀態。

五、NM25Q128 讀/擦除/寫 步驟

在這里插入圖片描述

NM25Q128的讀、擦除、寫操作時序如下:
1.寫使能(Write Enable)
發送指令:0x06H
作用:在執行寫操作(如頁寫或擦除)之前,必須先發送該指令,使NOR Flash進入可寫狀態。

2.讀狀態寄存器1(Read Status Register 1)
發送指令:0x05H
作用:讀取NOR Flash的狀態寄存器1,檢查設備是否處于就緒狀態,以便進行下一步操作。

3.讀數據時序(Read Data Bytes)
發送指令:0x03H
時序步驟:
發送讀指令(0x03H);
發送要讀取數據的起始地址;
從數據線(SO)接收數據;
循環上述步驟直到讀取所需的所有數據。

4.頁寫時序(Page Program)
發送指令:0x02H
時序步驟:
發送寫使能指令(0x06H);
發送頁寫指令(0x02H);
發送要寫入數據的目標地址;
將最多256字節的數據通過數據線(SI)發送到NOR Flash;
等待寫操作完成,可通過讀狀態寄存器來確認。

5.扇區擦除時序(Sector Erase)
發送指令:0x20H
時序步驟:
發送寫使能指令(0x06H);
發送扇區擦除指令(0x20H);
發送要擦除扇區的起始地址(地址應對齊到扇區邊界);
等待擦除操作完成,可通過讀狀態寄存器來確認。

在實際操作過程中,還需注意地址和數據的傳輸格式以及相關的時鐘同步,確保嚴格按照器件數據手冊的要求進行操作。此外,某些操作完成后,建議發送寫禁止指令(0x04H)以防止意外的寫操作。

在這里插入圖片描述
在執行諸如Page Program(頁寫)、Sector Erase(扇區擦除)、Block Erase(塊擦除)和Chip Erase(整片擦除)以及Write Status Register(寫狀態寄存器)等操作之前,必須先向NOR Flash發送Write Enable(寫使能)指令(0x06H)。這個指令的作用是讓NOR Flash進入可寫狀態,只有在寫使能之后,才能進行后續的寫入或擦除操作。

當寫使能指令發出后,NOR Flash內部的相關控制位會被設置,允許接下來的寫入或擦除指令被執行。完成相應的寫入或擦除操作后,通常需要發送Write Disable(寫禁止)指令以取消寫使能狀態,防止在不需要寫入的時候誤操作導致數據損壞。寫禁止指令通常為0x04H。

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
NM25Q128的讀操作步驟可以細化如下:

1.發送讀命令
向SPI總線的MOSI(數據輸入)線上發送0x03H(讀數據指令)。

2.發送地址
NM25Q128地址范圍是0x000000到0xFFFFFF,總共24位。
地址需要按照小端模式(Least Significant Bit First,LSB)分三次發送,每次8位。例如,要讀取地址0x123456,則應按以下順序發送地址字節:
第一次發送最低8位(0x56)。
第二次發送中間8位(0x34)。
第三次發送最高8位(0x12)。

3.讀取數據
在地址發送完畢后,發送一個無效數據字節(通常是0xFF)到SPI總線的MOSI線上,此時NM25Q128開始在MISO(數據輸出)線上輸出請求地址處的數據。
接收從NM25Q128返回的第一個數據字節,并且只要保持SPI時鐘(SCK)的持續脈沖,就可以連續讀取數據,直至所需數據全部讀取完畢。

總之,NM25Q128的讀操作流程是先發送讀指令,接著發送目標地址,然后通過發送無效數據字節觸發并連續讀取存儲器中的數據。在整個讀取過程中,務必確保時鐘信號的正確同步,以保證數據的準確傳輸。
在這里插入圖片描述
NM25Q128擦除扇區的具體步驟如下:

1.發送寫使能命令
向SPI總線的MOSI(數據輸入)線上發送0x06H(寫使能命令),使NOR Flash進入可寫狀態。

2.等待空閑
讀取并檢查狀態寄存器(通常通過發送0x05H指令讀取),確保NOR Flash已經完成之前的任何操作,并且處于空閑狀態。只有在空閑狀態下,才能進行下一步的擦除操作。

3.發送擦除扇區命令
向SPI總線的MOSI線上發送0x20H(扇區擦除命令),通知NOR Flash即將進行扇區擦除操作。

4.發送地址
根據要擦除的扇區地址,將24位地址按照小端模式(LSB優先)分三次發送到SPI總線的MOSI線上。地址應對齊到扇區邊界,即扇區的起始地址。

5.等待空閑
在發送完擦除命令和地址后,需要再次等待NOR Flash完成擦除操作并回到空閑狀態。通常通過輪詢讀取狀態寄存器來判斷是否完成,狀態寄存器中的相應位變為適當狀態時,表示擦除操作完成。

需要注意的是,整個擦除操作期間需要確保時鐘信號SCK的正確同步,并且在擦除操作結束后,最好發送寫禁止命令(0x04H)以避免意外的寫操作。此外,在實際應用中,請參照NM25Q128的具體數據手冊,遵循正確的時序和操作規范。
在這里插入圖片描述
NM25Q128寫操作步驟(此處假設目標區域已經經過擦除):

1.擦除扇區(20H)
在寫入數據前,需要確保目標地址所在的扇區已經被擦除。如果目標地址的數據尚未擦除,可參照之前提供的擦除扇區步驟進行操作。

2.發送寫使能命令
向SPI總線的MOSI(數據輸入)線上發送0x06H(寫使能命令),使NOR Flash進入可寫狀態。

3.發送頁寫命令
向SPI總線的MOSI線上發送0x02H(頁寫命令),通知NOR Flash即將進行頁寫操作。

4.發送地址
根據要寫入數據的目標地址,將24位地址按照小端模式(LSB優先)分三次發送到SPI總線的MOSI線上。

5.發送數據
在發送完地址后,立即通過SPI總線的MOSI線將最多256字節的數據寫入到NOR Flash中。注意數據應按照字節順序逐個發送,且必須連續寫入整個一頁。

6.等待空閑
在發送完所有數據后,需要等待NOR Flash完成寫入操作并返回到空閑狀態。可以通過輪詢讀取狀態寄存器來判斷寫入是否完成,當狀態寄存器中的相應位變為適當狀態時,表示寫入操作完成。

在實際應用中,一定要確保寫入數據前目標區域已被擦除,并且在寫入操作結束后,推薦發送寫禁止命令(0x04H)以避免不必要的寫操作。同時,嚴格遵守NM25Q128的數據手冊中規定的時序要求。

六、NOR FLASH基本驅動步驟

在這里插入圖片描述
在這里插入圖片描述
NOR FLASH基于SPI接口的基本驅動步驟可以概括為以下幾點:

1.SPI工作參數配置初始化
使用HAL_SPI_Init()函數對SPI外設進行初始化,設置工作模式(CPOL和CPHA)、時鐘速度、數據幀格式(8位、16位等)、NSS管理方式等參數。

2.使能SPI時鐘和初始化相關引腳
首先,通過__HAL_RCC_SPIx_CLK_ENABLE()函數啟用SPI外設的時鐘。
其次,對于STM32等微控制器,需要配置SPI接口相關的GPIO引腳為復用推挽輸出模式或其他合適的模式,這部分操作通常不在HAL_SPI_MspInit()函數內完成,而是在初始化SPI之前手動配置GPIO的AF(Alternate Function)寄存器。

// 示例代碼(偽代碼)
GPIO_InitStruct.Pin = GPIO_PIN_...; // 設置SPI對應引腳
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 設置為復用推挽輸出模式
GPIO_InitStruct.Pull = GPIO_NOPULL; // 如果不需要上下拉電阻,設置為無上拉下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 設置GPIO速度
GPIO_InitStruct.Alternate = GPIO_AF_SPIx; // 設置對應SPI外設的復用功能
HAL_GPIO_Init(GPIOx, &GPIO_InitStruct); // 初始化GPIO引腳

3.使能SPI
使用__HAL_SPI_ENABLE(&hspi)函數使能SPI外設,這里的hspi是指向SPI_HandleTypeDef結構體的指針。

4.SPI傳輸數據
發送數據:使用HAL_SPI_Transmit(&hspi, tx_buffer, size, timeout)函數發送數據,tx_buffer是發送緩沖區,size是發送數據的長度,timeout是超時時間。
接收數據:使用HAL_SPI_Receive(&hspi, rx_buffer, size, timeout)函數接收數據,rx_buffer是接收緩沖區。
同時發送和接收:使用HAL_SPI_TransmitReceive(&hspi, tx_buffer, rx_buffer, size, timeout)函數執行全雙工傳輸。

5.設置SPI傳輸速度
根據系統要求,操作SPI_CR1寄存器(或相關的時鐘配置寄存器)中的波特率控制位來設置SPI通信的時鐘頻率。在HAL庫中,通常在HAL_SPI_Init()函數里通過配置SPI_InitTypeDef結構體中的BaudRatePrescaler字段來間接設置SPI時鐘速度。

在這里插入圖片描述
NM25Q128 NOR Flash的驅動步驟可以歸納為以下詳細步驟:
1.初始化片選引腳與SPI接口

配置NM25Q128對應的片選引腳為GPIO輸出模式,并將其設置為高電平(通常意味著SPI處于非選通狀態)。
初始化SPI接口:
配置SPI的工作模式(根據NM25Q128支持的SPI模式0或模式3)。
設置數據傳輸位數(通常是8位)。
分配SPI時鐘源并設置分頻系數以得到合適的SPI時鐘頻率。
根據需求設置數據傳輸順序(MSB或LSB優先)。
使用HAL庫函數如HAL_SPI_Init()進行初始化。

2.NM25Q128 讀取
發送讀取指令(0x03)。
發送24位地址(地址對齊到讀取粒度)。
通過SPI接口讀取數據,可以循環讀取直到需要的數據量接收完畢。

3.NM25Q128 扇區擦除
發送寫使能指令(0x06)。
確保設備處于空閑狀態,可以通過讀取狀態寄存器來判斷。
發送扇區擦除指令(0x20)。
發送24位地址(地址對齊到扇區邊界)。
等待設備完成擦除操作并返回空閑狀態。

4.NM25Q128 寫入
可選:如果目標地址所在的扇區尚未擦除,則先執行扇區擦除。
發送寫使能指令(0x06)。
發送頁寫指令(0x02)。
發送24位地址(地址對齊到頁邊界)。
發送要寫入的數據,每次最多256字節(一個頁)。
確保所有數據發送完畢,并等待設備返回空閑狀態。

NOR FLASH驅動注意事項:
**1.是否需要擦除:**在向NOR Flash寫入數據前,必須確保目標地址所在的區域已經被擦除,因為NOR Flash只能向已擦除的區域寫入數據,且是以塊(扇區/頁)為單位進行擦除操作。
2.寫入數據:
**換頁:**如果需要寫入的數據跨越了頁的邊界,必須分開多次寫入操作,每次寫入不超過一個頁的數據量。
換扇區:同樣的,如果跨越了扇區邊界,也需確保對相鄰扇區做相應的擦除操作。
**3.遵循讀、改、寫的原則:**在修改已存在的數據時,通常需要先讀取原始數據,更改需要改變的部分,然后覆蓋寫入整個塊(或頁)。這是因為在NOR Flash中不能直接修改已寫入的數據,只能通過擦除后再寫入的方式更新數據。
在實際應用中,應根據NM25Q128的數據手冊和所使用的HAL庫函數來精確實施上述步驟。

七、編程實戰

在這里插入圖片描述

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

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

相關文章

QT作業4

1、思維導圖 2、使用定時器完成鬧鐘 頭文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLineEdit> #include <QLabel> #include <QPushButton> #include <QTextEdit> #include <QDebug> #include <…

收集郵票C++題目【概率期望DP+數學推導】

題意 Description 有 n n n 種不同的郵票&#xff0c;皮皮想收集所有種類的郵票。唯一的收集方法是到同學凡凡那里購買&#xff0c;每次只能買一張&#xff0c;并且 買到的郵票究竟是 n n n 種郵票中的哪一種是等概率的&#xff0c;概率均為 1 n \frac{1}{n} n1?。但是由…

【elasticsearch】慢查詢替代查詢審計的嘗試

【elasticsearch】慢查詢替代查詢審計的嘗試 使用了es有兩年了&#xff0c;突然發現一個&#xff0c;es沒有查詢審計日志&#xff0c;某個用戶查詢了某個索引的審計。 找了官方文檔和社區的回復都是說使用slow log替代慢查詢。 嘗試一下。 參考鏈接1&#xff1a;https://discus…

Py深度學習基礎|關于Batch Normalization

1. 為什么需要Batch Normalization 通常我們會在輸入層進行數據的標準化處理&#xff0c;這是為了讓模型學習到更好的特征。同樣&#xff0c;在模型的中間層我們也可以進行normalize。在神經網絡中, 數據分布對訓練會產生影響。 比如我們使用tanh作為激活函數&#xff0c;當輸入…

Baidu Comate智能編碼助手:AI編程時代提升效率的好幫手

目錄 寫在前面一、如何安裝二、如何使用場景需求體驗步驟 三、AI 編程實戰指令功能插件功能知識庫功能 四、問題建議五、體驗總結&#x1f680;寫在最后 寫在前面 Baidu Comate 是基于文心大模型的 AI編程工具&#xff0c;它結合百度積累多年的編程現場大數據和外部優秀開源數據…

MySQL中的多表查詢

數據庫設計范式(范例) 好的數據庫設計&#xff0c;事倍功半&#xff0c;不會有歧義 第一范式&#xff1a;列保證原子性&#xff08;列不可再分解&#xff09; 聯系方式&#xff1a;電話&#xff0c;微信&#xff0c;QQ&#xff0c;郵箱 這些都不可分解 第二范式&#xff1a;要…

annaconda詳細解讀換源文件

annaconda換源詳細解讀文件 annaconda換源詳細解讀文件 annaconda換源詳細解讀文件 #踩坑/annaconda換源詳細解讀通道問題 如何準確使用國內源高效安裝GPU版本的Pytorch - 知乎 文件中的custom通道&#xff0c;需要自己手動添加到默認通道里面&#xff0c;記得后面更上/包名…

在xAnyLabeling中加載自己訓練的yolov8s-obb模型進行半自動化標注

任務思路&#xff1a; 先使用xAnyLabeling標注一部分樣本&#xff0c;訓練出v1版本的yolov8-obb模型&#xff0c;然后加載yolov8-obb模型到xAnyLabeling中對其余樣本進行半自動化標注。節省工作量。 任務流程&#xff1a; 1.準備xAnyLabeling標注工具 下載代碼&#xff0c;…

Redis系列-3 Redis緩存問題

1.緩存的作用 數據庫(如Mysql)的持久化特點帶來了較低的性能&#xff0c;高并發的場景下&#xff0c;連接池很快被耗盡而出現宕機或DOS&#xff0c;無法繼續對外提供服務。相對于數據庫的硬盤IO&#xff0c;緩存中間件基于內存進行讀寫&#xff0c;從而具備較大的吞吐量和高并…

SpringBoot:注解詳解

RequestMapping 注解在類上:表示該類中所有響應請求的方法都以此地址為父路徑 value&#xff08;path&#xff09; 指定請求的實際訪問地址&#xff0c;默認RequestMapping(“url”)的值url即為value的值。指定的地址可以是 URI Template 模式。 method 指定請求的method類型…

數據結構(四)——二叉樹和堆(下)

制作不易&#xff0c;三連支持一下唄&#xff01;&#xff01;&#xff01; 文章目錄 前言一、二叉樹鏈式結構的實現總結 前言 這篇博客我們將來了解普通二叉樹的實現和應用&#xff0c;對大家之前分治和遞歸的理解有所挑戰。 一、二叉樹鏈式結構的實現 1.前置說明 在學習二叉…

Java入門——繼承和多態(上)

包 包是組織類的一種方式. 使用包的主要目的是保證類的唯一性. 例如, 你在代碼中寫了一個 Test 類. 然后你的舍友也可能寫一個 Test 類. 如果出現兩個同名的類, 就會沖突, 導致 代碼不能編譯通過. 導入包中的類 Java 中已經提供了很多現成的類供我們使用. 例如 public cla…

服裝店會員管理系統結合小程序商城幫你挖掘出潛在客戶

在現代社會&#xff0c;隨著科技的不斷進步和人們消費習慣的變化&#xff0c;傳統的服裝店已經不再能夠滿足消費者的需求。為了更好地服務客戶&#xff0c;提升銷售業績&#xff0c;許多服裝店開始引入會員管理系統&#xff0c;并結合小程序商城&#xff0c;實現線上線下的無縫…

LeetCode-2079. 給植物澆水【數組 模擬】

LeetCode-2079. 給植物澆水【數組 模擬】 題目描述&#xff1a;解題思路一&#xff1a;簡單的模擬題&#xff0c;初始化為0&#xff0c;考慮先不澆灌每一個植物解題思路二&#xff1a;初始化為n&#xff0c;考慮每一個植物需要澆灌解題思路三&#xff1a;0 題目描述&#xff1a…

在ubuntu安裝Docker容器

1、進入root用戶模式 sudo -i 回車后&#xff0c;輸入root的密碼即可進入root模式2、在ubuntu上安裝docker &#xff08;1&#xff09;直接使用 apt 安裝&#xff0c;一般這樣也自動啟動好了 apt install docker.io3、驗證安裝成功&#xff0c;以及啟動與校驗 &#xff08;…

C++11:常用語法匯總

目錄 &#x1f341;統一的列表初始化 { }initializer_list &#x1f341;decltype 推導表達式類型&#x1f341;可變參數模板解析可變參數包方法一方法二 &#x1f341;lambda 表達式捕捉列表的使用運用場景舉例lambda表達式 與 函數對象 &#x1f341;統一的列表初始化 { } 在…

STM32F407-驅動SHT41采集溫濕度

STM32F407-驅動SHT41采集溫濕度 SHT41 SHT41通過I2C方式進行驅動 從機地址&#xff1a; 0x44 獲取數據方式 1&#xff09;先發送I2C寫&#xff0c;寫入特定指令 2&#xff09;延時一段時間&#xff0c;等待SHT41處理 3&#xff09;再進行I2C讀&#xff0c;讀數據即可 一些…

Ansible(二)

一、Playbook基礎 1.1 Playbook定義 Playbook其實是Ansible服務的一個配置文件&#xff0c;Ansible使用Playbook的YAML語言配置編寫成操作需求&#xff0c;實現對遠端主機或策略部署&#xff0c;實現對遠端主機的控制與管理。 1.2 Playbook組成 Tasks&#xff1a;任務&…

【Qt 學習筆記】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout

博客主頁&#xff1a;Duck Bro 博客主頁系列專欄&#xff1a;Qt 專欄關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout 文章編號&#x…

skynet - spinlock 簡單的自旋鎖

spinlock.h 代碼位于&#xff1a; https://github.com/cloudwu/skynet/blob/master/skynet-src/spinlock.h 該文件內&#xff0c;根據不同環境提供了 3 種 api 實現&#xff1a; pthread_mutex_t 系列函數gcc 內置原子操作函數std atomic 系列函數 看了下&#xff0c;效率最…