AiPi-Eyes-S1是安信可開源團隊專門為Ai-M61-32S設計的一款開發(fā)板,支持WiFi6、BLE5.3。所搭載的Ai-M61-32S 模組具有豐富的外設接口,具體包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太網(wǎng) (EMAC)、SD/MMC(SDH)、SPI、UART、I2C、I2S、PWM、GPDAC、GPADC、ACOMP 和 GPIO 等。
AiPi-Eyes-S1集成了SPI屏幕接口,DVP攝像頭接口,外置ES8388音頻編解碼芯片以及預留TF卡座,并且引出USB接口,可接入USB攝像頭。
從零開始學習小安派:
1、零基礎開發(fā)小安派-Eyes-S1【入門篇】——初識小安派-Eyes-S1
2、零基礎開發(fā)小安派-Eyes-S1【入門篇】——安裝VMware與Ubuntu
3、入門篇:零基礎開發(fā)小安派-Eyes-S1——新建工程并燒錄調試
4、零基礎開發(fā)小安派-Eyes-S1入門篇——Win下SSH連接Linux
5、零基礎開發(fā)小安派-Eyes-S1【入門篇】——Samba共享文件夾
6、零基礎開發(fā)小安派-Eyes-S1【入門篇】——工程文件架構
7、零基礎開發(fā)小安派-Eyes-S1【外設篇】——GPIO 輸入輸出
8、零基礎開發(fā)小安派-Eyes-S1【外設篇】——GPIO中斷編程
9、零基礎開發(fā)小安派-Eyes-S1【外設篇】——PWM
10、零基礎開發(fā)小安派-Eyes-S1【外設篇】——UART
11、零基礎開發(fā)小安派-Eyes-S1【外設篇】——I2C
12、零基礎開發(fā)小安派-Eyes-S1【外設篇】——ADC
Flash 簡稱閃存,它的特點是擦除和編程速度快,單片機的程序一般都是存儲在一定空間內中進行運行。在 C 語言中,程序分為代碼段、常量區(qū)、靜態(tài)數(shù)據(jù)區(qū)(BSS 段,數(shù)據(jù)段)、棧、堆五個部分組成。內部空間就分為 ROM 和 RAM,都是可以用來存儲內容,區(qū)別在于:
ROM 的存儲特性比較穩(wěn)定,很久以前它不可擦除,所以只可讀不可寫,F(xiàn)LASH 就是一種特殊的 ROM,可擦除可讀可寫,在掉電后不丟失。RAM 的存儲特性較不穩(wěn)定,但讀寫速度快,掉電后丟失。
它們的差異如下:
總結:FLASH 也就是 ROM,掉電后不丟失,讀寫速度較慢,空間大,可以理解未電腦上的硬盤。RAM 速度快,掉電后丟失,可以理解未電腦上的內存。
一、了解小安派-Eyes-S1 的存儲
618FLASH 物理上的地址起始地址是 0XA0000000。M61-32S 的 FLASH 大小是 8M。在數(shù)據(jù)手冊中可以看到所有的模塊地址映射,包括外設的地址。
在這之前需要了解分區(qū)表的概念,分區(qū)表就是劃分 FLASH 的清單,將 FLASH 劃分為多個不同功能區(qū)域用于其它功能。在操作 FLASH 時得看一下分區(qū)表,查看哪些地址可以使用。在 SDK 中有 4M 的分區(qū)表,里面規(guī)劃了一些分區(qū)的命名,起始地址和大小,這個目錄下找到。
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 表示分區(qū)表固件,address 是根據(jù) partition_cfg_4M.toml 指定。而 FW 則表示需要燒錄的應用固件,F(xiàn)W 可以在 partition_cfg_4M.toml 中看到。
我們可以添加一樣的“分區(qū)”,創(chuàng)建屬于自己的名字,也可以在分區(qū)表中查看已有的分區(qū)使用。當然,建議還是使用原廠分配的分區(qū)表。
1.bflb_flash_init
說明: flash 初始化,自動識別支持的 flash 并重新配置 flash 的參數(shù)。如果返回錯誤,必須停止運行代碼。
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 扇區(qū)擦除。len 為擦除的長度,需要為 4096 倍數(shù),假設 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 區(qū)域進行硬件 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
//宏定義讀寫起始地址,查看分區(qū)表可以看出這是“DATA”所在分區(qū)
static uint8_t write_buf[16];
static uint8_t read_buf[16];
//定義讀寫緩存數(shù)組
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));
//清空緩存數(shù)組
strcpy(write_buf,"HelloWorld!");
//填寫write數(shù)組內容
/* erase flash */
bflb_flash_erase(FLASH_RW_START_ADDR,sizeof(write_buf));
//擦除緩存數(shù)組大小,從起始地址開始
/* read flash data */
bflb_flash_read(FLASH_RW_START_ADDR, read_buf, sizeof(read_buf));
//讀取flash內的內容緩存到read數(shù)組里
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循環(huán)校驗,當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 更加方便快捷,只需要定義字段,第一個參數(shù)填入字段,第二個參數(shù)填入值,即可通過匹配字段的方式將值與字段匹配上。添加庫的方式如下:
1.將 easy_flash 的文件夾復制下來,放到模板工程中,這里使用 Project_basic 的模板工程,記得修改工程名。
2.在 CMakeLists.txt 下的添加 easyflash 的庫文件。
3.在 proj.conf 下打開 easyflash 控件。
4.使用方法,只需要在調用 flash_erase_set 時填入兩個參數(shù),第一個參數(shù)為匹配的字段,一般由宏定義的字符串常量。第二個參數(shù)為值,也就是需要存儲的值。這樣在 flash 中就是由常駐的字段 + 值組成,在獲取值時可以通過“字段‘來尋找相應的值。通過 flash_get_data 的方式,傳入查找的字段和長度,得到存儲的值。
5.easyflash 使用的“PSM”分區(qū),大小是 32K,起始地址是 0X3E9000。在這里面我們可以存放一些標志位,或者是類似 wifi 名稱密碼、AP 名稱密碼等關鍵信息,使用起來也方便,通過匹配字段的方式將關鍵信息填入所需任務。如在 AT 指令中將 SSID 和 PASS 通過第三個參數(shù) 0 或 1 選擇是否存入 flash 中。方便實現(xiàn)開機自動連接 wifi 且可通過指令修改 wifi 等操作。
審核編輯 黃宇
-
FlaSh
+關注
關注
10文章
1633瀏覽量
147939 -
接口
+關注
關注
33文章
8575瀏覽量
151014
發(fā)布評論請先 登錄
相關推薦
評論