基于FPGA的SPI控制FLASH讀寫

基于FPGA的SPI控制FLASH讀寫

文章目錄

  • 基于FPGA的SPI控制FLASH讀寫
    • 一、SPI簡介
    • 二、FLASH_M25P16簡介
      • 信號描述
      • 功能操作
      • 注意時序
    • 三、設計思路
      • 框圖設計
      • 狀態機設計
    • 四、上板驗證
      • 1、讀ID
      • 2、讀數據
      • 3、扇區擦除+寫數據
    • 五、總結
    • 六、代碼

一、SPI簡介

SPI是Serial Peripheral interface的縮寫,顧名思義就是串行外圍設備接口。是由Motorola(摩托羅拉)公司推出的一種全雙工、同步串行總線接口,只需要四根信號線即可實現多個芯片之間的主從連接結構,節約引腳,同時有利于PCB的布局。它主要應用在如:Flash存儲器、EEPROM存儲器、ADC、DAC、RTC等,實現主控器與芯片之間的串行數據傳輸。

在這里插入圖片描述
SPI通信需要四根信號線,分別為sck、mosi、miso和cs n。其中cs n、sclk、mosi 是由主機輸出給從機,而miso由從機輸出給主機。
SCLK(Serial Clock):串行時鐘線(Master>Slave),控制數據交換的時機和速率;
MOSI(Master Out Slave In):主機輸出,從機輸入(Master>Slave),用于SPI設備發送數據;
MISO(Master In Slave Out):主機輸入,從機輸出(Slave>Master ),用于SPI設備接收數據:
CS_N(Chip Select):片選信號(Master->Slave),以控制與哪個從機通信。
在這里插入圖片描述在這里插入圖片描述

SPI通訊設備之間的常見連接方式:一主機一從機、一主機多從機。其中一主機多從機連接方式又分常規多片選模式和菊花鏈(星鏈)模式。

SPI數據傳輸需要注意以下幾點:

1.SPI總線在一次數據傳輸過程中,只能有一個主機和一個從機通信,并且主機和從機可以同時向對方進行數據傳輸;
2.當SPI總線上有多個SPI接口的設備時,應注意區分各設備的主從地位,在某時刻只能有一個設備作為主機;
3.從機只能在主機發起通信時,才能接收或向主機傳輸數據;
4.SPI每次數據傳輸可以為8位或16位為單位,每次傳輸的單位數不受限制,且大多以MSB的方式進行傳輸。

在這里插入圖片描述

SPI傳輸模式有四種,通過CPOL(時鐘極性)與CPHA(時鐘相位)控制;CPOL為0時代表時鐘空閑狀態為低,1時為高;CPHA為0時代表數據在時鐘周期的第一個改變沿(前沿)采樣,在第二個改變沿(后沿)輸出(改變),為1時代表數據在時鐘周期的第一個改變沿(前沿)輸出,在第二個改變沿(后沿)采樣(改變)。

CPOL\CPHA01
0模式0模式1
1模式2模式3

二、FLASH_M25P16簡介

M25P16是一款16兆位(2M×8)串行閃存,配備先進的寫保護機制,通過高速SPI兼容總線進行訪問。該存儲器支持使用頁編程指令以1至256字節為單位進行編程。其存儲結構由32個扇區組成,每個扇區包含256頁,每頁寬度為256字節。因此整個存儲器可視為由8192頁(即2,097,152字節)構成。存儲器可通過批量擦除指令進行整體擦除,或使用扇區擦除指令逐扇區擦除。

扇區最小地址最大地址
311F0000h1FFFFFh
301E0000h1EFFFFh
291D0000h1DFFFFh
281C0000h1CFFFFh
271B0000h1BFFFFh
261A0000h1AFFFFh
25190000h19FFFFh
24180000h18FFFFh
23170000h17FFFFh
22160000h16FFFFh
21150000h15FFFFh
20140000h14FFFFh
19130000h13FFFFh
18120000h12FFFFh
17110000h11FFFFh
16100000h10FFFFh
150F0000h0FFFFFh
140E0000h0EFFFFh
130D0000h0DFFFFh
120C0000h0CFFFFh
110B0000h0BFFFFh
100A0000h0AFFFFh
9090000h09FFFFh
8080000h08FFFFh
7070000h07FFFFh
6060000h06FFFFh
5050000h05FFFFh
4040000h04FFFFh
3030000h03FFFFh
2020000h02FFFFh
1010000h01FFFFh
0000000h00FFFFh

