AiPi-Eyes-S1是安信可開(kāi)源團(tuán)隊(duì)專門為Ai-M61-32S設(shè)計(jì)的一款開(kāi)發(fā)板,支持WiFi6、BLE5.3。所搭載的Ai-M61-32S 模組具有豐富的外設(shè)接口,具體包括 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音頻編解碼芯片以及預(yù)留TF卡座,并且引出USB接口,可接入U(xiǎn)SB攝像頭。
從零開(kāi)始學(xué)習(xí)小安派:
1、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【入門篇】——初識(shí)小安派-Eyes-S1
2、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【入門篇】——安裝VMware與Ubuntu
3、入門篇:零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1——新建工程并燒錄調(diào)試
4、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1入門篇——Win下SSH連接Linux
5、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【入門篇】——Samba共享文件夾
6、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【入門篇】——工程文件架構(gòu)
7、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【外設(shè)篇】——GPIO 輸入輸出
8、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【外設(shè)篇】——GPIO中斷編程
9、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【外設(shè)篇】——PWM
10、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【外設(shè)篇】——UART
11、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【外設(shè)篇】——I2C
12、零基礎(chǔ)開(kāi)發(fā)小安派-Eyes-S1【外設(shè)篇】——ADC
Flash 簡(jiǎn)稱閃存,它的特點(diǎn)是擦除和編程速度快,單片機(jī)的程序一般都是存儲(chǔ)在一定空間內(nèi)中進(jìn)行運(yùn)行。在 C 語(yǔ)言中,程序分為代碼段、常量區(qū)、靜態(tài)數(shù)據(jù)區(qū)(BSS 段,數(shù)據(jù)段)、棧、堆五個(gè)部分組成。內(nèi)部空間就分為 ROM 和 RAM,都是可以用來(lái)存儲(chǔ)內(nèi)容,區(qū)別在于:
ROM 的存儲(chǔ)特性比較穩(wěn)定,很久以前它不可擦除,所以只可讀不可寫,F(xiàn)LASH 就是一種特殊的 ROM,可擦除可讀可寫,在掉電后不丟失。RAM 的存儲(chǔ)特性較不穩(wěn)定,但讀寫速度快,掉電后丟失。
它們的差異如下:
總結(jié):FLASH 也就是 ROM,掉電后不丟失,讀寫速度較慢,空間大,可以理解未電腦上的硬盤。RAM 速度快,掉電后丟失,可以理解未電腦上的內(nèi)存。
一、了解小安派-Eyes-S1 的存儲(chǔ)
618FLASH 物理上的地址起始地址是 0XA0000000。M61-32S 的 FLASH 大小是 8M。在數(shù)據(jù)手冊(cè)中可以看到所有的模塊地址映射,包括外設(shè)的地址。
在這之前需要了解分區(qū)表的概念,分區(qū)表就是劃分 FLASH 的清單,將 FLASH 劃分為多個(gè)不同功能區(qū)域用于其它功能。在操作 FLASH 時(shí)得看一下分區(qū)表,查看哪些地址可以使用。在 SDK 中有 4M 的分區(qū)表,里面規(guī)劃了一些分區(qū)的命名,起始地址和大小,這個(gè)目錄下找到。
AiPi-Open-Kits/aithinker_Ai-M6X_SDK/bsp/board/bl616dk/config/partition_cfg_4M.toml,在參與編譯時(shí)會(huì)在工程文件夾下的 build/build_out 中生成 partition.bin。我們?cè)?flash_prog_cfg.ini 中可以看到,常見(jiàn)的有 BOOT2 固件,filedir:固件路徑,address:地址,boot2 必須使用 0 地址。而 partition 表示分區(qū)表固件,address 是根據(jù) partition_cfg_4M.toml 指定。而 FW 則表示需要燒錄的應(yīng)用固件,F(xiàn)W 可以在 partition_cfg_4M.toml 中看到。
我們可以添加一樣的“分區(qū)”,創(chuàng)建屬于自己的名字,也可以在分區(qū)表中查看已有的分區(qū)使用。當(dāng)然,建議還是使用原廠分配的分區(qū)表。
1.bflb_flash_init
說(shuō)明: flash 初始化,自動(dòng)識(shí)別支持的 flash 并重新配置 flash 的參數(shù)。如果返回錯(cuò)誤,必須停止運(yùn)行代碼。
int bflb_flash_init(void);
2.bflb_flash_get_jedec_id
說(shuō)明: 獲取 flash jedec id。
uint32_t bflb_flash_get_jedec_id(void);
3.bflb_flash_get_cfg
說(shuō)明: 獲取 flash 配置。
void bflb_flash_get_cfg(uint8_t **cfg_addr, uint32_t *len);
4.bflb_flash_set_iomode
說(shuō)明: 設(shè)置 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
說(shuō)明: 獲取代碼 xip 虛擬地址實(shí)際所在的 flash 物理地址。
uint32_tbflb_flash_get_image_offset(void);
6.bflb_flash_erase
說(shuō)明: flash 扇區(qū)擦除。len 為擦除的長(zhǎng)度,需要為 4096 倍數(shù),假設(shè) addr 為 0 , len 為 4096,則擦除范圍為 0 ~ 4095。
intbflb_flash_erase(uint32_t addr,uint32_t len);
7.bflb_flash_write
說(shuō)明:獲取代碼 xip 虛擬地址實(shí)際所在的 flash 物理地址。
intbflb_flash_write(uint32_t addr, uint8_t *data,uint32_t len);
8.bflb_flash_read
說(shuō)明: 獲取代碼 xip 虛擬地址實(shí)際所在的 flash 物理地址。
intbflb_flash_read(uint32_t addr,uint8_t *data,uint32_t len);
9.bflb_flash_aes_init
說(shuō)明: 配置某一段 flash 區(qū)域進(jìn)行硬件 aes 解密,能夠通過(guò) xip 直接讀取解密后的內(nèi)容。
voidbflb_flash_aes_init(struct bflb_flash_aes_config_s *config);
10.bflb_flash_aes_enable
說(shuō)明: 使能 flash aes 解密。
voidbflb_flash_aes_enable(void);
11.bflb_flash_aes_disable
說(shuō)明: 關(guān)閉 flash aes 解密。
voidbflb_flash_aes_disable(void);
二、簡(jiǎn)單示例——上電后讀取 flash 內(nèi)的值并打印
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ù)組內(nèi)容
/* erase flash */
bflb_flash_erase(FLASH_RW_START_ADDR,sizeof(write_buf));
//擦除緩存數(shù)組大小,從起始地址開(kāi)始
/* read flash data */
bflb_flash_read(FLASH_RW_START_ADDR, read_buf, sizeof(read_buf));
//讀取flash內(nèi)的內(nèi)容緩存到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)校驗(yàn),當(dāng)write和read內(nèi)容不一致時(shí)會(huì)打印
/* write flash data */
bflb_flash_write(FLASH_RW_START_ADDR, write_buf, sizeof(write_buf));
//將write內(nèi)容寫入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) {
}
}
第一次運(yùn)行程序效果:在擦除了后讀出來(lái)的 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) {
}
}
二次讀取后的運(yùn)行效果:校驗(yàn)成功,只讀取出 hellowold
三、使用 easyflash 庫(kù),匹配字段
在 AiPi-SCP_SmartCtrl 工程中的 components 下,有 easy_flash 庫(kù),使用 easy_flash 更加方便快捷,只需要定義字段,第一個(gè)參數(shù)填入字段,第二個(gè)參數(shù)填入值,即可通過(guò)匹配字段的方式將值與字段匹配上。添加庫(kù)的方式如下:
1.將 easy_flash 的文件夾復(fù)制下來(lái),放到模板工程中,這里使用 Project_basic 的模板工程,記得修改工程名。
2.在 CMakeLists.txt 下的添加 easyflash 的庫(kù)文件。
3.在 proj.conf 下打開(kāi) easyflash 控件。
4.使用方法,只需要在調(diào)用 flash_erase_set 時(shí)填入兩個(gè)參數(shù),第一個(gè)參數(shù)為匹配的字段,一般由宏定義的字符串常量。第二個(gè)參數(shù)為值,也就是需要存儲(chǔ)的值。這樣在 flash 中就是由常駐的字段 + 值組成,在獲取值時(shí)可以通過(guò)“字段‘來(lái)尋找相應(yīng)的值。通過(guò) flash_get_data 的方式,傳入查找的字段和長(zhǎng)度,得到存儲(chǔ)的值。
5.easyflash 使用的“PSM”分區(qū),大小是 32K,起始地址是 0X3E9000。在這里面我們可以存放一些標(biāo)志位,或者是類似 wifi 名稱密碼、AP 名稱密碼等關(guān)鍵信息,使用起來(lái)也方便,通過(guò)匹配字段的方式將關(guān)鍵信息填入所需任務(wù)。如在 AT 指令中將 SSID 和 PASS 通過(guò)第三個(gè)參數(shù) 0 或 1 選擇是否存入 flash 中。方便實(shí)現(xiàn)開(kāi)機(jī)自動(dòng)連接 wifi 且可通過(guò)指令修改 wifi 等操作。
審核編輯 黃宇
-
FlaSh
+關(guān)注
關(guān)注
10文章
1635瀏覽量
148023 -
接口
+關(guān)注
關(guān)注
33文章
8598瀏覽量
151156
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論