ADC、Flash、SPI、watchdog

ADC

ADC(Analog-to-Digital Converter), 即模擬信號 - 數字信號轉換器

在STM32F103C8T6中, 同樣具有ADC功能.

  • 以我們的芯片為例, 也存在2個片上外設ADC, 即ADC1和ADC2, 這兩個ADC片上外設都掛載在APB2總線上.

  • 我們的ADC片上外設, 是一種具有12位逐次逼近型ADC,ADC轉換的本質是不斷的電壓比較

如何把0~4095映射到0~3.3?

把3.3分成4096份,每份3.3/4095=8.06e-4,2000的離散值對應的電壓是1.61

2v對應的離散值是4095/3.3*2=2481,對應的二進制是1001 1011 0.001

下面就是實現了4095/3.3*2這個過程,想一想二進制除法的實現

  1. 初始化:SAR 從最高位(MSB,即第11位)開始試探,其余位清零。

    • 例如,首次試探值:1000 0000 0000(即 2048,對應中間電壓)。

  2. 比較判斷

    • 若?VIN≥VDACVIN?≥VDAC?,保留該位為?1,否則置?0

  3. 逐位逼近

    • 移至下一位(如第10位),重復比較,直到最低位(LSB)。

  4. 完成轉換

    • 經過?12次比較?后,SAR 中的值即為最終數字輸出。

在配置使用ADC時, 通道是一個重要數據, 而ADC的通道和固定的引腳綁定.

// 在每次AD轉換前配置規則組,這樣可以靈活更改AD轉換的通道
// 第一個參數: 采用ADC1還是ADC2
// 第二個參數: 使用那個通道, 比如ADC_Channel_1表示PA1通道; ADC_Channel_4表示PA4通道
// 第三個參數: 規則組可以有最多16個通道,可以指定該通道在規則組中的采樣順序
// 第四個參數: 對輸入電壓采樣的時間長短; ADC_SampleTime_55Cycles5表示采樣55.5個ADC時鐘節拍ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);// 軟件觸發一次ADC1采樣ADC_SoftwareStartConvCmd(ADC1, ENABLE);	
// 等待采樣結束: 采樣是否結束, 高根據寄存器EOC標志位來判斷while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

規則組 和 注入組:在ADC中我們可以把采樣分組, 無論是規則組還是注入組, 它的本質都是去記錄采樣的通道(要依次采樣那幾個通道, 以組劃分)

注意: 注入組的優先級要比規則組,注入組最多可以配置同時采集4個通道, 并且每個通道的采集數據分別用一個寄存器存儲。而規則組最多可以同時采集16個通道, 但是16個通道的采集數據, 共用一個寄存器存儲, 有可能產生數據覆蓋

連續轉化:?上一次采集完畢, 立馬進行下一次采集(完全不需要額外的軟件觸發或者硬件觸發)

掃描模式:每次觸發, 就把組內的配置的所有通道的數據都采集一遍

	// ADC初始化ADC_InitTypeDef ADC_InitStructure;	
// ADC模式選擇: 暫時選擇默認獨立工作模式(即只使用ADC1)ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
// 數據對齊(和采樣數據精度相關)ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
// 選擇觸發采集模式(不用外部硬件觸發, 使用軟件觸發)ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
// 不進行連續轉化, 不開啟, 必須觸發過來, 才進行采樣ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
// 不開啟掃描模式, 因為我們準備每個組設置一個采樣通道(通過設置, 采樣, 修改設置, 采樣的方式)ADC_InitStructure.ADC_ScanConvMode = DISABLE;
// 開啟的通道數(給掃描模式指明掃描幾個通過個數用的)ADC_InitStructure.ADC_NbrOfChannel = 1;
// 初始化ADC_Init(ADC1, &ADC_InitStructure);// 啟動ADC

Flash

?主存儲器: 用來存放程序代碼和一些不可變數據(特點是斷電不丟失)
起始地址0x08000000??當前默認64KB(0x08000000~0x0800FFFF)

信息塊: 是STM32內部Flash額外劃分的一部分, 主要用于存放設備的用戶配置數據或校準數據.該區域通常是只讀的, 不能隨意修改.

接口寄存器: 用于控制和配置STM32的外設(如GPIO、USART、SPI、I2C、ADC等)

// addr: 頁首地址
void erasePage(uint32_t addr) {FLASH_Unlock();					//解鎖FLASH_ErasePage(addr);			//頁擦除FLASH_Lock();					//加鎖
}

看門狗

看門狗(Watchdog Timer, WDT)是一種硬件定時器, 用于防止系統死機或者長時間運行異常代碼, 避免程序跑飛.

獨立看門狗

?假設今天預分頻設為4分頻, 重裝值設置為111111111111 -> 4095,求超時時間是多少?

40kHz/4=10kHz,所以0.1ms一個時鐘節拍,所以超時時間是409.5ms

IWDG_ReloadCounter(); ?// 喂狗喂狗的本質, 就是通過鍵寄存器的修改(IWDG_KR), 要求遞減計數器進行計數值的重裝.避免計數值減為0.

窗口看門狗

窗口看門狗(WWDG)是一種?基于時間窗口?的看門狗定時器,主要用于?高可靠性嵌入式系統(如汽車電子、工業控制),確保程序在?嚴格的時間范圍內?進行喂狗(刷新),避免?過早或過晚?喂狗導致的系統異常。

?窗口看門狗 vs 獨立看門狗(IWDG)

特性窗口看門狗(WWDG)獨立看門狗(IWDG)
時鐘源來自 APB1(PCLK1)獨立低速時鐘(LSI,~32kHz)
復位條件喂狗時間?不在窗口內超時未喂狗
時間精度較高(依賴系統時鐘)較低(依賴 LSI)
窗口約束必須?在最小和最大時間之間?喂狗只需?在超時前?喂狗
應用場景對?時序嚴格?的任務(如安全控制)防?程序跑飛(通用看門狗)

36MHz/4096/4=2197Hz第一次4096分頻,第二次4分頻

一個節拍0.46ms,WWDG_CR64個節拍復位64*0.46=29.44ms,最晚的時間

假設WWDG_CFR的值是112,并且一旦,它的數值小和喂狗時就會復位

計數器(WWDG_CR)

  • 7 位遞減計數器(T6~T0),當?T6?從 1→0 時觸發復位(即?0x40?→?0x3F)。
  • 喂狗通過寫入?WWDG_CR?重置計數器值。

配置寄存器(WWDG_CFR)

  • 設置?窗口值(W6~W0),定義喂狗的?允許時間窗口
  • 設置?預分頻器(WDGTB)?調整時鐘頻率。

時間窗口

  • 最小時間(上窗口?→?“喂狗允許的起始點”):由?WWDG_CFR?的窗口值(W)決定,喂狗?不能早于?計數器值 > W。

  • 最大時間(下窗口?→?“喂狗截止點”):計數器值從初始值遞減到?0x3F(即 T6=0)時復位,喂狗?不能晚于?此點。

SPI

SPI協議的核心特性包括高位優先(MSB First)的數據傳輸方式、可配置的時鐘極性(CPOL)和相位(CPHA), 以及靈活的時鐘速率調整能力. 時鐘極性(CPOL)決定了時鐘信號在空閑狀態下的電平(高或低), 而時鐘相位(CPHA)則定義了數據采樣相對于時鐘邊沿的位置. 通過組合CPOL和CPHA, SPI支持四種不同的工作模式(Mode0至Mode3),以適應不同設備的需求.此外,SPI協議允許主機通過軟件或硬件方式控制片選信號(NSS/CS)從而實現對多個從機的靈活管理.

MISO:Master Input Slave Output/主設備數據輸入,從設備數據輸出
MOSI:Master Output Slave Input/主設備數據輸出,從設備數據輸入
SCK:Serial Clock/時鐘信號,由主設備產生
CS:Chip Select/片選信號,由主設備控制

提問兩臺從機可以同時給,主機發消息嗎?

不可以,會產生沖突

?需要注意的是:?
以W25Q64為例, 其總共占用64Mbit即8M字節
在其內部又以"塊"->"扇區"->"頁"來劃分 :一個塊=64K字節=16扇區、一個扇區=4K字節=16頁
一個頁=256字節

并且在對其進行操作的時候要求先擦除, 再寫入
擦除要以扇區為單位

?對W25Q64進行操作的時候:
讀取數據過程: 發送讀取命令->發送地址->發送數據(是為了讀數據)
寫入數據過程: 發送寫入命令->發送地址->發送寫入內容

SPI 通過?時鐘極性(CPOL)?和?時鐘相位(CPHA)?定義數據傳輸時序,共有?4 種模式

模式CPOLCPHA時鐘空閑狀態數據采樣邊沿
000低電平上升沿
101低電平下降沿
210高電平下降沿
311高電平上升沿

MQTT

MQTT(Message Queuing Telemetry Transport)是一種輕量級的?發布/訂閱(Pub-Sub)?消息協議,專為?低帶寬、高延遲或不可靠網絡?環境設計。

正常來講,HTTP頭部很大,這樣就會導致許多問題,MQTT的輕量級,就體現在頭部輕量

MQTT vs HTTP 對比

特性MQTT?(消息隊列遙測傳輸)HTTP?(超文本傳輸協議)
協議類型發布/訂閱(Pub-Sub)模型請求/響應(Request-Response)模型
設計目標低帶寬、高延遲、不可靠網絡(IoT 優化)通用 Web 通信(文檔傳輸)
連接方式長連接(基于 TCP + 可選 TLS)短連接(默認無狀態,HTTP/2 支持長連接)
消息大小極輕量(頭部僅 2 字節起)較大(HTTP 頭部通常幾百字節)
通信模式異步(Broker 中轉消息)同步(客戶端主動請求,服務端響應)
QoS 支持? 3 個級別(0/1/2)? 無原生 QoS(依賴 TCP 重傳)
實時性? 高(低延遲推送)? 較低(需輪詢或 WebSocket)
適用場景IoT、傳感器數據、實時控制Web 頁面、REST API、文件傳輸
典型端口1883(明文)、8883(TLS)80(HTTP)、443(HTTPS)
廣播/多播支持?(Topic 訂閱)?(需額外協議如 WebSocket)
消息保留?(Broker 可存儲最后一條消息)?(無狀態,需額外實現)
連接開銷? 極低(適合嵌入式設備)?? 較高(HTTP 頭部 + Cookie 等)

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

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

相關文章

冷庫設備遠程監控物聯網+省電節能解決方案

隨著生鮮電商、醫藥冷鏈、跨境物流等行業的爆發式增長,我國冷庫容量激增,但傳統冷庫管理模式正面臨嚴峻挑戰。據統計,國內冷鏈運輸損耗率高達12%-15%,其中因溫度失控導致的貨損占比超60%。在某醫藥企業冷庫事故中,因制…

如何開發一個運行在windows系統服務器上的服務

第一步:vs2022創建一個windows服務項目第二步:從工具箱拖拽出一個timer第三步:按下圖所示進入,開始編輯業務邏輯下面給個例子using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; …

本地組策略編輯器無法打開(gpedit.msc命令異常)

