[STM32-HAL庫]Flash庫-HAL庫-復雜數據讀寫-STM32CUBEMX開發-HAL庫開發系列-主控STM32F103C6T6

目錄

一、前言

二、實現步驟

? ? ? ? 1.STM32CUBEMX配置

? ? ? ? 2.導入Flash庫

? ? ? ? 3.分析地址范圍

? ? ? ? 4.找到可用的地址

? ? ? ? 5.寫入讀取普通數據

? ? ? ? 6.寫入讀取字符串

? ? ? ? 6.1 存儲相關信息

? ? ? ? 6.2 存取多個參數

三、總結及源碼


一、前言

? ? ? ? 在面對需要持久化存儲的數據時,除了掛載TF卡,我們能用到的最方便的方法就是將數據粗存入Flash,比如存儲密碼、存儲記錄等。本文中的Flash庫由我開發,具有存取和寫出各類型數據和字符串的功能。

二、實現步驟

? ? ? ? 1.STM32CUBEMX配置

? ? ? ? 此處正常配置相關參數,本文使用STM32F103C6T6,時鐘頻率為72MHz,Flash操作無需配置其他參數。

? ? ? ? 2.導入Flash庫

? ? ? ? 下載并解壓壓縮包,可以得到一個.c文件和.h文件,將其導入到工程中,此處簡單就不再贅述,不會的話可以看之前的文章。

? ? ? ? 3.分析地址范圍

? ? ? ? 要寫入Flash,我們必須知道要寫入的內存地址,以STM32F103C8T6為例,依照下圖的命名規則可知其Flash大小為64K,根據計算,(64*1024)-1=65535,其對應的十六進制是0xFFFF,加上起始地址0x0800 0000,可知其Flash地址范圍為0x0800 0000-0x0800 FFFF

? ? ? ? 在實際開發中如果我們使用了不同的芯片,比如本文使用STM32F103C6T6,那么其地址范圍也不同,其地址范圍是0x0800 0000~0x0800 7FFF,如果我們向0x0800 E000去寫入數據,那必然不會成功,讀取亦然。

????????

? ? ? ? 4.找到可用的地址

? ? ? ? 其實即使我們分析出地址范圍是0x0800 0000~0x0800 7FFF,但這里邊的地址并非全部可用的,比如程序編譯后(如下圖)燒寫進去是會占用一部分地址的,因此你需要把考慮進去,本文就不做論述了,有興趣可以去其他地方查一查(如果有時間我也會出一篇文章說一下這個部分)。

? ? ? ? 5.寫入讀取普通數據

? ? ? ? 打開flash.h,可以看到我封裝了很多函數。當然還有一部分數據分割代碼,這個稍后再介紹。從聲明中,我們可以知道如何存儲和讀取uint8、uint16類型的數據。

? ? ? ? 寫入并讀取uint8_t類型數據。

uint8_t data_1='A';
Earse_Page(0x08006000,1);//擦除
Write_uint8(0x08006000,data_1);data_1=Read_uint8(0x08006000);

? ? ? ? 6.寫入讀取字符串

? ? ? ? 6.1 存儲相關信息

? ? ? ? 本庫完成了對字符串的讀寫操作,以地址0x0800 7000為例,寫入字符串“ABC”并讀取出來。

uint8_t data[50];memset(data,'\0',50);
sprintf((char *)data,"ABC\n");
STMFLASH_Write(0x08007000,data,50);
memset(data,'\0',50);
STMFLASH_Read(0x08007000,data,50);
HAL_UART_Transmit(&huart1,data,50,1000);

? ? ? ? 6.2 存取多個參數

? ? ? ? 通過這種辦法,其實我們可以一次存取多個參數信息,例如我將生成四個float類型的參數,將其轉換成字符串,其中以固定字符分割(,),隨后每次啟動時,從flash讀取字符串,并進行數據分割,即可實現去除數據的效果(這段代碼就是頭文件最后的數據分割代碼)。

