AiPi-Eyes-S1是安信可開源團隊專門為Ai-M61-32S設計的一款開發板,支持WiFi6、BLE5.3。所搭載的Ai-M61-32S 模組具有豐富的外設接口,具體包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太網 (EMAC)、SD/MMC(SDH)、SPI、UART、I2C、I2S、PWM、GPDAC、GPADC、ACOMP 和 GPIO 等。
AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預留TF卡座,并且引出USB接口,可接入USB攝像頭。
從零開始學習小安派:
1、零基礎開發小安派-Eyes-S1【入門篇】——初識小安派-Eyes-S1
2、零基礎開發小安派-Eyes-S1【入門篇】——安裝VMware與Ubuntu
3、入門篇:零基礎開發小安派-Eyes-S1——新建工程并燒錄調試
4、零基礎開發小安派-Eyes-S1入門篇——Win下SSH連接Linux
5、零基礎開發小安派-Eyes-S1【入門篇】——Samba共享文件夾
6、零基礎開發小安派-Eyes-S1【入門篇】——工程文件架構
7、零基礎開發小安派-Eyes-S1【外設篇】——GPIO 輸入輸出
8、零基礎開發小安派-Eyes-S1【外設篇】——GPIO中斷編程
9、零基礎開發小安派-Eyes-S1【外設篇】——PWM
10、零基礎開發小安派-Eyes-S1【外設篇】——UART
11、零基礎開發小安派-Eyes-S1【外設篇】——I2C
12、零基礎開發小安派-Eyes-S1【外設篇】——ADC
Flash 簡稱閃存,它的特點是擦除和編程速度快,單片機的程序一般都是存儲在一定空間內中進行運行。在 C 語言中,程序分為代碼段、常量區、靜態數據區(BSS 段,數據段)、棧、堆五個部分組成。內部空間就分為 ROM 和 RAM,都是可以用來存儲內容,區別在于:
ROM 的存儲特性比較穩定,很久以前它不可擦除,所以只可讀不可寫,FLASH 就是一種特殊的 ROM,可擦除可讀可寫,在掉電后不丟失。RAM 的存儲特性較不穩定,但讀寫速度快,掉電后丟失。
它們的差異如下:
總結:FLASH 也就是 ROM,掉電后不丟失,讀寫速度較慢,空間大,可以理解未電腦上的硬盤。RAM 速度快,掉電后丟失,可以理解未電腦上的內存。
一、了解小安派-Eyes-S1 的存儲
618FLASH 物理上的地址起始地址是 0XA0000000。M61-32S 的 FLASH 大小是 8M。在數據手冊中可以看到所有的模塊地址映射,包括外設的地址。
在這之前需要了解分區表的概念,分區表就是劃分 FLASH 的清單,將 FLASH 劃分為多個不同功能區域用于其它功能。在操作 FLASH 時得看一下分區表,查看哪些地址可以使用。在 SDK 中有 4M 的分區表,里面規劃了一些分區的命名,起始地址和大小,這個目錄下找到。
AiPi-Open-Kits/aithinker_Ai-M6X_SDK/bsp/board/bl616dk/config/partition_cfg_4M.toml,在參與編譯時會在工程文件夾下的 build/build_out 中生成 partition.bin。我們在 flash_prog_cfg.ini 中可以看到,常見的有 BOOT2 固件,filedir:固件路徑,address:地址,boot2 必須使用 0 地址。而 partition 表示分區表固件,address 是根據 partition_cfg_4M.toml 指定。而 FW 則表示需要燒錄的應用固件,FW 可以在 partition_cfg_4M.toml 中看到。
我們可以添加一樣的“分區”,創建屬于自己的名字,也可以在分區表中查看已有的分區使用。當然,建議還是使用原廠分配的分區表。
1.bflb_flash_init
說明: flash 初始化,自動識別支持的 flash 并重新配置 flash 的參數。如果返回錯誤,必須停止運行代碼。
int bflb_flash_init(void);
2.bflb_flash_get_jedec_id
說明: 獲取 flash jedec id。
uint32_t bflb_flash_get_jedec_id(void);
3.bflb_flash_get_cfg
說明: 獲取 flash 配置。
void bflb_flash_get_cfg(uint8_t **cfg_addr, uint32_t *len);
4.bflb_flash_set_iomode
說明: 設置 flash IO 工作模式。
void bflb_flash_set_iomode(uint8_t iomode);
可填入以下幾種模式:
#define FLASH_IOMODE_NIO 0
#define FLASH_IOMODE_DO 1
#define FLASH_IOMODE_QO 2
#define FLASH_IOMODE_DIO 3
#define FLASH_IOMODE_QIO 4
5.bflb_flash_get_image_offset
說明: 獲取代碼 xip 虛擬地址實際所在的 flash 物理地址。
uint32_tbflb_flash_get_image_offset(void);
6.bflb_flash_erase
說明: flash 扇區擦除。len 為擦除的長度,需要為 4096 倍數,假設 addr 為 0 , len 為 4096,則擦除范圍為 0 ~ 4095。
intbflb_flash_erase(uint32_t addr,uint32_t len);
7.bflb_flash_write
說明:獲取代碼 xip 虛擬地址實際所在的 flash 物理地址。
intbflb_flash_write(uint32_t addr, uint8_t *data,uint32_t len);
8.bflb_flash_read
說明: 獲取代碼 xip 虛擬地址實際所在的 flash 物理地址。
intbflb_flash_read(uint32_t addr,uint8_t *data,uint32_t len);
9.bflb_flash_aes_init
說明: 配置某一段 flash 區域進行硬件 aes 解密,能夠通過 xip 直接讀取解密后的內容。
voidbflb_flash_aes_init(struct bflb_flash_aes_config_s *config);
10.bflb_flash_aes_enable
說明: 使能 flash aes 解密。
voidbflb_flash_aes_enable(void);
11.bflb_flash_aes_disable
說明: 關閉 flash aes 解密。
voidbflb_flash_aes_disable(void);
二、簡單示例——上電后讀取 flash 內的值并打印
1.首次寫入
#include "bflb_flash.h"
#include "board.h"
#include "string.h"
//頭文件
#define FLASH_RW_START_ADDR 0x3F3000
//宏定義讀寫起始地址,查看分區表可以看出這是“DATA”所在分區
static uint8_t write_buf[16];
static uint8_t read_buf[16];
//定義讀寫緩存數組
int main(void)
{
uint32_t i;
board_init();
//板子初始化,包括了bflb_flash_init
memset(write_buf, 0, sizeof(write_buf));
memset(read_buf, 0, sizeof(read_buf));
//清空緩存數組
strcpy(write_buf,"HelloWorld!");
//填寫write數組內容
/* erase flash */
bflb_flash_erase(FLASH_RW_START_ADDR,sizeof(write_buf));
//擦除緩存數組大小,從起始地址開始
/* read flash data */
bflb_flash_read(FLASH_RW_START_ADDR, read_buf, sizeof(read_buf));
//讀取flash內的內容緩存到read數組里
for (i = 0; i < sizeof(read_buf); i++) {
if (read_buf[i] != write_buf[i]) {
printf("rnflash read fail at %d, expect:%d but get %d", i, write_buf[i], read_buf[i]);
}
}
//for循環校驗,當write和read內容不一致時會打印
/* write flash data */
bflb_flash_write(FLASH_RW_START_ADDR, write_buf, sizeof(write_buf));
//將write內容寫入flash中
memset(read_buf, 0, sizeof(read_buf));
/* read flash data */
bflb_flash_read(FLASH_RW_START_ADDR, read_buf, sizeof(read_buf));
printf("rn%s",read_buf);
while (1) {
}
}
第一次運行程序效果:在擦除了后讀出來的 ASCII 碼為 255
2.二次讀取,查看上電打印信息
#include "bflb_flash.h"
#include "board.h"
#include "string.h"
#define FLASH_RW_START_ADDR 0x3F3000
static uint8_t write_buf[16];
static uint8_t read_buf[16];
int main(void)
{
uint32_t i;
board_init();
memset(write_buf, 0, sizeof(write_buf));
memset(read_buf, 0, sizeof(read_buf));
strcpy(write_buf,"HelloWorld!");
/* read flash data */
bflb_flash_read(FLASH_RW_START_ADDR, read_buf, sizeof(read_buf));
for (i = 0; i < sizeof(read_buf); i++) {
if (read_buf[i] != write_buf[i]) {
printf("rnflash read fail at %d, expect:%d but get %d", i, write_buf[i], read_buf[i]);
}
}
printf("rn%s",read_buf);
while (1) {
}
}
二次讀取后的運行效果:校驗成功,只讀取出 hellowold
三、使用 easyflash 庫,匹配字段
在 AiPi-SCP_SmartCtrl 工程中的 components 下,有 easy_flash 庫,使用 easy_flash 更加方便快捷,只需要定義字段,第一個參數填入字段,第二個參數填入值,即可通過匹配字段的方式將值與字段匹配上。添加庫的方式如下:
1.將 easy_flash 的文件夾復制下來,放到模板工程中,這里使用 Project_basic 的模板工程,記得修改工程名。
2.在 CMakeLists.txt 下的添加 easyflash 的庫文件。
3.在 proj.conf 下打開 easyflash 控件。
4.使用方法,只需要在調用 flash_erase_set 時填入兩個參數,第一個參數為匹配的字段,一般由宏定義的字符串常量。第二個參數為值,也就是需要存儲的值。這樣在 flash 中就是由常駐的字段 + 值組成,在獲取值時可以通過“字段‘來尋找相應的值。通過 flash_get_data 的方式,傳入查找的字段和長度,得到存儲的值。
5.easyflash 使用的“PSM”分區,大小是 32K,起始地址是 0X3E9000。在這里面我們可以存放一些標志位,或者是類似 wifi 名稱密碼、AP 名稱密碼等關鍵信息,使用起來也方便,通過匹配字段的方式將關鍵信息填入所需任務。如在 AT 指令中將 SSID 和 PASS 通過第三個參數 0 或 1 選擇是否存入 flash 中。方便實現開機自動連接 wifi 且可通過指令修改 wifi 等操作。
審核編輯 黃宇
-
FlaSh
+關注
關注
10文章
1638瀏覽量
148160 -
接口
+關注
關注
33文章
8625瀏覽量
151351
發布評論請先 登錄
相關推薦
用小安派 DSL做一個天氣站
![用<b class='flag-5'>小安</b><b class='flag-5'>派</b> DSL做一個天氣站](https://file1.elecfans.com//web3/M00/05/06/wKgZO2d7l-KAIy_KAADgnkgKEGg555.jpg)
零基礎開發小安派-Eyes-S1【進階篇】——初識 LVGL 并搭建最小工程
![<b class='flag-5'>零基</b>礎<b class='flag-5'>開發</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b>【進階<b class='flag-5'>篇</b>】——初識 LVGL 并搭建最小工程](https://file1.elecfans.com//web3/M00/05/05/wKgZO2d7kMSAJAFJAACo0k1Ogbo923.jpg)
零基礎開發小安派-Eyes-S1——初識LVGL并搭建最小工程
零基礎開發小安派-Eyes-S1 外設篇——DAC
![<b class='flag-5'>零基</b>礎<b class='flag-5'>開發</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b> <b class='flag-5'>外設</b><b class='flag-5'>篇</b>——DAC](https://file1.elecfans.com//web3/M00/03/FA/wKgZPGduFxGAF2vbAAAmHgnYQCc658.jpg)
零基礎開發小安派-Eyes-S1外設篇——I2S
![<b class='flag-5'>零基</b>礎<b class='flag-5'>開發</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b><b class='flag-5'>外設</b><b class='flag-5'>篇</b>——I2<b class='flag-5'>S</b>](https://file1.elecfans.com//web3/M00/02/46/wKgZO2dcBjCAGEAkAAA8xj7khw009.webp)
電子DIY作品 小安派R1做個86盒中控
![電子DIY作品 <b class='flag-5'>小安</b><b class='flag-5'>派</b>R<b class='flag-5'>1</b>做個86盒中控](https://file1.elecfans.com//web3/M00/01/2E/wKgZO2dRSVaATaozAABOxwX0p4I002.jpg)
零基礎開發小安派-Eyes-S1 外設篇 ——I2C
![<b class='flag-5'>零基</b>礎<b class='flag-5'>開發</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b> <b class='flag-5'>外設</b><b class='flag-5'>篇</b> ——I2C](https://file1.elecfans.com//web3/M00/00/2A/wKgZO2dG2qSAcdmuAAA7_hcCOyM118.jpg)
零基礎開發小安派-Eyes-S1外設篇——GPIO中斷編程
![<b class='flag-5'>零基</b>礎<b class='flag-5'>開發</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b><b class='flag-5'>外設</b><b class='flag-5'>篇</b>——GPIO中斷編程](https://file1.elecfans.com//web1/M00/F3/E2/wKgZoWcghwuAHTB6AAB12Pu7oeU039.jpg)
零基礎開發小安派-Eyes-S1外設篇——GPIO 輸入輸出
![<b class='flag-5'>零基</b>礎<b class='flag-5'>開發</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b><b class='flag-5'>外設</b><b class='flag-5'>篇</b>——GPIO 輸入輸出](https://file1.elecfans.com//web2/M00/0B/1B/wKgaomcbMaOAXRzEAACRGM3g1mU839.jpg)
開發教程 零基礎開發小安派-Eyes-S1入門篇——Win下SSH連接Linux
![<b class='flag-5'>開發</b>教程 <b class='flag-5'>零基</b>礎<b class='flag-5'>開發</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b>入門<b class='flag-5'>篇</b>——Win下SSH連接Linux](https://file1.elecfans.com//web2/M00/07/B3/wKgZombyXJKAMw-RAADfaMZaDdI93.jpeg)
功德+1,用小安派-Eyes-S1做一個電子木魚
![功德+<b class='flag-5'>1</b>,用<b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b>做一個電子木魚](https://file1.elecfans.com//web2/M00/BC/CA/wKgZomWmIxiAL2TrAAEzF9RQ8aE018.png)
如何用小安派-Eyes-S1做一個電子木魚?
![如何用<b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b>做一個電子木魚?](https://file1.elecfans.com/web2/M00/BD/59/wKgaomWiOcWAftolAAAMQk1Tt-s413.png)
評論