信號描述

在這里插入圖片描述

串行數據輸出(Q):該輸出信號用于將數據以串行方式從設備中傳輸。數據在串行時鐘?的下降沿被移出。
串行數據輸入(D):該輸入信號用于將數據以串行方式輸入設備。它接收指令、地址及待編程數據。值在串行時鐘?的上升沿被鎖存。
串行時鐘(C):該輸入信號提供串行接口的時序控制。串行數據輸入(D)中的指令、地址或數據會在串行時鐘?的上升沿被鎖存。串行數據輸出(Q)的數據在串行時鐘?的下降沿后發生變化。
芯片選擇(S):當此輸入信號為高電平時,設備被取消選中且串行數據輸出(Q)處于高阻抗狀態。除非正在進行內部編程、擦除或寫入狀態寄存器周期,否則設備將處于待機模式(非深度休眠模式)。將芯片選擇(S)拉低可激活設備,使其進入活動電源模式。上電后,在開始任何指令前需等待芯片選擇(S)的下降沿。
保持(HOLD):保持(HOLD)信號用于暫停與設備的串行通信,但不取消選中狀態。在保持狀態下,串行數據輸出(Q)處于高阻抗狀態,而串行數據輸入(D)和串行時鐘?則不受影響。要啟動保持狀態,必須選中設備并將芯片選擇(S)拉低。
寫保護(W):該輸入信號的主要目的是凍結受程序或擦除指令保護的存儲器區域的大小(由狀態寄存器的BP2、BP1和BP0位的值指定)

其SPI外設運行在以下兩種模式之一:
CPOL=0,CPHA=0
CPOL=1,CPHA=1
對于這兩種模式,輸入數據會在串行時鐘?的上升沿被鎖存,輸出數據則從串行時鐘?的下降沿開始傳輸。當總線主控處于待機模式且不傳輸數據時,兩種模式的區別在于時鐘極性:當CPOL=0且CPHA=0時,C保持為0當CPOL=1且CPHA=1時,C保持為1。

在這里插入圖片描述

功能操作

所有指令、地址和數據均以最高有效位為先進行設備輸入輸出。當芯片選擇信號(S)被置為低電平時,串行數據輸入端口(D)會在串行時鐘信號?的第一個上升沿進行采樣。隨后,每個字節指令代碼必須通過串行數據輸入端口(D)以最高有效位為先進行輸入,每個比特位會在串行時鐘信號?的上升沿被鎖存。每條指令序列均以一個字節指令代碼開頭,根據指令類型不同,可能后接地址字節、數據字節、兩者兼有或完全省略。對于讀取數據字節(READ)、高速讀取數據字節(Fast_Read)、讀取狀態寄存器(RDSR)、讀取標識符(RDID)、深度休眠釋放(DP)以及讀取電子簽名(RES)等指令,其輸入指令序列后會接續數據輸出序列。當數據輸出序列中的任意一位完成傳輸后,芯片選擇信號(S)可被置為高電平。對于頁程序(PP)、扇區擦除(SE)、批量擦除(BE)、寫入狀態寄存器(WRSR)、寫入使能(WREN)、寫入禁用(WRDI)或深度休眠(DP)等指令,芯片選擇信號(S)必須在字節邊界處精確置高,否則該指令將被拒絕且無法執行。即當芯片選擇(S)被驅動為低電平之后的時鐘脈沖數是8的整數倍時,芯片選擇(S)必須保持高電平。所有在寫入狀態寄存器周期、編程周期或擦除周期內對存儲陣列的訪問嘗試都將被忽略,且內部的寫入狀態寄存器周期、編程周期或擦除周期將繼續正常運行。