//存取多個參數
memset(data,'\0',50);
sprintf((char *)data,"%.2f,%.2f,%.2f,%.2f",temp,hum,water,ch4);
STMFLASH_Write(0x08007000,data,50);STMFLASH_Read(0x08007000,data,50);
temp=atof(strtok((char *)data,","));
hum=atof(strtok(NULL,","));
water=atof(strtok(NULL,","));
ch4=atof(strtok(NULL,","));
sprintf((char *)data,"%.2f,%.2f,%.2f,%.2f",temp,hum,water,ch4);
HAL_UART_Transmit(&huart1,data,50,1000);

三、總結及源碼

? ? ? ? 文章至此,已經完成Flash的各類操作,需要注意的是,存儲單個類型的數據時需要先執行擦除操作,不擦除無法寫入。而存儲字符串時不需要,因為在字符串函數內我已經寫了擦除函數,直接調用即可。同時,本文也通過字符串讀寫為大家提供了一種存儲參數的方案。

? ? ? ? 庫文件:Flash-HAL庫文件-字符串讀寫

? ? ? ? 本文工程:Flash-HAL庫-STM32CUBEMX工程

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

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

相關文章

燃數科技前端25-40K*14薪一面超簡單,下周二面啦

一面 1、自我介紹 2、低代碼如何設計的 3、react路由原理 4、react生命周期 5、什么是回調地獄,如何解決 6、jwt和session有什么區別 7、js文件相互引用有什么問題?如何解決 8、一個很大的json文件,前端讀取如何優化 面試我的不像是…

為什么說 Redis 是單線程的?——Java全棧知識(25)

為什么說 Redis 是單線程的? 我們常說的 Redis 是單線程的,但是我前面在講持久化機制的時候又說 RDB 的持久化是通過主進程 fork 出一個子進程來實現 RDB 持久化。那么 Redis 到底是多線程還是單線程的呢? Redis 的網絡 IO 和鍵值的讀寫是單…

力扣:1306. 跳躍游戲 III

1306. 跳躍游戲 III 這里有一個非負整數數組 arr,你最開始位于該數組的起始下標 start 處。當你位于下標 i 處時,你可以跳到 i arr[i] 或者 i - arr[i]。 請你判斷自己是否能夠跳到對應元素值為 0 的 任一 下標處。 注意,不管是什么情況下…

數據庫|基于T-SQL創建數據庫

哈嘍,你好啊,我是雷工! SQL Server用于操作數據庫的編程語言為Transaction-SQL,簡稱T-SQL。 本節學習基于T-SQL創建數據庫。以下為學習筆記。 01 打開新建查詢 首先連接上數據庫,點擊【新建查詢】打開新建查詢窗口, …

appium-driver方法待整理。。

app C:\Users\v-hongweishi\AppData\Local\Programs\Xmind\Xmind.exe deviceName DESKTOP-7NJ1ENB platformName Windows 應用程序ID(AppId)是應用程序用戶模型 ID (AppUserModelID),簡稱 AUMID Outlook …

Leetcode 113:路徑總和II

給你二叉樹的根節點 root 和一個整數目標和 targetSum &#xff0c;找出所有 從根節點到葉子節點 路徑總和等于給定目標和的路徑。 葉子節點 是指沒有子節點的節點。 public static List<List<Integer>> pathSum(TreeNode root, int targetSum) {List<List&l…

C++—結構體

結構體&#xff08;struct&#xff09;&#xff0c;是一種用戶自定義復合數據類型&#xff0c;可以包含不同類型的不同成員。 結構體的聲明定義和使用的基本語法&#xff1a; // 聲明結構體struct 結構體類型 { 成員1類型 成員1名稱; ...成員N類型 成員N名稱; };除聲明…

【計算機視覺(2)】

基于Python的OpenCV基礎入門——視頻的處理 視頻OpenCV視頻處理操作&#xff1a;創建視頻對象判斷視頻是否成功初始化讀取視頻幀獲取視頻特征設置視頻參數聲明編碼器保存視頻釋放視頻對象 視頻處理基本操作的代碼實現&#xff1a; 視頻 視頻是由一系列連續的圖像幀組成的。每一…

Spring—IoC