一、本地組策略編輯器打開方式1、直接搜索打開(1)在搜索欄中直接輸入以下內容進行搜索本地組策略編輯器(2)搜索到后直接點擊打開即可(但是一部分同志無法搜索到,搜索到的內容基本都是網頁信息而非本地系統的…

kafka部署集群模式

Kafka部署(3.7) 生產環境推薦的kafka部署方式為operator方式部署,Strimzi是目前最主流的operator方案。集群數據量較小的話,可以采用NFS共享存儲,數據量較大的話可使用local pv存儲 部署operator operator部署方式為he…

C語言中級_動態內存分配、指針和常量、各種指針類型、指針和數組、函數指針

0、前言: 動態內存分配是一個重要概念,要和靜態數組對比著學習;指針和數組搭配在一起,讓指針理解的難度上了一個臺階,尤其是二維數組搭配指針,要獲取數組的值,什么時候“取地址”,什…

單變量單步時序預測:CNN-GRU卷積神經網絡結合門控循環單元

目錄預測效果1. **CNN-GRU的基本原理**2. **應用場景**3. **模型結構與實現**4. **優勢與挑戰**5. **相關研究與實現**6. **未來發展方向**結論代碼設計預測效果 CNN-GRU卷積神經網絡結合門控循環單元是一種結合了卷積神經網絡(CNN)和門控循環單元&#…

MonoFusion 與 Genie 3

卡內基梅隆大學的研究者發明了一種叫 MonoFusion 的新技術,它能用很少的普通相機(比如4個),就能拍出像電影特效一樣細膩流暢的動態3D場景(4D重建),比如彈鋼琴、修自行車這種復雜動作&#xff0c…

kubernets命令行創建Token并附加權限給dashboard控制臺登錄

1、創建登錄token kubectl create token default -n graph-node-test dgjeojrgopejgeropjgpsdjgerjglsdjfsjogjeojgeorjgortlfhj4yu493460uwperg3wef;lsj2y3r934tnrhifrlfe9t4h5tlhobdrmlgw485tw4yp653ut9ogogjerolj4w9erjgotj3fgjletyj49yr20o359truyo5u6908430jt5grjsdtgj49…

什么是SpringBoot

題目詳細答案Spring Boot 是由 Pivotal 團隊提供的一個基于 Spring 框架的項目,它旨在簡化 Spring 應用的開發和部署。Spring Boot 通過提供一系列的約定和開箱即用的功能,使得開發者可以更快地構建獨立的、生產級的 Spring 應用程序,而無需進…

從零開始設計一個分布式KV存儲:基于Raft的協程化實現

從零開始設計一個分布式KV存儲:基于Raft的協程化實現 本文將以一個最小可運行的分布式KV系統為例,帶你拆解如何用C、Raft算法和協程模型構建高可用的Key-Value存儲。 一、為什么需要分布式KV? 單機KV(如Redis)存在單點…

虛擬機或docker的ubuntu無界面安裝完成后鏡像源設置

ubuntu系統源 在裝好虛擬機或者docker鏡像后,直接使用apt update && apt upgrade是無法完更新的。 此時系統中也沒有vim工具,我們可以在清華源的網站中找到幫助文檔。mirrors.tuna.tsinghua.edu.cn/help/ubuntu/為了避免沖突,我們使用…

串口通信02 溫度傳感DS18B20 01 day49

九:串口通信 通信:無線和有線 ? 單工 半雙工 全雙工 并行:多個數據線 串行:一根數據線 同步:通信雙方使用同一個時鐘,SPI信息幀,有CLK引腳 異步:通信雙方使用不同時鐘,雙…

【FreeRTOS 】任務通知

FreeRTOS 任務通知任務通知簡介一 、發送通知1.1 xTaskNotify()1.2 xTaskNotifyFromISR()1.3 xTaskNotifyGive()1.4 xTaskNotifyAndQuery()1.5 xTaskNotifyAndQueryFromISR()二、接收通知2.1 ulTaskNotifyTake()2.2 xTaskNotifyWait()三、清除通知狀態和值3.1 xTaskNotifyState…

Android視圖狀態以及重繪

一、視圖狀態(View States)1. 五種核心狀態狀態作用修改方法特點enabled視圖是否響應交互setEnabled(boolean)禁用狀態下不響應onTouch事件focused視圖是否獲得焦點requestFocus()需同時滿足focusable和focusableInTouchModewindow_focused視圖所在窗口是…

vue3接收SSE流數據進行實時渲染日志

后端使用的是 Spring Boot WebFlux(響應式編程框架),并且返回的是 Server-Sent Events (SSE) 流式數據,那么在 Vue3 中,需要使用 EventSource API 或 fetch 流式讀取 來正確獲取響應內容。方案 1:使用 Eve…

每日五個pyecharts可視化圖表-bars(6)

探索pyecharts庫中條形圖的高級用法與定制技巧 在數據可視化中,條形圖是最常用的圖表類型之一,它能夠清晰地展示不同類別之間的數量對比。今天,我們將繼續學習如何使用pyecharts創建5種不同風格的條形圖。pyecahts源碼 圖表1:帶…

【C語言】文件操作全解析

文章目錄一、為什么需要文件操作?二、認識文件:不止是磁盤上的存儲2.1 程序文件2.2 數據文件2.3 文件名的構成三、文本文件與二進制文件:數據的兩種形態3.1 存儲方式差異3.2 實例對比:整數10000的存儲3.3 二進制文件操作示例四、文…

C結構體的幾種定義形式 + typedef結合使用的好處

struct 語句定義了一個包含多個成員的新的數據類型,struct 語句的格式如下: struct tag { member-list member-list member-list ... } variable-…

SPICE電容矩陣

SPICE電容矩陣: 如果有許多條傳輸線,就可以用下標來標記每一條線。例如,如果有5條線,就用1~5分別標記,依慣例把返回路徑導體標記為導線0。圖10.6給出了5條導線和一個公共返回平面的橫截面圖。首先研究電容器元件,下一節再討論電感器元件。 在這個線的集合中,每對導線之間…

【Java】棧和隊列

文章目錄1.棧1.1 棧的定義1.2 棧的使用1.3 棧的模擬實現2.隊列2.1 隊列的定義2.2 隊列的使用2.3 隊列的模擬實現3.循環隊列3.1 循環隊列的概念3.2 循環隊列判斷空和滿4.雙端隊列Deque1.棧 1.1 棧的定義 棧是一種特殊的線性表,其只允許在固定的一段進行數據的插入或…