功能命令(二進制)命令(16進制)
寫使能(WREN)0000_011006h
讀ID(RDID)1001_11119Fh
讀狀態(RDSR)0000_010105h
字節讀(READ)0000_001103h
快速讀(FAST_READ)0000_10110Bh
頁讀(PP)0000_001002h
扇區擦除(SE)1101_1000D8h
全擦除(BE)1011_1001B9h

寫使能
寫入使能(WREN)指令用于設置寫入使能鎖存器(WEL)位。在執行每頁程序(PP)、扇區擦除(SE)、批量擦除(BE)和寫入狀態寄存器(WRSR)指令前,必須先設置該位。輸入寫入使能(WREN)指令時,需先將芯片選擇(S)置低電平,發送指令代碼,隨后再將芯片選擇(S)置高電平。

在這里插入圖片描述
讀ID
讀取標識符(RDID)指令用于讀取8位制造商標識符,隨后是兩個字節的設備標識符。制造商標識符由JEDEC分配,本次設備為BAh。設備標識符由設備制造商指定,其中第一個字節(60h)表示存儲器類型,第二個字節(15h)表示設備的存儲容量。
在擦除或編程周期進行期間,任何讀取標識符(RDID)指令都不會被解碼,且對正在進行的周期沒有任何影響。
首先通過將芯片選擇(S)置低電平來選定設備。隨后,輸入指令的8位代碼被移入。接著,存儲在內存中的24位設備標識符通過串行數據輸出端口(Q)逐位移出,每個比特位均在串行時鐘信號?的下降沿期間完成移出操作。
操作順序如圖所示。
Read Identification(RDID)指令通過在數據輸出期間的任何時刻將芯片選擇(S)置高來終止。
當Chip Select (S)被驅動為高電平時,設備進入待機電源模式。一旦進入待機電源模式,設備就等待被選中,以便接收、解碼和執行指令。

在這里插入圖片描述
讀狀態寄存器
讀取狀態寄存器(RDSR)指令用于讀取狀態寄存器。即使在程序、擦除或寫入狀態寄存器周期進行期間,也可以隨時讀取狀態寄存器。當處于這些周期中的任一周期時,建議在向設備發送新指令前檢查寫入進行中(WIP)位。如表所示,也可以持續讀取狀態寄存器。

狀態寄存器格式SRWD00BP2BP1BP0WELWIP

WIP位:寫入進行中(WIP)位用于指示存儲器是否處于寫入狀態寄存器、編程或擦除周期的忙狀態。
WEL位:寫入使能鎖存器(WEL)位用于指示內部寫入使能鎖存器的狀態。
BP2、BP1、BP0位:塊保護(BP2、BP1、BP0)位是非易失性存儲單元,用于定義軟件保護編程和擦除指令的區域范圍。
SRWD位:狀態寄存器寫入禁用(SRWD)位與寫保護(W)信號協同工作。通過SRWD位和寫保護(W)信號,設備可切換至硬件保護模式。在此模式下,狀態寄存器的非易失性位(SRWD、BP2、BP1、BP0)將變為只讀位。

在這里插入圖片描述
字節讀
該設備的選通首先通過驅動芯片選擇(S)低電平實現。讀取數據字節(READ)指令的控制碼后接3字節地址(A23-A0),每個地址位在串行時鐘?上升沿被鎖存。隨后,存儲器內存內容在該地址處通過串行數據輸出端口(Q)進行移位輸出,每個地址位在串行時鐘?下降沿以最大頻率fR完成移位操作。
操作順序如圖所示。
所尋址的第一個字節可以位于任何位置。
在每個數據字節被移出后,地址將自動遞增到下一個更高地址。因此,整個內存都可以通過一條讀取數據字節(READ)指令來讀取。
當達到最高地址時,addresscounter將翻轉為000000h,從而允許無限期地繼續讀取序列。
讀取數據字節(READ)指令通過將芯片選擇(S)置高電平來終止。芯片選擇(S)可在數據輸出過程中的任何時刻被置高電平。任何讀取數據字節(READ)指令在擦除、編程或寫入周期進行期間,將被拒絕且不會對正在進行的周期產生任何影響。

