黃書俊
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    # Firmware 知識合集 皆以 STM32 系列實作,目前用到 F103、F407、F412 # 簡介與認知 ### CPU、MCU、SoC **CPU:** * Central Processing Unit:簡單翻譯就是==中央處理器== * 通常用於執行==計算的任務== * 常見品牌:Intel、AMD;軟體平台:Windows、Linux **MCU:** * Micro-Controller Unit:微控制器,也稱單晶片 (Single Chip),最簡單也最容易上手之平台 * 最簡單也易於學習,常見之平台為 Arduino 與 STM32 * 開發平台則是:Keil 或自家 IDE ...等 * MCU 裡也有 CPU,但是是閹割版的 CPU,最重要的差異則是在 MCU 的 CPU 中少了 MMU,MMU 為 Memory Management Unit **SoC:** * System on Chip:晶片上的系統 * 簡單說就是:將 CPU 與所有 I/O 集成到 Chip 上,即集成度更高的 CPU,多用在多媒體處理與計算 * 手機本身也算是 SoC </br> 微控制器 (MCU)、系統晶片 (SoC) 或微處理器單元 (MPU) 的選擇已成為物聯網裝置設計人員的關鍵決策。選擇正確的 ==「大腦」== 可以決定物聯網解決方案的效能、能源效率和成本效益。 用白話文將上述內容解釋一下:在做開發時我們需要先選擇正確的大腦,也就是處理器,同時也必須滿足開發時的 I/O 周邊需求,又或著需要考慮到 on chip memory、RAM/ROM 等等的記憶體管理與規劃;首先,所有的處理器都有 CPU 差別在於效能,也就是處理速度,這時我們可以從 [Cortex](https://zh.wikipedia.org/zh-tw/ARM_Cortex-M) 的型號下手;再來就是挑選應用的工作環境、計算複雜度與 I/O 介面 --- ### Bus 匯流排,在晶片內部或外部傳輸訊號資料的線,通常用於傳輸:Data、Address、Command ...等等,每個 Bus 的功用都不同。 可以把 Bus 想像成神經一樣,各種設備都是透過 Bus 與 CPU 溝通,而這些匯流排可以分成外部與內部。 * 內部:主要負責與 CPU 溝通 * 外部:負責與外部設備溝通 (周邊) * 有時外部與內部的匯流排會直接與內部相接,以便周邊設備直接進行溝通 </br> #### AMBA 在知道 Bus 的概念後,開始了解晶片內部的匯流排,AMBA 全稱為:==Advanced Microcontroller Bus Architecture==,簡單翻譯就是==高級微控制器匯流排架構==,這是由 ARM 公司所制定的匯流排協定,且有三種匯流排所組成,分別為:AHB、APB、AXI。 </br> **AHB** * Advanced High-performance Bus,為高性能匯流排,用於連接高性能之主設備 * 簡述:它是一種基於 Mater-Slave 的匯流排架構,廣泛應用於 SoC、MCU 當中,並且支援多個記憶體和周邊連接。AHB 一般應用於高效能、高時脈頻率 (high clock) 的系統結構,例如 CPU 與高速 RAM、NAND FLASH、DMA 等 * 特點: 1. 支援多總線連接。 AHB 匯流排協定可連接多個晶片上的匯流排或週邊(透過AHB橋),實現高效率的資料傳輸 2. 支援多種資料傳輸方式。 AHB 匯流排可以支援不同的傳輸類型,如單次傳輸、熱點傳輸或累積傳輸等,滿足不同的資料傳輸需求 3. 支援多主從式的連結。 AHB 匯流排可以同時連接多個主設備和從設備,實現了多任務的同時完成,提高了總線的效率 </br> **APB** * Advanced Peripheral Bus,為高性能周邊匯流排,用於連接低速設備,一種簡單的序列匯流排,具有定時器可程式特性,其速度較慢,但其節點可達數目較多。 * 簡述:一種用於連接微處理器和周邊的序列匯流排協定,它與 AHB 一樣都是基於主從協定,APB 一般應用於低速外設之間的連接,在 STM32 中它的時脈訊號一般由 AHB 經分頻器而來。 * 特點: 1. 速度較慢,一般在 10MHz 2. 面向暫存器的存取方式,APB 匯流排採用面向暫存器的方式進行週邊訪問,即每個週邊裝置都被對應到一組暫存器中,透過讀寫這些暫存器來實現對外部設備的控制 3. 點對點連接的匯流排,即每個週邊裝置都與處理器直接相連,這種連接方式簡化了匯流排結構,提高了匯流排效率 4. 採用低功耗設計,能夠透過動態電源管理技術進一步降低功耗 </br> **AXI** * Advanced eXtensible Interface,為高性能可擴展式介面,用於連接系統中高速元件之間的互連。AXI 是多主和多從設備的連接,AXI 匯流排支援優先權傳輸、頻寬請求、管線傳輸和亂序傳輸等功能,是 AMBA 規格中最高等級的匯流排介面協定。 * 簡述:高效能、高頻寬、可擴展的匯流排協定,由 ARM 公司開發並推廣應用於各種系統 on-chip (SoC) 設計中,它一般應用於 ARM 高階晶片系列。==AXI 匯流排協定定義了一種通訊方式,用於將不同的核心和處理器連接在一起,以實現資料的高效傳輸和管理==。採用管線操作方式,透過分離位址訊號和資料訊號,使得不同的 IP Core 或 Sub System 可以同時使用匯流排,實現高效率的資料傳輸。流水線相比串行操作有極大的性能提升,將 task 拆分成不同部分並允許同步執行,每個 task 之間的執行時間允許相互重疊。 * 特點 1. 高效能:AXI 匯流排協定支援高頻寬、低延遲的資料傳輸,在多個 IP Core 間實現高速並發傳輸。 2. 可擴充性:AXI 匯流排協定支援多種擴充方式,可以方便地新增新的 IP Core,擴展SoC 的功能。 3. 靈活性:AXI 匯流排協定支援多種傳輸模式和回應方式,可以根據不同的應用場景選擇最優的傳輸方式。 4. 安全性:AXI 匯流排協定支援安全存取和保護,能夠保護系統內部的敏感資料。 </br> </br> --- # USART / UART UART 為通用非同步收發傳輸器 (Universal Asynchronous Receiver / Transmitter) 之簡稱,主要用於在串列通訊中轉換平行資料和串列資料。資料位元逐一傳輸,每個資料位元之間都有停止位元、校驗位等控制訊號。 UART 只能同時進行一項操作:傳送字元或接收字元。而 USART (Universal Synchronous Asynchronous Receiver / Transmitter, 通用異步接收發送器) 則可以在同一時間完成發送和接收操作,因此它更加靈活。此外,USART 也支援同步傳輸模式。 </br> ## 概念 串列傳輸為 CPU 與周邊裝置或 CPU 與 CPU 間的資料傳輸方法之一,而 USART(universal synchronous asynchronous receiver transmitter) 通用同步 / 非同步收發傳輸器,則常被用於一般的串列傳輸應用中。可依照 NRZ 工業非同步資料傳輸格式,與其他設備進行資料交換。並且此種裝置使用 fractional baud rate 產生器,提供大範圍的 baud rate 供使用者選擇。 此外,亦支援同步傳輸、單線半雙工傳輸、LIN(local connection network)、Smartcard protocol、IrDA(Infrared data association) SIR ENDEC 標準。 高速資料傳輸,則使用 DMA 去設定多重緩衝區來達到此目的。 </br> ### 同步與非同步 / 半雙工與全雙工 * 同步傳輸 (Synchronous):兩個設備在溝通的時候允許同步接收資料與傳輸資料。 * 非同步傳輸 (Asynchronous):與同步傳輸相反,只允許單向的傳輸,並在傳送資料時插入額外資訊,表示資料起始、結束。好處是設定時間短、硬體成本低、機器時脈不同也能傳資料,缺點是單次傳輸的資料量較少。 * 半雙工 (Half-duplex):允許二台設備之間的雙向資料傳輸,但不能同時進行。因此同一時間只允許一設備傳送資料,若另一設備要傳送資料,需等原來傳送資料的設備傳送完成後再處理。例:無線電 (需要講 Over 那種)。 * 全雙工 (Full-dulpex):允許二台設備間同時進行雙向資料傳輸。例:手機。 ``` 在半/全雙工之中也參有同步與非同步傳輸,須注意不是只有單獨存在的狀況 ! ! ``` </br> ### 資料傳輸 每次在進行資料傳輸時,USART 會以一個 frame 作為一次傳輸單元 ![image](https://hackmd.io/_uploads/HkxwbpUdA.png) * 在起始位 (start bit) 期間,資料發送端 (Tx) 處於低電位;在停止位 (stop bit) 期間,資料發送端 (Tx) 處於高電位。 ![image](https://hackmd.io/_uploads/SkynZTUOC.png) * 此圖為最經典的 USART 設定圖。 * 圖中表示一次接收資料長度為 8-bit 、一個停止位元、一位元的基偶較驗 </br> --- 在介紹完單純的 USART 傳輸方式之後,要進入 MCU 非常重要的階段 "中斷" # 中斷 Interrupt 在 Computer Science 中,它代表處理器接收到來自硬體或軟體的訊號,發生了某個事件。接收到來自外部硬體的非同步信號之後,處理器將會進行相應的處理 </br> ### 中斷延遲 Interrupt latency 中斷延遲是指,中斷請求(Interrupt Request, IRQ)與相對應的中斷服務程序(Interrupt Service Routine, ISR)之間的延遲。 簡單來說就是 => 從接收到外部的中斷請求到中斷開始執行中斷程序之間的時間。 </br> ## 中斷概念 在任何的處理器上都會有 Timer 的設計,那內部 Timer 是如何做到計數功能的,以一些簡單的單晶片(MCU)為例,在硬體設計上都會有一個震盪器去做到相關的計數。 再將中斷以更簡單的方式描述的話,當今天有個來自外部的請求要MCU進入中斷,那MCU就會讓這項請求優先執行,在執行結束之後才會跳出到原本的處理程序。 </br> ``` 在中斷的處理程序大致可以先分為兩種: 1.定時(Timer) -> 利用Timer做出分工的多時序系統設計 2.外部觸發(INT) -> 針對一些外部硬體中斷做出一些程式對策執行指令 從中斷的處理程序中我們可以得知在中斷的設計上,當處理得程序越來越多MCU就甚麼都運作不了了!! 所以中斷的函式要越簡短越好,盡早結束!!! ``` </br> 在一般所學習到的程式語言中,通常都會有一個叫做 main 的程序,就由以下的程式碼為例來介紹 </br> ```css= main() { 狀態1 狀態2 狀態3 . . . 狀態n } ``` 依照原本的邏輯來說,程序會按照順續從狀態1一直執行到狀態n,但如果加上中斷的話 ```css= main() { 狀態1 狀態2 狀態3 . . . 狀態n } void IRQ() { 狀態6 } ``` </br> 那在我接收到中斷的請求之後,整段main的處理程序會暫停並且跑去執行中斷的狀態6,在執行完成中斷中的狀態6之後,就會回到main暫停的地方繼續往下執行,這樣的機制就叫做<font color="#f00">中斷</font> ### ARM (Advanced RISC Machine) 一個精簡指令集 (RISC) 處理器架構,使用在許多嵌入式系統設計。 在 MCU 上其 ARM 的架構會是 => ARM Cortex-M 系列 以 Holtek HT32F52352 為例 => Cortex-M0+ ### 巢狀中斷 (Nested Interrupt) 何謂巢狀中斷,當一個中斷請求來未執行結束時,又有一個中斷請求送進來;此時,MCU 會優先執行權限最高的中斷。 </br> --- ## 實作 請記得將 NVIC 功能開啟,此為開啟 UART 中斷觸發功能。 ![image](https://hackmd.io/_uploads/BJb_9scz0.png) </br> ## 利用中斷傳輸功能 : ```cpp HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size) ``` * UART_HandleTypeDef *huart : 填寫使用哪一組USART腳位 * const uint8_t *pData : 傳送 uint8_t 型態之字串 * uint16_t Size : 需傳送之字串之長度 </br> ## 一般傳輸功能 : ```cpp HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout) ``` * UART_HandleTypeDef *huart : 填寫使用哪一組USART腳位 * const uint8_t *pData : 傳送 uint8_t 型態之字串 * uint16_t Size : 需傳送之字串之長度 * uint32_t Timeout : 逾時持續時間,通常放入 HAL_MAX_Delay </br> ## 利用中斷接收訊息功能 : ```cpp HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) ``` * UART_HandleTypeDef *huart : 填寫使用哪一組USART腳位 * uint8_t *pData : 接收 uint8_t 型態之暫存字串 * uint16_t Size : 每次接收之字串長度,一般設為 1 </br> # DMA 功能 * DMA : Direct Memory Access , 直接記憶體存取 / 存取。 * 通過硬體為 RAM 和 I/O 設備開啟一條直接資料傳輸通道,將資料直接從一個位置複製到另一個位置,傳輸的動作本身由 DMA 控制器實現。 * 允許某些電腦內部的硬體子系統(電腦外設),可以獨立地直接讀寫系統記憶體,而不需中央處理器(CPU)介入處理 。 * 作用:為 CPU 減輕負擔。 </br> # RS232 / RS485 ``` ``` # SPI (Serial Peripheral Interface) ``` 為解決UART傳輸速度慢而產生之協定 ``` 由 4 個腳位組成的同步串列通訊介面,它的特色是高速、全雙工進行資料的傳輸,這種架構是由一個 Master (主設備) 和一個或多個 Slave (從設備) 組成。SPI 的典型應用包括:快閃記憶、EEPROM、SRAM、SD 卡與 TFT-LCD 等設備。 ![image](https://hackmd.io/_uploads/SkBKguofC.png) </br> * 4 腳位之 SPI 設備具有四個訊號 : * Clock (SPI Clock , SCLK) * Chip select (CS) * main out, subnode in (MOSI) * main in, subnode out (MISO) * 可分為單工/半雙工/全雙工/同步 : * 單工 : 線路上的訊號只能做單向傳送 * 半雙工 : 線路上的訊號可以雙向傳送,但是不能同時傳送 * 全雙工 : 線路上的訊號可以同時雙向傳送 * 同步 : 傳送端和接收端共用同一個 CLOCK ![image](https://hackmd.io/_uploads/HJ7cy9jMA.png) </br> * 同步與非同步之定義 * 非同步串列傳輸 : 傳送端與接收端只需約定是以 X 速率 (Clock Rate) 來傳輸,接收端的接收時脈 (Receiver Clock,RxC) 產生方式和傳送者的位元傳輸時脈 (Transmitter Clock,TxC) 是互相獨立無關的,此種傳輸方式是允許傳送與接收時脈的頻率不那麼同步 (允許一定程度的誤差) 的情況下進行,故稱為非同步傳輸 * 同步串列傳輸 : 對接收端而言並沒有自己的時脈產生電路,而是依據傳送端送過來的時脈來接收資料 (即傳送端和接收端共用同一個CLOCK),傳送端以一條導線送出資料,同時以另一條導線送出傳送時脈,提供接收端之同步訊號 </br> ![STM32F407ZG-SPI 同步與非同步](https://hackmd.io/_uploads/Hkkvv5oM0.png) </br> ## SPI 通訊時序 SPI 的通訊協定有兩個重要參數 CPOL/CPHA 1. 時脈極性 (Clock Polarity) * CPOL = 0 ,時脈極性為 0 代表 SCK 空閒狀態為 "低電位" * CPOL = 1 ,時脈極性為 1 代表 SCK 空閒狀態為 "高電位" 2. 時脈相位 (Clock Phase) * CPHA = 0 ,時脈相位為 0 代表數據會在 "第一個 SCK 改變準位" 時被採樣 * CPHA = 1 ,時脈相位為 1 代表數據會在 "第二個 SCK 改變準位" 時被採樣 </br> * CPOL = 0 | CPHA = 0 * 數據會在 SCK 上升邊緣被採樣,在 SCK 下降邊緣時改變數據凖位並在半週期內完成資料閂鎖 ![image](https://hackmd.io/_uploads/ryG9VCyQ0.png) </br> </br> * CPOL = 0 | CPHA = 1 * 數據會在 SCK 下降邊緣被採樣,在 SCK 上升邊緣時改變數據凖位並在半週期內完成資料閂鎖 ![image](https://hackmd.io/_uploads/SJNCERymR.png) </br> </br> * CPOL = 1 | CPHA = 0 * 數據會在 SCK 下降邊緣被採樣,在 SCK 上升邊緣時改變數據凖位並在半週期內完成資料閂鎖 ![image](https://hackmd.io/_uploads/SyixHCyXR.png) </br> </br> * CPOL = 1 | CPHA = 1 * 數據會在 SCK 上升邊緣被採樣,在 SCK 下降邊緣時改變數據凖位並在半週期內完成資料閂鎖 ![image](https://hackmd.io/_uploads/BkjMSAymC.png) </br> SPI 的寫法是靠對寄存器下達 Command 順序會像是:起始位元、讀/寫位元、訪問位置、填入/改寫值 </br> | Eanable Bit | R/W | Register Address | | ----------- | ----- | ---------------- | | 0 / 1 | 0 / 1 | 6 | </br> ![STM32F407ZG-SPI - AD4130 communication register](https://hackmd.io/_uploads/Hy6vHrGmR.png) </br> 確定寫好之後,對照 Datasheet 中 Register Address 每個位置的功能 </br> ## AD4130-8 1. 選擇線 (CS) 在低電位觸發 2. SCLK 在上升邊緣採樣,CLK 平時處於上升邊緣 3. 這表示 DIN 上的資料在 SCLK 的上升緣輸入,而 DOUT 上的資料在 SCLK 的下降緣輸出。 4. SPI Protocol mode 為 Mode 3 </br> ### 訪問寄存器 寫入通訊暫存器的資料決定下一步操作是讀取還是寫入操作(R/W 位元),以及存取哪個暫存器(RS,位元 5 ~ 0)。 8 位元 COMMS 暫存器中的最高有效位元 (MSB) 必須設定為 0 才能啟用寫入作業(WEN 位元)。如果 WEN 設定為 1,則裝置不會對暫存器中的後續位元進行時脈處理。 </br> 寫入模式: ![image](https://hackmd.io/_uploads/SJvgYHGXR.png) </br> </br> 讀取模式: ![image](https://hackmd.io/_uploads/HyVQKSz7R.png) </br> </br> ![STM32F407ZG-SPI - AD4130 communication register](https://hackmd.io/_uploads/Hy6vHrGmR.png) </br> ### 裝置復原 AD4130-8 的電路和序列介面可透過向裝置連續寫入 64 個 1 重設 。寫入 64 個連續的 1。此操作可重設 邏輯、數位濾波器和類比調變器,並將所有片上暫存器重設為預設值。如果串行介面因 SCLK 線路上的雜訊而變為非同步,重設將非常有用。當線路上的雜訊而導致串列介面不同步時,重設就非常有用。 </br> ![image](https://hackmd.io/_uploads/BkJXCBGQR.png) </br> ### Data 輸出編碼 < ADC_CONTROL > ADC_CONTROL 寄存器中的雙極位元決定 ADC 資料的資料輸出編碼,以及裝置如何在後處理中應用偏移和增益係數。 預設情況下,雙極性位元設定為 1,相當於偏移二進位編碼。這種配置更適合用來表示從 -VREF/gain 到 VREF/gain 的雙極性輸入電壓。對於單極輸入配置,如果雙極性位元設定為 1,則輸入(AINP - AINM,AINP ≥ AINM)由 0x800000(零刻度)至 0xFFFFFF(滿刻度)之間的輸出代碼表示。 當雙極性位元設定為 0 時,資料輸出編碼變為自然(straight)二進位。這種配置更適合用來表示從 0V 到 VREF/增益的單極性輸入電壓。如果雙極性輸入配置的雙極性位元設定為 0,則 AINP < AINM 的所有情況都會被箝位在 0x000000(零刻度)。 </br> ![image](https://hackmd.io/_uploads/rJQMfwz7A.png) </br> ![image](https://hackmd.io/_uploads/rk_8MPfXA.png) </br> ### 狀態位 < STATUS > 如果啟用多個頻道,每次輸出轉換時,都會附加狀態暫存器的內容,讀取資料暫存器的格式變成讀取資料暫存器的格式,變成 : 資料[23:0],狀態[7:0]。 狀態暫存器(CH_ACTIVE 欄位)的四個最低位元 (LSB) 表示轉換對應於哪個頻道。 若要將狀態暫存器的內容附加到每次轉換中,可將 ADC_CONTROL 暫存器中的 DATA_STATUS 位元設為 1。 </br> ### ADC 設定 可以為每個頻道選擇預先定義的 ADC 設定(CHANNEL_m 暫存器中的 SETUP_m 位元)。 AD4130-8 最多允許 8 個不同的 ADC 設定,每個 ADC 設定包括配置、濾波器、增益和偏移設定。 例如,SETUP_m = 0(ADC 設定 0)由 CONFIG_0 暫存器、FILTER_0 暫存器、OFFSET_0 暫存器和 GAIN_0 暫存器組成。 </br> ![image](https://hackmd.io/_uploads/rk56vDM70.png) </br> ### 寄存器配置 CONFIG_n registers 允許以下操作: * 設定 PGA 增益值 (PGA_n) * 設定 PGA 模式 (PGA_BYP_n) * 選擇參考源 (REF_SEL_n ) * 啟用參考緩衝區 (REF_BUFP_n and REF_BUFM_n) * 啟用並選擇燒毀電路 (BURNOUT_n) (診斷目的的電流源是否燒壞) * 啟用和選擇激勵電流 (I_OUT1_n and I_OUT2_n) ### 濾波寄存器 FILTER_n registers 允許以下操作: * 選擇 ADC 數據輸出端的數位濾波器 (FILTER_MODE_n) * 選擇應用於篩選器的 FS 值 (FS_n, Bits[10:0]) * 選擇在此 ADC 設定中轉換的次數,從 1 ~ 32 次 (REPEAT_n) * 設定前端建立時間,允許感測器輸出在轉換開始前達到穩定值 (SETTLE_n) ### 偏移與增益增益寄存器 偏移和增益設定用於在與 ADC 設定相關的通道上執行校準後調整資料輸出。 如果執行內部或系統偏移或滿量程校準,所選通道的增益和偏移暫存器將自動更新。 ### ADC 轉換模式 </br> ![image](https://hackmd.io/_uploads/SyaBI_zQR.png) </br> ### 連續轉換模式 * 預設操作:此模式是 ADC(類比數位轉換器)的標準設置。這意味著,如果沒有任何額外的配置,ADC 將以這種方式運行。 * 連續轉換:在此模式下,ADC 不會停止將類比信號轉換為數字數據。它繼續執行此任務而不會暫停。 * 通道處理:ADC 可以處理多個通道,這意味著它可以轉換來自不同來源的信號。在連續轉換模式下,它逐一循環通過每個已啟用的(活動)通道。 * 順序和重複:從上次啟用的通道轉換信號後,ADC 不會停止。相反,它會返回第一個(最低)啟用的通道,然後再次啟動轉換過程。此週期無限次重複。 * 多個通道的效率:對於需要持續監控和更新來自多個來源數據的系統,此模式特別有效。它確保所有活動頻道都會定期轉換和更新,而無需手動干預。 ### 單序列模式 此模式允許設備在所有啟用的通道上執行一系列轉換,然後自動切換到待機模式以節省電力。 * 啟用單序列模式:若要啟動此模式,請將模式寄存器設定為 0b0001。這會告知 ADC 每次激活只需通過其啟用的通道一次。 * 轉換期間的行為:在單序列模式下,任何嘗試通過 SPI(序列周邊介面)寫入設備都會被忽略。這可確保轉換過程不間斷。 * 通過同步引腳進行外部控制:可以在模式設定為 0b1010 時啟動替代單序列模式。此模式增加了使用 SYNC 接腳進行外部控制的功能。 -在此變體中,將 SYNC 引腳脈衝低,會暫時退出設備從閒置模式並觸發新的轉換序列。 -處於閒置模式時,ADC 的關鍵元件,特別是調製器和數位濾波器,會重置並保持非作用中,以節省電源,直到啟動新序列為止。 ### 狀態寄存器 Address : 0x00 Reset : 0x10 Name : STATUS 說明 : ADC和介面狀態資訊寄存器。 </br> ![image](https://hackmd.io/_uploads/SyXB0_z7R.png) </br> ## Flash Memory ## SD卡 實作 SD 卡 (Secure Digital Memory Card),一般有兩種接口 SPI 接口與 SDIO 接口 SDIO (Secure Digital Input Output) 全稱為安全數位輸入輸出 ![image](https://hackmd.io/_uploads/S1uHalAzA.png) </br> SD 卡使用 9-pin 接口,3 根電源線、1 根時脈線、1 根命令線、4 根數據線 : * CLK : 同步時脈線,由 SD 卡產生;使用 SPI 模式時該腳位與 SPI 的 SCK 相連。 * CMD : 命令控制線,透過此線發送指令控制 SD 卡,如果指令要求 SD 卡提供應答(回應),SD 卡也是透過此線傳輸應答資訊;使用 SPI 模式時,此接腳與 SPI 匯流排的 MOSI 訊號相連,SPI 主機透過它向 SD 卡發送命令及數據,但因為 SPI 匯流排的 MOSI 僅用於主機向從機輸出訊號,所以 SD 卡回傳應答訊息時不使用該訊號線。 * DATA 0~3 : 它們都是數據線,傳輸讀寫數據,SD 卡可將 DATA 0 拉低表示忙狀態;在 SPI 模式下,DATA 0 與 SPI 匯流排的 MISO 訊號相連,SD 卡透過該訊號線向主機發送資料或回應,DATA 3 與匯流排的 CS 訊號相連,SPI 主機透過此訊號線選擇要通訊的 SD 卡。 * VDD / VSS1/ VSS2 : 電源和接地線。 </br> ![STM32F407ZG-SPI - SD card 接線](https://hackmd.io/_uploads/rJZ3gZRGR.png) </br> * SD 卡暫存器 一共有八個暫存器,用於設定或表示 SD 卡訊息,這些暫存器只能透過 command 訪問 | 名稱 | bit 寬度 | 描述 | | --- | --- | --- | | CID | 128 | card identification number | | RCA | 16 | 相對地址 relative card address : 卡的本地系統位置 | | DSR | 16 | driver stage register : 卡片的輸出驅動 | | CSD | 128 | card specific data : 操作條件訊息 | | SCR | 64 | SD configuration data : SD 卡特殊訊息 | | OCR | 64 | operation conditions register | | SSR | 512 | SD status : 卡專有的特徵訊息 | | CSR | 32 | card status : 卡狀態訊息 | ### 控制說明 ### 時序圖 通訊由一個起始位元 (“0”),由一個停止位元 (“1”) 終止。 SD 通訊一般是主機 (MCU) 發送一個指令 (Command),從裝置在接收到指令後作出回應 (Response),如有需要會有資料 (Data) 傳送參與。 * Command and Respond * 如附圖為讀取命令與接收命令時序圖 * Read Data * 如附圖為讀取卡片的內容時序圖 * Write Data * 如附圖為寫入卡片內容的時序圖 DataIn和DataOut線分別是SPI的MISO及MOSI訊號。 </br> ![STM32F407ZG-SPI - SD card 交互時序圖](https://hackmd.io/_uploads/BJ0p5b0z0.png) </br> ### 格式 格式固定為 48 bit,都是通過 CMD 線傳輸,Data 線不參與傳輸 </br> ![STM32F407ZG-SPI - command 格式](https://hackmd.io/_uploads/HyCIfMRfR.png) </br> * 起始與終止位元 : 指令的主體包含在起始位與終止位之間,它們都只包含一個資料位,起始位為 0,終止位為 1。 * 傳輸標示 : 用於區分傳輸方向,此位元為 1 時表示指令方向為主機傳送至SD卡,此位元為 0 時表示回應方向為 SD 卡傳送至主機。 * 命令 : 它固定佔用 6 bit,所以總共有 64 個指令 (代號:CMD0~CMD63),每個指令都有特定的用途,部分指令不適用於 SPI,或不適用於 SD 卡操作,只是專門用於 MMC 卡或 SD I/O 卡。 * 地址訊息 / 參數 : 每個命令有 32 bit 位址資訊 / 參數用於命令附加內容,例如 : 廣播命令沒有位址信息,這 32 bit 用於指定參數,而尋址命令這 32 bit 用於指定目標 SD 卡的地址,當使用SDIO 驅動多張 SD 卡時,透過位址資訊區分控制不同的卡,使用 SPI 驅動時,透過選擇接腳來選擇不同的卡,所以使用這些指令時位址可填入任意值。 * CRC 校驗 : 長度為 7 bit 的校驗位用於驗證命令傳輸內容正確性,如果發生外部干擾導致傳輸資料個別位元狀態改變將導致校準失敗,也意味著命令傳輸失敗,SD 卡不執行命令。使用SDIO驅動時,指令中必須包含正確的 CRC7 校驗值;而使用 SPI 驅動時,指令中的 CRC7 校驗預設是關閉的,即這CRC7 校驗位中可以寫入任意值而不影響通訊,僅在發送 CMD0 指令時需要強制帶標準的 CRC7 校驗。 ### 回覆 Respond SD卡接收到大部分指令後它都是回傳這個類型的回應,用來指示工作狀態,它是一個長度為1位元組的回應 </br> ![image](https://hackmd.io/_uploads/S1R74VCfC.png) </br> # ADC ADC即數位類比轉換器,為一個將連續的類比訊號或者物理量(通常為電壓)轉換成數位訊號 ADC具備一些特性,包括: * 類比輸入,可以是單通道或多通道類比輸入 * 參考輸入電壓,該電壓可由外部提供,也可以在ADC內部產生 * 時脈輸入,通常由外部提供,用於確定ADC的轉換速率 * 電源輸入,通常有類比和數位電源接腳 * 數位輸出,ADC可以提供平行或串列的數位輸出 # I2C I2C,又稱 I²C(Inter-Interated Circuit),在 I2C 的通訊協定中,收發資料只單純靠兩條線就能完成多個設備之間的通訊,分別為 SCL(serial clock) 以及 SDA(serial data)。 ![image](https://hackmd.io/_uploads/SJNWkK5fR.png) 切記接上拉電組讓SCL、SDA由浮接(float)狀態轉變為高電位(High)狀態,才能確保I²C正常運行。 </br> ## I²C 時序 I²C包含了六種結構 ![image](https://i.imgur.com/X4RwG5W.gif) * 起始(Start condition) : 表示即將開始資料傳輸。 * 位址(Address) : 通常為7bits,表示要通訊的從設備(Slave Device)位址。 * 控制(R/W) : 接在位址後的第8bit,當R/W位元為0時,表示寫入資料 ; 當R/W位元為1時,表示讀入資料。 * ACK(Acknowledge): 每傳送完一個位元組(8bits)後,需要讀取接收端回傳的ACK bit(第9bit)來判斷資料是否接收成功。 * 資料(Data) : 為8bits,在SCL為低電位時改變SDA的狀態,在SCL為高電位時保持SDA的穩定。 * 結束(Stop condition) : 表示資料傳輸結束。 </br> ### 起始(Start) 、 結束(Stop) ![image](https://ithelp.ithome.com.tw/upload/images/20220320/20146325GFAbEakfdY.png) * Start : 當SCL高電位,SDA由高電位轉為低電位時,代表發出起始信號。 * Stop : 當SCL高電位,SDA由低電位轉為高電位時,代表發出結束信號。 </br> ### 資料有效性 ![image](https://ithelp.ithome.com.tw/upload/images/20220320/201463254I9kqscAGO.png) * 資料穩定 : 當SCL高電位時,會讀取SDA電位。 * 資料改變 : 當SCL低電位時,不會讀取SDA電位,此時能改變SDA電位。 </br> ### ACK、NACK ![image](https://pic.pimg.tw/rexpighj123/1623635731-934798963-g_n.png) * ACK(Acknowledge) : SDA低電位時,發送ACK信號,表示接收方成功收到資料。 * NACK(Not Acknowledge) : SDA高電位時,發送NACK信號,表示接收方未能成功收到數據或傳輸結束。 ==還沒編輯完呦== ==感恩== # 對韌體很重要的知識 ## 變數 ### volatile 在多執行緒中很重要的變數型態,指某個欄位可能是由同時執行的多個執行緒所修改 ! 編譯器、執行階段系統,甚至硬體都有可能基於效能因素,而重新排列對記憶體位置的讀取和寫入。 加入 ==volatile== 修飾詞可確保所有的執行緒都會依執行寫入的順序,觀察任何其他執行緒所執行的暫時性寫入。 </br> 三大特性: * 變數具有可見性 * 避免指令優化重排 * 不保證 atomic https://isdaniel.github.io/volatile-introduce/

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully