在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【LPC55S69】使用FAL分區管理與easyflash變量管理(下集)

恩智浦MCU加油站 ? 來源:未知 ? 2023-06-29 09:05 ? 次閱讀

上期帶大家了解了FAL組件和DFS文件系統的功能特點和使用方法,本期將繼續解讀如何將EasyFlsh移植到FAL分區。

簡述EasyFlash

關于EasyFlash的來源我們已經講過,EasyFlash是一款開源的輕量級嵌入式Flash存儲器庫,方便開發者更加輕松的實現基于Flash存儲器的常見應用開發。非常適合智能家居、可穿戴、工控、醫療、物聯網等需要斷電存儲功能的產品,資源占用極低,支持各種 MCU 片上存儲器。

EasyFlash不僅能夠實現對產品的設定參數或運行日志等信息的掉電保存功能,還封裝了簡潔的增加、刪除、修改及查詢方法,降低了開發者對產品參數的處理難度,也保證了產品在后期升級時擁有更好的擴展性。讓Flash變為NoSQL(非關系型數據庫)模型的小型鍵值(Key-Value)存儲數據庫。

EasyFlash軟件包使用

打開ENV進入路徑:RT-Thread online packages → tools packages → EasyFlash: Lightweight embedded flash memory library.,選擇軟件包版本為最新版。配置后退出ENV,同時使用pkgs --update下載軟件包,然后再使用scons-target=mdk5重新生成MDK5文件。

4936011e-1615-11ee-962d-dac502259ad0.png

移植EasyFlash

下載完easyflash軟件包后,我們復制. t-threadsplpc55sxxlpc55s69_nxp_evkpackagesEasyFlash-latestportsef_fal_port.c到目錄. t-threadsplpc55sxxlpc55s69_nxp_evkoardportseasyflashef_fal_port.c,雙擊打開該文件,完成以下修改:

// 修改 FAL_EF_PART_NAME 為 easyflash
#define FAL_EF_PART_NAME               "easyflash"

編寫EasyFlash測試用例

/*
  * Copyright (c) 2006-2023, RT-Thread Development Team
  *
  * SPDX-License-Identifier: Apache-2.0
  *
  * Change Logs:
  * Date           Author       Notes
  * 2023-04-21     Wangyuqiang  the first version
  */


#include "rtthread.h"
#include "rtdevice.h"
#include "board.h"
#include "fal.h"


#include 


#include "easyflash.h"
#include 


#define FS_PARTITION_NAME  "filesystem"


#define BUF_SIZE 1024