在這里插入圖片描述
快速讀

該設備的選通首先通過驅動芯片選擇(S)低電平實現。執行“高速讀取數據字節(FAST_READ)”指令時,其代碼序列包含3字節地址(A23-A0)和一個虛擬字節,這些數據位會在串行時鐘?上升沿被鎖存。隨后,存儲器中對應地址的數據會以最大頻率fC,在串行時鐘?下降沿期間逐位輸出到串行數據輸出端口(Q)。
操作順序如圖所示。
所尋址的第一個字節可以位于任何位置。
地址在每次數據字節被移位輸出后,會自動遞增到下一個更高地址。因此,整個內存只需一條“高速讀取數據字節指令(FAST_READ)”即可完成全部讀取。當達到最高地址時,地址計數器將回滾至000000h,從而實現無限次的連續讀取操作。
高速讀取數據字節指令(FAST_READ)通過將芯片選擇信號(S)置高電平來終止。芯片選擇信號(S)可在數據輸出過程中的任意時刻被置高電平。任何正在進行擦除、編程或寫入周期的高速讀取數據字節指令(FAST_READ),都將被拒絕,且不會對當前進行的周期產生任何影響。

在這里插入圖片描述
頁寫
頁面編程(PP)指令允許在內存中對字節進行編程(將位從1變為0)。在接收該指令之前,必須先執行寫使能(WREN)指令。解碼完寫使能(WREN)指令后,設備會設置寫使能鎖存器(WEL)。
頁面程序(PP)指令的輸入方式是:首先將芯片選擇信號(S)置低電平,隨后在串行數據輸入端口(D)發送指令代碼、三個地址字節及至少一個數據字節。若地址的最低8位(A7-A0)不全為零,則所有超出當前頁面范圍的數據傳輸,都將從該頁面的起始地址開始編程(即地址的最低8位A7-A0均為零時的起始地址)。
在整個序列持續時間內,必須將芯片選擇(S)驅動為低電平。
操作順序如圖所示。
當向設備發送的數據超過256字節時,系統會丟棄先前鎖存的數據,并確保最后256個數據字節在同一頁面內被正確編程。若發送的數據少于256字節,則會在指定地址正確編程,且不會影響同一頁面的其他數據字節。芯片選擇(S)信號必須在最后一個數據字節的第七位完成鎖存后保持高電平,否則頁面編程(PP)指令將無法執行。
當Chip Select (S)被驅動為高電平時,就會啟動自定時的頁面程序周期(持續時間tPP)。在頁面程序周期進行期間,可以讀取狀態寄存器以檢查Write In Progress(WIP)位的值。
在自定時的頁面程序周期中,Write In Progress(WIP)位為1,當該周期結束時為0。在周期結束前的某個未指定時間,Write Enable Latch(WEL)位被復位。

在這里插入圖片描述
扇區擦除

扇區擦除(SE)指令將選定扇區內的所有位設置為1(FFh)。在該操作被接受之前,必須先執行寫使能(WREN)指令。當寫使能(WREN)指令被解碼后,設備會設置寫使能鎖存器(WEL)。
扇區擦除(SE)指令的輸入方式為:先將芯片選擇信號(S)置低電平,隨后輸入指令代碼,并通過串行數據輸入端口(D)發送三個地址字節。扇區內的任意地址(參見表3)均可作為扇區擦除(SE)指令的有效地址。整個操作過程中,芯片選擇信號(S)必須始終保持低電平狀態。該指令序列的具體實現如圖所示。
當最后一個地址字節的第八位被鎖存后,芯片選擇信號(S)必須驅動高電平,否則扇區擦除指令(SE)將無法執行。芯片選擇信號(S)一旦被驅動高電平,自定時扇區擦除周期(持續時間tSE)即刻啟動。在扇區擦除周期進行期間,可讀取狀態寄存器以檢查寫入進行中(WIP)位的數值。該位在自定時扇區擦除周期內保持1,在周期結束后轉為0。在周期完成前的某個未指定時刻,寫入使能鎖存器(WEL)位會被復位。

