這篇文章主要是寫一下在ESP32這里的實現,因為是IDF下開發的,所以需要下載一下SDK.
SDK支持的芯片SDK
下載解壓,沒毛病
這個是項目里面的main函數
因為實現了斷電存儲這個功能,所以第一步一定是關于這個已經存儲的參數讀取。在ESP32,使用非易失性存儲 (NVS) 庫主要用于在 flash 中存儲鍵值格式的數據。
第一個注解直接在代碼中就有了顯示
NVS 庫在其操作中主要使用兩個實體:頁面和條目。頁面是一個邏輯結構,用于存儲部分的整體日志。邏輯頁面對應 flash 的一個物理扇區,正在使用中的頁面具有與之相關聯的序列號。序列號賦予了頁面順序,較高的序列號對應較晚創建的頁面。頁面有以下幾種狀態:
空或未初始化
頁面對應的 flash 扇區為空白狀態(所有字節均為 0xff)。此時,頁面未存儲任何數據且沒有關聯的序列號。
活躍狀態
此時 flash 已完成初始化,頁頭部寫入 flash,頁面已具備有效序列號。頁面中存在一些空條目,可寫入數據。任意時刻,至多有一個頁面處于活躍狀態。
寫滿狀態
Flash 已寫滿鍵值對,狀態不再改變。用戶無法向寫滿狀態下的頁面寫入新鍵值對,但仍可將一些鍵值對標記為已擦除。
擦除狀態
未擦除的鍵值對將移至其他頁面,以便擦除當前頁面。這一狀態僅為暫時性狀態,即 API 調用返回時,頁面應脫離這一狀態。如果設備突然斷電,下次開機時,設備將繼續把未擦除的鍵值對移至其他頁面,并繼續擦除當前頁面。
損壞狀態
頁頭部包含無效數據,無法進一步解析該頁面中的數據,因此之前寫入該頁面的所有條目均無法訪問。相應的 flash 扇區并不會被立即擦除,而是與其他處于未初始化狀態的扇區一起等待后續使用。這一狀態可能對調試有用。
main參數在此
這個是esp_err_t的封裝定義
其中NVS 分區不包含任何空頁。如果 NVS 分區被截斷,則可能會發生這種情況。擦除整個分區并再次調用 nvs_flash_init。
初始化函數
意思是我先看看flash這塊初始化的情況,如果沒有任何空頁就重新擦除
ESP_ERR_NVS_NO_FREE_PAGES :如果 NVS 存儲不包含空頁(如果 NVS 分區被截斷,可能會發生這種情況)
就是這樣
函數的定義
我們接下來看這個讀取設置的函數
在一開始看見的句柄:
句柄就好像你炒菜使用的鍋把,你其實是操作了鍋把,但是你對鍋有了影響
先出現了open函數,從默認 NVS 分區打開具有給定命名空間的非易失性存儲。
參數
esp_err_tnvs_open(const char *name, nvs_open_mode_topen_mode, nvs_handle_t*out_handle)
第一個參數
第二個
返回值
先關
后擦
在初始化
在寫入
在代碼里面頻繁出現這個宏
定義在此。里面使用了一個函數
看不清了?
里面其實最終執行的是這個函數
真的,無底洞
一開始會打印詳細的配置信息
下面就是寫入配置了
看一個字符串
其他的一樣
再看main,在你打開成功的情況下,寫入設置,否則就是else了
也就是讀取設置
這些函數都是ESP自己實現的:它們包含 malloc() 和 realloc() 實現的業務邏輯。因為堆跟蹤 包裝原因,我們不希望這些成為公共 api,但是,因此它們沒有公開定義。
上面的代碼,在末尾的進行掃尾的工作
接著是日志等級的設置
函數的定義
最后是傳入一個結構體
這個是WiFi的init函數,先初始化一下底層的協議棧,這些東西沒有什么地方教你,就自己研究吧,這里有個有趣的寫法就是,每一個函數使用CHECK來包裹,會及時告知編程者函數的執行情況。之后局部的創建一個循環的時間,接著創建一個默認的AP,也就是熱點,下面我應該有函數的截圖。然后就是WiFi默認的所有參數,在下面也有,之后使用init_config來重新將數據重塑。
將初始化的參數給這個函數來開啟WiFi
之后為事件注冊一個循環
初始化函數底層協議
創建的事件循環
WIFI的兩種模式
一個IP的配置文件,IP,網絡掩碼
這個是AP的配置
簡單的追一下,就可以知道這個東西的具體意思
反正我也沒有啥事情干,就繼續追,還可以看見支持的WiFi加密模式
SoftAP的成對密碼,群密碼將用此導出。密碼值從 WIFI _ CYPER _ TYPE _ TK IP 開始有效,之前的枚舉值將被視為無效,將使用默認密碼套件( TK IP + CCMP )。在軟 AP 模式下,有效的密碼套件是 WIFI _ CYPER _ TYPE _ TK IP 、 Wifi _ CIFIER _ PYPY _ CKIP _ CCKMP 和 WIFi _ CEPIR _ Type _ TC IP _ CCMP
先記住我們這里幾個提前寫好有意義的東西
這個函數其實你查IDF是沒有的
memcpy() 用來復制內存,其原型為:
void * memcpy ( void * dest, const void * src, size_t num );
memcpy() 會復制 src 所指的內存內容的前 num 個字節到 dest 所指的內存地址上。
memcpy() 并不關心被復制的數據類型,只是逐字節地進行復制,這給函數的使用帶來了很大的靈活性,可以面向任何數據類型進行復制。
wifi的接口模式
下面就開始設置WiFi的模式,很簡單
WiFi在不同的國家里面對功率的要求是不一樣的,這里是寫了這個
就像這樣
傳入后開啟WiFi
memset是計算機中C/C++語言初始化函數。作用是將某一塊內存中的內容全部設置為指定的值, 這個函數通常為新申請的內存做初始化工作。
看這個代碼
把這個寫入
后面這個DHCP啥的都設置一下
就是純互聯網了
看在文檔的位置
接下來是開啟mDNS服務
mdns 即多播dns(Multicast DNS),mDNS主要實現了在沒有傳統DNS服務器的情況下使局域網內的主機實現相互發現和通信,使用的端口為5353,遵從dns協議,使用現有的DNS信息結構、名語法和資源記錄類型。并且沒有指定新的操作代碼或響應代碼。在局域網中,設備和設備之前相互通信需要知道對方的ip地址的,大多數情況,設備的ip不是靜態ip地址,而是通過dhcp協議動態分配的ip 地址,如何設備發現呢,就是要mdns大顯身手,例如:現在物聯網設備和app之間的通信,要么app通過廣播,要么通過組播,發一些特定信息,感興趣設備應答,實現局域網設備的發現,當然mdns 比這強大。
目前為止,2222個字了
看這幾個函數
我們的文件系統的初始化,個人認為是web網頁
這個是文件系統的結構體
具體的意思
這是防御性的代碼,確保文件系統就是可以使用
最后的函數
這個寫法和上面一樣
ESP32 設備的控制模塊實現。FC 和地面之間的雙向鏈路。能處理 MSPv1、MSPv2、LTM 和 MAVLink。MSP & LTM 被解析并逐幀發送到地面。MAVLink 通過(完全透明)。可以與任何協議一起使用。
但是這個任務好復雜。。。
看看這個頭是啥?
C99新增inline關鍵字時,它時唯一的函數說明符(關鍵字extern和static時存儲類別說明符,可應用于數據對象和函數)。C11新增了第二個函數說明符_Noreturn,表明調用完成后函數不返回主調函數。exit()函數時_Noreturn函數的一個示例,一旦調用exit()它不會再返回主調函數。注意,這與void返回類型不同。void類型的函數再執行完畢后返回主調函數,只是它不提供返回值。
_Noreturn的目的是告訴用戶和編譯器,這個特殊的函數不會把控制返回主調程序,告訴用于以免濫用該函數,通知編譯器可優化一些代碼。
這個任務里面寫了串口和TCP
寫入的參數
8位
校驗
停止碼
硬件流控
看看串口
結構體的配置
串口2
這個是IO配置
具體的使用
定義可以自己改
安裝一個串行口的驅動程序
安裝 UART 驅動程序并將 UART 設置為默認配置。UART ISR 處理程序將附加到運行此函數的同一 CPU 內核。
就這樣
后面還要看看這個串口到底是不是可以使用的。如果不行就把驅動卸載,,拋出錯誤。
沒有小錯誤就可以使用了
函數在此
TCP看不懂了。。。上面這些應該是初始化的參數
建立一個入口
<0的時候是跑錯誤
bind我忘了,好像是什么端口也重要
最后是監聽的口,反正都沒有錯就會返回一個正確的IP和Port
。。。寫不下去了,函數太長了,我知道也沒有人看到這里,我明天考慮要不要把剩下的任務寫了、
不過在文章的末尾我還是要罵,金鵬太拉了,憑什么我的行李就得托運,氣死我了,為啥深圳航空就可以,我的300米就沒了。
臨下飛機,我還以為碰上密接了,突然就不讓動了,你再看這個圖
遠一點看,像不像大夫在等著拉人
-
芯片
+關注
關注
456文章
51170瀏覽量
427215 -
SDK
+關注
關注
3文章
1045瀏覽量
46265 -
ESP32
+關注
關注
18文章
978瀏覽量
17524
原文標題:Dronebridge-ESP32的數字遙測實現
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論