static int fal_test(const char *partiton_name)
{
int ret;
int i, j, len;
uint8_t buf[BUF_SIZE];
const struct fal_flash_dev *flash_dev = RT_NULL;
const struct fal_partition *partition = RT_NULL;


if (!partiton_name)
     {
         rt_kprintf("Input param partition name is null!
");
return -1;
     }


     partition = fal_partition_find(partiton_name);
if (partition == RT_NULL)
     {
         rt_kprintf("Find partition (%s) failed!
", partiton_name);
         ret = -1;
return ret;
     }


     flash_dev = fal_flash_device_find(partition->flash_name);
if (flash_dev == RT_NULL)
     {
         rt_kprintf("Find flash device (%s) failed!
", partition->flash_name);
         ret = -1;
return ret;
     }


     rt_kprintf("Flash device : %s   "
"Flash size : %dK   
"
"Partition : %s   "
"Partition size: %dK
",
                 partition->flash_name,
                 flash_dev->len/1024,
                 partition->name,
                 partition->len/1024);


/* erase all partition */
     ret = fal_partition_erase_all(partition);
if (ret < 0)
     {
         rt_kprintf("Partition (%s) erase failed!
", partition->name);
         ret = -1;
return ret;
     }
     rt_kprintf("Erase (%s) partition finish!
", partiton_name);


/* read the specified partition and check data */
for (i = 0; i < partition->len;)
     {
         rt_memset(buf, 0x00, BUF_SIZE);


         len = (partition->len - i) > BUF_SIZE ? BUF_SIZE : (partition->len - i);


         ret = fal_partition_read(partition, i, buf, len);
if (ret < 0)
         {
             rt_kprintf("Partition (%s) read failed!
", partition->name);
             ret = -1;
return ret;
         }


for(j = 0; j < len; j++)
         {
if (buf[j] != 0xFF)
             {
                 rt_kprintf("The erase operation did not really succeed!
");
                 ret = -1;
return ret;
             }
         }
         i += len;
     }


/* write 0x00 to the specified partition */
for (i = 0; i < partition->len;)
     {
         rt_memset(buf, 0x00, BUF_SIZE);


         len = (partition->len - i) > BUF_SIZE ? BUF_SIZE : (partition->len - i);


         ret = fal_partition_write(partition, i, buf, len);
if (ret < 0)
         {
             rt_kprintf("Partition (%s) write failed!
", partition->name);
             ret = -1;
return ret;
         }


         i += len;
     }
     rt_kprintf("Write (%s) partition finish! Write size %d(%dK).
", partiton_name, i, i/1024);


/* read the specified partition and check data */
for (i = 0; i < partition->len;)
     {
         rt_memset(buf, 0xFF, BUF_SIZE);


         len = (partition->len - i) > BUF_SIZE ? BUF_SIZE : (partition->len - i);


         ret = fal_partition_read(partition, i, buf, len);
if (ret < 0)
         {
             rt_kprintf("Partition (%s) read failed!
", partition->name);
             ret = -1;
return ret;
         }


for(j = 0; j < len; j++)
         {
if (buf[j] != 0x00)
             {
                 rt_kprintf("The write operation did not really succeed!
");
                 ret = -1;
return ret;
             }
         }


         i += len;
     }


     ret = 0;
return ret;
}


static void fal_sample(void)
{
/* 1- init */
     fal_init();


if (fal_test("font") == 0)
     {
         rt_kprintf("Fal partition (%s) test success!
", "font");
     }
else
     {
         rt_kprintf("Fal partition (%s) test failed!
", "font");
     }


if (fal_test("download") == 0)
     {
         rt_kprintf("Fal partition (%s) test success!
", "download");
     }
else
     {
         rt_kprintf("Fal partition (%s) test failed!
", "download");
     }
}
MSH_CMD_EXPORT(fal_sample, fal sample);


static void fal_elmfat_sample(void)
{
int fd, size;
struct statfs elm_stat;
struct fal_blk_device *blk_dev;
char str[] = "elmfat mount to W25Q flash.", buf[80];


/* fal init */
     fal_init();


/* create block device */
     blk_dev = (struct fal_blk_device *)fal_blk_device_create(FS_PARTITION_NAME);
if(blk_dev == RT_NULL)
         rt_kprintf("Can't create a block device on '%s' partition.
", FS_PARTITION_NAME);
else
         rt_kprintf("Create a block device on the %s partition of flash successful.
", FS_PARTITION_NAME);


/* make a elmfat format filesystem */
if(dfs_mkfs("elm", FS_PARTITION_NAME) == 0)
         rt_kprintf("make elmfat filesystem success.
");


/* mount elmfat file system to FS_PARTITION_NAME */
if(dfs_mount(FS_PARTITION_NAME, "/", "elm", 0, 0) == 0)
         rt_kprintf("elmfat filesystem mount success.
");


/* Get elmfat file system statistics */
if(statfs("/", &elm_stat) == 0)
         rt_kprintf("elmfat filesystem block size: %d, total blocks: %d, free blocks: %d.
",
                     elm_stat.f_bsize, elm_stat.f_blocks, elm_stat.f_bfree);


if(mkdir("/user", 0x777) == 0)
         rt_kprintf("make a directory: '/user'.
");


     rt_kprintf("Write string '%s' to /user/test.txt.
", str);


/* Open the file in create and read-write mode, create the file if it does not exist*/
     fd = open("/user/test.txt", O_WRONLY | O_CREAT);
if (fd >= 0)
     {
if(write(fd, str, sizeof(str)) == sizeof(str))
             rt_kprintf("Write data done.
");


         close(fd);   
     }


/* Open file in read-only mode */
     fd = open("/user/test.txt", O_RDONLY);
if (fd >= 0)
     {
         size = read(fd, buf, sizeof(buf));


         close(fd);


if(size == sizeof(str))
             rt_kprintf("Read data from file test.txt(size: %d): %s 
", size, buf);
     }
}
MSH_CMD_EXPORT_ALIAS(fal_elmfat_sample, fal_elmfat,fal elmfat sample);


static void easyflash_sample(void)
{
/* fal init */
     fal_init();


/* easyflash init */
if(easyflash_init() == EF_NO_ERR)
     {
uint32_t i_boot_times = NULL;
char *c_old_boot_times, c_new_boot_times[11] = {0};


/* get the boot count number from Env */
         c_old_boot_times = ef_get_env("boot_times");
/* get the boot count number failed */
if (c_old_boot_times == RT_NULL)
             c_old_boot_times[0] = '0';


         i_boot_times = atol(c_old_boot_times);
/* boot count +1 */
         i_boot_times ++;
         rt_kprintf("===============================================
");
         rt_kprintf("The system now boot %d times
", i_boot_times);
         rt_kprintf("===============================================
");
/* interger to string */
sprintf(c_new_boot_times, "%d", i_boot_times);
/* set and store the boot count number to Env */
         ef_set_env("boot_times", c_new_boot_times);
         ef_save_env();
     }
}
MSH_CMD_EXPORT(easyflash_sample, easyflash sample);

EasyFlash測試結果

打開串口助手,輸入命令:
  1. msh />easyflash_sample

復制代碼

第一次命令調用:49613442-1615-11ee-962d-dac502259ad0.png第二次RESET開發板后調用:

498e3712-1615-11ee-962d-dac502259ad0.png

結語

至此,FAL分區管理EasyFlash變量管理已經全部介紹完畢了,經歷從移植軟件模擬SPI框架到LPC55S69,到移植過程中不斷遇到的問題,解決問題并提供應用示例,并完成開發日記、開發筆記及應用教學,作者坦言整個過程還是受益良多的。希望大家懷揣著一顆求知及授學之心,共同建設好這個領域!

參考資料:

  • IOT-OS之RT-Thread(十一)--- FAL分區管理與easyflash變量管理

  • RT-Thread文檔中心:FAL組件

本文轉載自:

END

更多恩智浦AI-IoT市場和產品信息,邀您同時關注“NXP客棧”微信公眾號

49c10750-1615-11ee-962d-dac502259ad0.jpg ? ? ?

NXP客棧


恩智浦致力于打造安全的連接和基礎設施解決方案,為智慧生活保駕護航。

長按二維碼,關注我們

恩智浦MCU加油站


這是由恩智浦官方運營的公眾號,著重為您推薦恩智浦MCU的產品信息、開發技巧、教程文檔、培訓課程等內容。

49d4e6b2-1615-11ee-962d-dac502259ad0.jpg ?

長按二維碼,關注我們


原文標題:【LPC55S69】使用FAL分區管理與easyflash變量管理(下集)

文章出處:【微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17889

    瀏覽量

    361711
  • 恩智浦
    +關注

    關注

    14

    文章

    5955

    瀏覽量

    114027

原文標題:【LPC55S69】使用FAL分區管理與easyflash變量管理(下集)

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Linux系統中磁盤分區與掛載詳解

    磁盤分區是將物理硬盤劃分為不同的邏輯部分,每個分區都可以被視為一個獨立的存儲設備。通過磁盤分區,我們可以更好地管理磁盤空間,實現數據的組織和隔離。
    的頭像 發表于 06-17 15:08 ?165次閱讀
    Linux系統中磁盤<b class='flag-5'>分區</b>與掛載詳解

    警用裝備管理系統DW-S304,對警用裝備的全生命周期追蹤管理.

    管理系統
    jf_85364936
    發布于 :2025年06月15日 09:19:54

    部隊裝備管理系統:轉變信息化管理

    管理系統
    北京華盛恒輝科技
    發布于 :2025年05月08日 22:29:31

    戰備器材管理系統DW-S301

    管理系統
    jf_72884372
    發布于 :2025年04月17日 16:28:57

    LPC55 USB端點rx數據無響應是哪里出了問題?

    我使用 LPC55S69 開發了一個 MIDI 鍵盤,USB MIDI 設備基于 SDK 的 USB 串行協議,我相應地對其進行了修改。 在 PC 上可以正確地枚舉為 MIDI 設備,數據傳輸和接收
    發表于 04-09 08:09

    LPC55S69-EVK無法加載安全啟動是怎么回事?

    我已按如下方式配置了我的 LPC55S69-EVK 板: ? 此外,我還配置了: TrustZone disabled image Authentication key: ROT1
    發表于 04-09 06:34

    SwdRead等待response_“LPC55s28” 超時了怎么解決?

    當我嘗試鎖定 MCU LPC55sXX 時,我遇到了以下問題。 我正在按照以下步驟鎖定 MCU: 1.- 在 ISP 模式下配置 MCU。 2.- 將 bin 文件寫入 CFPA。 3.- 將 bin 文件寫入 CMPA。 4.- 驗證 MCU 是否被鎖定并預期出現以下結果: 此問題間歇性發生。
    發表于 04-08 06:52

    使用NXP控制器LPC55S69JBD100E,編程都需要SWD和JTAG嗎?

    1. 在我們的項目中,我們使用 NXP 控制器LPC55S69JBD100E。編程都需要 SWD 和 JTAG 嗎? 2. 您能解釋一下 Flash 編程嗎?
    發表于 03-27 07:23

    使用ConfigTools for USB創建新項目時遇到的問題求解

    使用 ConfigTools for USB 創建新項目時,存在缺少資源的問題,無法添加它: 該問題從 SDK 24.12.00 開始出現。適用于 macOS 的 MCUXpresso。經過 LPC55s69、MCX A153 和 MCX N947 測試。
    發表于 03-26 08:06

    LPC55S69JBD100通過SPI連接到WM02C時,是否支持通過bootloader進行OTA更新?

    該恩智浦-LPC55S69JBD100通過 SPI 連接到 WM02C (nRF7002) 時,是否支持通過 bootloader 進行 OTA 更新?請解釋一下 OTA 更新過程。
    發表于 03-26 07:39

    EVK-LPC55S28的負載上限是多少?

    EVK-LPC55S28 使用晶CX3225GA16000D0PTVCC,在數據表中指定負載上限為 8pf。在 capbank appnote 中,它給出了一個示例,其中具有 8pF 值的 xtal
    發表于 03-26 06:25

    在ISP模式下無法在LPC55S69 EVK上升級應用程序怎么解決?

    我在使用 flash magic 工具升級 LPC55s69 evk 上的固件時看到問題。 在驗證過程中,我看到失敗。 請找到隨附的快照作為參考, 有人可以告訴我,這是怎么回事嗎? 一些其他信息
    發表于 03-26 06:00

    快速搞懂C語言程序內存分區

    在程序運行過程中,操作系統會根據程序的需要,將內存劃分為多個功能不同的區段,以便更高效地管理內存資源和確保程序的穩定運行。不同的內存區段負責存儲不同類型的數據和代碼,涵蓋了從程序指令、全局變量
    的頭像 發表于 03-14 17:37 ?561次閱讀
    快速搞懂C語言程序內存<b class='flag-5'>分區</b>!

    消防物證管理系統 DW-S404實現消防物證智能化管理

    一、系統概述 智慧消防物證管理系統DW-S404系統旨在借助現代信息技術,達成消防物證管理的高效化、安全化及智能化管理目標。該系統運用物聯網、大數據、云計算等先進技術,實現對消防物證從
    的頭像 發表于 12-07 17:45 ?419次閱讀
    消防物證<b class='flag-5'>管理</b>系統 DW-<b class='flag-5'>S</b>404實現消防物證智能化<b class='flag-5'>管理</b>

    使用FAL分區管理easyflash變量管理

    1.FAL組件1.1什么是FALFAL(FlashAbstractionLayer)Flash抽象層,是對Flash及基于Flash的分區進行管理、操作的抽象層,對上層統一了Flash及分區
    的頭像 發表于 10-01 08:10 ?1753次閱讀
    使用<b class='flag-5'>FAL</b><b class='flag-5'>分區</b><b class='flag-5'>管理</b>與<b class='flag-5'>easyflash</b><b class='flag-5'>變量</b><b class='flag-5'>管理</b>
    主站蜘蛛池模板: 男人午夜视频在线观看 | 色骚综合| 户外露出精品视频国产 | 全免费一级毛片在线播放 | 夜夜se| 午夜黄色毛片 | 97黄网| 成人看的午夜免费毛片 | 日本不卡在线观看免费v | 中文字幕天堂在线 | 五月婷婷综合色 | 日本三级黄色 | 四虎影院免费观看视频 | 国产乱码精品一区二区 | 天堂网2021天堂手机版丶 | 特黄特黄特色大片免费观看 | 天天色天天搞 | 亚洲欧美一区二区三区四区 | 性xxxx奶大欧美高清 | 美国69bjfree18vide视频 | xxx69日本hd| 天堂男人网 | 免费人成在线观看视频色 | 日本三级免费 | 加勒比一区二区 | 看视频免费网址 | 国产精品久久久久久久9999 | 免费人成网址在线观看国内 | 91久久天天躁狠狠躁夜夜 | 国内精品91久久久久 | 永久免费的啪啪免费的网址 | 黄色尤物 | 就操| 国产精品久久久久久免费播放 | 色多多·com| 日本www色视频成人免费网站 | 天天射网站 | 精品久久久久久国产免费了 | 亚洲一区二区三区免费观看 | 国产福利小视频在线观看 | 91大神在线观看视频 |