在這里插入圖片描述
全擦除
全擦除(BE)指令會將所有位設置為1(FFh)。在該指令被接受之前,必須先執行寫使能(WREN)指令。在解碼完寫使能(WREN)指令后,設備會設置寫使能鎖存器(WEL)。
通過驅動芯片選擇(S)低電平,隨后在串行數據輸入(D)上輸入指令代碼,即可輸入批量擦除(BE)指令。在整個序列期間,必須將芯片選擇(S)保持為低電平。該指令序列如圖所示。
當指令代碼的第八位被鎖存后,芯片選擇信號(S)必須驅動為高電平,否則批量擦除指令將無法執行。一旦芯片選擇信號(S)被驅動為高電平,自定時批量擦除周期(持續時間是istBE)就會啟動。在批量擦除周期進行期間,可以通過讀取狀態寄存器來檢查寫入進行中(WIP)位的值。
在自定時的批量擦除周期期間,寫入進行中(WIP)位為1,當該周期完成時為0。在周期完成之前的某個未指定時間,寫入使能鎖存器(WEL)位被復位。
只有當所有塊保護(BP2、BP1、BP0)位為0時,才會執行批量擦除(BE)指令。如果一個或多個扇區受到保護,則會忽略批量擦除(BE)指令。

在這里插入圖片描述

注意時序

操作最小時間最大時間單位
命令間的間隔100ns
頁寫1.45ms
扇區擦除13s
全擦除1740s

三、設計思路

框圖設計

在這里插入圖片描述
功能實現:

1.讀ID操作,按下按鍵key1,將讀出的ID顯示在數碼管,格式xx.xx.xx;同時,通過UARRT發送至上位機顯示,顯示格式為 設備ID:xx xx xx;
2.讀數據操作,按下按鍵key2,讀出3個字節數據,將讀出的輸出顯示在數碼管xx.xx.xx;同時,通過UARRT發送至上位機顯示,顯示格式為 讀數據:xx xx xx;
3.擦除操作,按下按鍵key3,進行扇區擦除;
4.寫數據操作,PC端通過串口連續發送多字節數據,每三個數據進行一次頁編程操作。

狀態機設計

扇出狀態機:
由于在spi_ctrl中有許多子模塊在傳輸數據,這里要多扇出的數據進行操作,這里用一個簡單的狀態機實現
在這里插入圖片描述

寫數據狀態機:
由于寫數據涉及到多種命令、地址的發送,還有扇區擦除,寫數據,讀狀態數據等操作,所以設計一個狀態機實現一系列的功能。

在這里插入圖片描述

四、上板驗證

1、讀ID

在這里插入圖片描述
按下key2

在這里插入圖片描述
數碼管顯示出本設備的flash的id為BA_60_15.

在這里插入圖片描述
同時通過串口發送id至PC顯示出來

2、讀數據

按下key3

請添加圖片描述
數碼管顯示出第一組數據,此數據為先前寫入的數據12_34_56

在這里插入圖片描述
同時PC也顯示出數據;

連續按下,多次讀出數據

在這里插入圖片描述
讀出78_90_11,后續為寫入數據顯示為ff。

3、扇區擦除+寫數據

按下復位key1+扇區擦除key4,擦除完成再讀數據

在這里插入圖片描述
讀出數據全為ff,擦除成功;復位并通過串口發送A1 B2 C3 D4 E5 F6 99

在這里插入圖片描述
連續按下讀數據key3

在這里插入圖片描述
A1 B2 C3 D4 E5 F6被發送至flash寫入,而99暫存在fifo中未寫入,在此的fifo設置的為每三個數據發送給flash進行存儲。

驗證成功。

五、總結

本次的SPI控制flash讀寫項目完成了基本功能,在理解SPI協議后會比較容易,相較于IIC和UART,SPI沒有過多的協議層上數據的約束,理解起來也比較簡單。

六、代碼

模塊較多,代碼見此:代碼

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

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

相關文章

Pytest 參數化進階:掌握 parametrize 的多種用法