目錄 1. IoC的提出 2. Spring容器 2.1. Spring容器實現原理 2.2. Spring組件 2.2.1 XML標簽方式 2.2.2. 類注解方式 2.2.3. 方法注解方式 2.3. Spring容器分類 2.3.1. BeanFactory容器 2.3.2. ApplicationContext容器 2.3.3. WebApplicationContext容器 3. Spring中…

Srping 歷史

一、History of Spring and the Spring Framework Spring came into being in 2003 as a response to the complexity of the early J2EE specifications. While some consider Java EE and its modern-day successor Jakarta EE to be in competition with Spring, they are …

nginx 配置stream模塊代理并開啟日志配置

前言 nginx 1.20.1 nginx從1.9.0開始,新增加了一個stream模塊 確保nginx 安裝時開啟stream模塊 ./configure \ …… \ --with-stream \ --with-stream_ssl_module \ 修改nginx.conf #增加stream配置&#xff0c;開啟stream模塊 stream {log_format basic $remote_addr [$…

stm32 作為從機, fpga 作為主機,進行 spi 通信

stm32 作為從機, fpga 作為主機,進行 spi 通信 STM32和FPGA之間的SPI通信是直連形式。使用FPGA讀取傳感器的值,傳輸到STM32中進行計算。 STM32是將SPI接受過來的數據存儲到DMA中。 #include "SPI_DMA.h" #include <stm32f10x.h> uint8_t spi_buf[4];//FP…

idea啟動報錯:java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory

文章目錄 一、問題二、解決方法 一、問題 問題描述&#xff1a;idea整合Mybatis-plus的時候&#xff0c;啟動報錯&#xff1a;java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory 二、解決方法 可能原因&#xff1a;仔細檢查了一下&#xff0c;發現 mybati…

《王者榮耀》4月狂攬2.34億美元 單日流水1億美元 全球銷量第二

易采游戲網5月24日消息&#xff0c;在剛剛過去的四月&#xff0c;全球手游市場迎來了一場收益的盛宴&#xff0c;其中《王者榮耀》以其驚人的吸金能力&#xff0c;以2.34億美元的月收入在全球手游排行榜上位列第二。4月5日&#xff0c;這款由騰訊游戲開發的多人在線戰斗競技游戲…

C++相關概念和易錯語法(14)(初始化注意事項、vector、編譯器向上查找規則)

1.當我們在代碼中想要終止運行的話&#xff0c;我們可以采用Ctrl C或Ctrl Z&#xff0c;其中^C代表殺進程&#xff0c;^Z設置結束2.編碼表&#xff1a;我們目前比較熟悉的是ASCII碼編碼方式&#xff0c;但是我們發現平時使用的漢字無法通過ASCII編碼&#xff0c;除此之外&…

前端canvas項目實戰——在線圖文編輯器:序

目錄 前言一、 博主是誰&#xff1f;二、 關于本專欄1. 本專欄涉及的技術棧2. 專欄適合誰來學習&#xff1f;3. 你可以從專欄學到什么&#xff1f;4. 系列文章索引 三、 付費信息后記 前言 很高興&#xff0c;今天我又為自己設定了一個目標&#xff1a;帶領大家從入門HTML5中的…

自動化測試用例結構

標準的用例結構&#xff1a; 用力標題前提條件用例步驟預期結果實際結果 測試用例對比&#xff1a;

酷開系統 | 酷開科技把握智慧先機 AI賦能家庭場景

智慧化是當今世界科技發展的前沿領域之一。現在的智慧化&#xff0c;也正在逐步成為我們日常生活的一部分。電視系統也進入了數字化時代&#xff0c;AI的應用正在不斷擴展&#xff0c;其潛力似乎無窮無盡。 酷開科技深耕人工智能技術&#xff0c;在提升語音體驗、強化智能家居…

(1)無線電失控保護(二)

文章目錄 前言 4 參數配置 5 測試 6 使用接收器設置飛行模式(

第二證券:新股申購配號數什么意思?

股配號數量便是我們參與抽簽的數量&#xff0c;投資者申購新股之后&#xff0c;交易所會根據持有的股票市值進行配號。 投資者的市值越大&#xff0c;申購新股的配號越多&#xff0c;其中簽機會越大。主板、創業板、科創板一個申購單位是500股&#xff0c;意味著1萬元的市值有…