概述 在自動化測試中,@pytest.mark.parametrize 不僅僅能用來為測試函數提供多組輸入數據,還能配合其他功能實現更復雜的測試邏輯。本文將帶你深入了解 @pytest.mark.parametrize 的多種常見用法,助你在不同場景下寫出更高效、更清晰的測試代碼 基礎用法回顧:單個參數化 …

K8S 九 安全認證 TLS

目錄第九章 安全認證訪問控制概述認證管理授權管理 RBACRBACRolerules中的參數RoleBinding9.4 準入控制其他K8S的TLS是什么(DeepSeek)1. 加密通信2. 身份認證(Authentication)3. 數據完整性K8s 中 TLS 的具體應用**1. API Server …

積分兌換小程序Java

某個學校為了激勵學生踴躍參加一些社會實踐活動,會對參與者給予一些校園積分,學生們獲得校園積分后可以使用校園積分在指定的老師那兌換一些學習用具,當前可兌換的物品和對應的積分數量如下:鉛筆1分橡皮2分作業本3分文具盒5分為了…

函數指針示例

使用函數指針來調用 printf。下面是對代碼的詳細解釋&#xff1a;&#x1f4c4; 源代碼解析#include <stdio.h>int main() {int (*myshow)(const char *, ...); // 聲明一個函數指針&#xff0c;指向可變參數函數printf("hello world!\n");myshow printf; /…

不坑盒子突然不見了怎么辦?

如果你安裝后之前一切正常&#xff0c;突然某天在Office的功能區看不到不坑盒子了&#xff0c;這種是插件被禁用了&#xff0c;重裝安裝插件、Office都是不能解決的&#xff0c;必須按下面的方法解決。WPS中1.隨便打開一個文檔&#xff0c;點擊文件-選項-信任中心&#xff0c;最…

Java面試全棧通關:從微服務到AI的技術深度解析

Java面試全棧通關&#xff1a;從微服務到AI的技術深度解析 面試現場&#xff1a;大廠技術終面室 面試官&#xff1a;謝飛機同學&#xff0c;今天我們將從基礎到架構&#xff0c;全面考察你的Java技術棧掌握程度。請真實展示你的技術水平。 謝飛機&#xff1a;&#xff08;挺胸抬…

《Java 程序設計》第 7 章 - 繼承與多態

引言在 Java 面向對象編程中&#xff0c;繼承與多態是兩大核心特性&#xff0c;它們共同支撐了代碼的復用性、擴展性和靈活性。本章將從繼承的基本實現開始&#xff0c;逐步深入到方法覆蓋、訪問控制、抽象類等概念&#xff0c;最終揭示多態的本質與應用。通過大量可運行的代碼…

ksql連接數據庫免輸入密碼交互

ksql連接數據庫免輸入密碼交互1. 使用 .pgpass 文件&#xff08;推薦&#xff09;2. 使用環境變量3. 使用連接字符串4. 修改 ksql 的別名&#xff08;簡化命令&#xff09;5. 注意事項6. 密碼含特殊字符轉義在 Kingbase 中使用 ksql 連接數據庫時&#xff0c;如果希望避免每次手…

UniApp H5 適配 PC 端新姿勢:打造跨設備一致體驗

在移動互聯網蓬勃發展的今天&#xff0c;很多開發者會選擇使用 UniApp 來開發多端應用&#xff0c;尤其是 H5 端&#xff0c;因其無需下載安裝即可訪問的特性&#xff0c;深受用戶喜愛。但 UniApp H5 應用在 PC 端直接打開時&#xff0c;往往會因為屏幕尺寸的巨大差異&#xff…

【MySQL#4】函數 復合查詢 內外連接

&#x1f4c3;個人主頁&#xff1a;island1314 ?? 歡迎關注&#xff1a;&#x1f44d;點贊 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活總是不會一帆風順&#xff0c;前進的道路也不會永遠一馬平川&#xff0c;如何面…

C++常見面試題之一

一、語言基礎與內存管理const與constexpr的區別&#xff1f;應用場景&#xff1f; const&#xff1a;運行時常量&#xff0c;修飾變量/函數不可修改。constexpr&#xff1a;編譯期常量&#xff08;C11&#xff09;&#xff0c;用于優化計算&#xff08;如數組大小&#xff09;。…

Golang 語言中的指針介紹

介紹&#xff1a;指針式一種數據類型&#xff0c;用來存儲值的內存地址&#xff0c;為了便于理解&#xff0c;我們也可以把指針未內存地址&#xff0c;指針類型只占用內存4個或 8 個字節&#xff0c;在Golang 語言中&#xff0c;類型名稱加 * 表示改類型的指針類型。指針類型變…

Flink 狀態管理設計詳解:StateBackend、State、RocksDB和Namespace

為什么需要 StateBackend&#xff1f;—— 職責分離原則我們可以用一個銀行的例子來類比&#xff1a;State (如 ValueState, ListState) 就像是你的銀行卡。AbstractKeyedStateBackend 就像是銀行的整個后臺系統&#xff08;包括總服務器、數據庫、風控系統、會計系統等&#x…

櫥柜鉸鏈的革命:炬森精密如何以創新科技重塑家居體驗

在現代化家居設計中&#xff0c;櫥柜不僅是存儲空間的核心&#xff0c;更是生活品質的象征。而作為櫥柜的“關節”&#xff0c;櫥柜鉸鏈的性能直接影響著日常使用的便捷性、安全性和耐久性。然而&#xff0c;許多消費者在櫥柜使用中常遭遇噪音干擾、頻繁松動或早期損壞等痛點&a…

醫療系統國產化實錄:SQL Server國產替代,乙方保命指南

醫療行業的SQL Server替代&#xff0c;和普通業務系統完全不是一個量級——醫囑邏輯嵌套幾十層存儲過程、收費結算小數點錯位能引發醫患糾紛、電子病歷查詢慢一秒醫生直接拍桌子。作為被按在手術臺上的乙方PM&#xff0c;實測四款主流國產庫后&#xff0c;掏心窩子說句實話&…

WAIC 2025 盛大啟幕,深思考邀您解鎖端側 AI 新可能?!

2025 世界人工智能大會今日正式啟幕&#xff0c;深思考人工智能&#xff08;iDeepWise&#xff09;攜端側多模態大模型技術成果登陸展會&#xff0c;與行業伙伴共探端側 AI 發展新機遇。作為專注于類端側多模態大模型領域的創新力量&#xff0c;深思考此次重點展示了 iDeepWise…

MySQL相關概念和易錯知識點(2)(表結構的操作、數據類型、約束)

目錄1.表結構的操作&#xff08;1&#xff09;增加表&#xff08;2&#xff09;查看庫中所有的表&#xff08;3&#xff09;查看表每個列的約束&#xff08;4&#xff09;刪除整張表&#xff08;5&#xff09;刪除某個具體的列&#xff08;6&#xff09;增加某個具體的列&#…

1. Qt多線程開發

目錄方法1.繼承QThread使用案例總結方法2.將qobject對象moveToThread&#xff08;官方推薦&#xff09;使用案例總結方法3.QRunnable QThreadPool使用案例總結方法4.快速線程QtConcurrentQFutureWatcher使用案例總結代碼下載方法1.繼承QThread 需要實現QThread的抽象函數run …

ARM入門學習方法分享

首先認識什么是ARM?ARM公司簡介ARM是Advanced RISC Machines的縮寫&#xff0c;它是一家微處理器行業的知名企業&#xff0c;該企業設計了大量高性能、廉價、耗能低的RISC &#xff08;精簡指令集&#xff09;處理器。 1985年第一個ARM原型在英國劍橋誕生。公司的特點是只設計…

基于springboot的在線數碼商城/在線電子產品商品銷售系統的設計與實現

用戶&#xff1a;數碼產品&#xff0c;限時秒殺&#xff0c;種草分享&#xff0c;新品資訊&#xff0c;留言板&#xff0c;訂單管理&#xff0c;在線客服&#xff0c;購物車&#xff0c;個人中心管理員&#xff1a;個人中心&#xff0c;用戶管理&#xff0c;數碼分類管理&#…