0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

零基础开发小安派-Eyes-S1【外设篇】——FLASH

AIoT行业洞察 来源:AIoT行业洞察 作者:AIoT行业洞察 2024-12-05 14:31 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

AiPi-Eyes-S1是安信可开源团队专门为Ai-M61-32S设计的一款开发板,支持WiFi6、BLE5.3。所搭载的Ai-M61-32S 模组具有丰富的外设接口,具体包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太网 (EMAC)、SD/MMC(SDH)、SPI、UARTI2C、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 段,数据段)、栈、堆五个部分组成。内部空间就分为 ROMRAM,都是可以用来存储内容,区别在于:

ROM 的存储特性比较稳定,很久以前它不可擦除,所以只可读不可写,FLASH 就是一种特殊的 ROM,可擦除可读可写,在掉电后不丢失。RAM 的存储特性较不稳定,但读写速度快,掉电后丢失。

它们的差异如下:

wKgZO2dRSK2AJjzUAACvSBXB5k0411.jpg

总结: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 中看到。

wKgZPGdRSK6ABhb4AABP5NoUMfI556.jpg

我们可以添加一样的“分区”,创建属于自己的名字,也可以在分区表中查看已有的分区使用。当然,建议还是使用原厂分配的分区表。

1.bflb_flash_init

说明: flash 初始化,自动识别支持的 flash 并重新配置 flash 的参数。如果返回错误,必须停止运行代码。

int bflb_flash_init(void);

wKgZPGdRSK6Aa8jxAAAms55OaAI773.jpg

2.bflb_flash_get_jedec_id

说明: 获取 flash jedec id。

uint32_t bflb_flash_get_jedec_id(void);

wKgZO2dRSK-AahXxAAAjC6AKz1s840.jpg

3.bflb_flash_get_cfg

说明: 获取 flash 配置。

void bflb_flash_get_cfg(uint8_t **cfg_addr, uint32_t *len);

wKgZPGdRSK-AFsc7AAAuZmpgOEM504.jpg

4.bflb_flash_set_iomode

说明: 设置 flash IO 工作模式。

void bflb_flash_set_iomode(uint8_t iomode);

wKgZO2dRSK-AJnhrAAAMyU5fSCk660.jpg

可填入以下几种模式:

#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);

wKgZPGdRSLCANER7AAAjQdbsQZs988.jpg

6.bflb_flash_erase

说明: flash 扇区擦除。len 为擦除的长度,需要为 4096 倍数,假设 addr 为 0 , len 为 4096,则擦除范围为 0 ~ 4095。

intbflb_flash_erase(uint32_t addr,uint32_t len);

wKgZO2dRSLCAOWHeAAA9B6WAqqY026.jpg

7.bflb_flash_write

说明:获取代码 xip 虚拟地址实际所在的 flash 物理地址。

intbflb_flash_write(uint32_t addr, uint8_t *data,uint32_t len);

wKgZPGdRSLGAQXVVAABGgES7ZG4055.jpg

8.bflb_flash_read

说明: 获取代码 xip 虚拟地址实际所在的 flash 物理地址。

intbflb_flash_read(uint32_t addr,uint8_t *data,uint32_t len);

wKgZO2dRSLGAOlEZAABEExxccus377.jpg

9.bflb_flash_aes_init

说明: 配置某一段 flash 区域进行硬件 aes 解密,能够通过 xip 直接读取解密后的内容。

voidbflb_flash_aes_init(struct bflb_flash_aes_config_s *config);

wKgZPGdRSLGAV6XiAAAiuwZE-ik189.jpg

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

wKgZO2dRSLKAKsw5AAC2HkQ3oII128.jpg

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

wKgZPGdRSLKAfwptAABoMwcb7jE938.jpg

三、使用 easyflash 库,匹配字段

在 AiPi-SCP_SmartCtrl 工程中的 components 下,有 easy_flash 库,使用 easy_flash 更加方便快捷,只需要定义字段,第一个参数填入字段,第二个参数填入值,即可通过匹配字段的方式将值与字段匹配上。添加库的方式如下:

1.将 easy_flash 的文件夹复制下来,放到模板工程中,这里使用 Project_basic 的模板工程,记得修改工程名。

wKgZO2dRSLOAKj0VAACRfkiO1nk381.jpg

2.在 CMakeLists.txt 下的添加 easyflash 的库文件。

wKgZPGdRSLOAHystAADtqdw2-gM135.jpg

3.在 proj.conf 下打开 easyflash 控件。

wKgZO2dRSLSASdhDAACoe7Jb85E340.jpg

4.使用方法,只需要在调用 flash_erase_set 时填入两个参数,第一个参数为匹配的字段,一般由宏定义的字符串常量。第二个参数为值,也就是需要存储的值。这样在 flash 中就是由常驻的字段 + 值组成,在获取值时可以通过“字段‘来寻找相应的值。通过 flash_get_data 的方式,传入查找的字段和长度,得到存储的值。

wKgZPGdRSLSAUm3QAAAOnFkP1pU378.jpg

wKgZO2dRSLSATLdmAAAW7brbccw584.jpg

wKgZPGdRSLWAY3MwAAAYHXYixQM488.jpg

5.easyflash 使用的“PSM”分区,大小是 32K,起始地址是 0X3E9000。在这里面我们可以存放一些标志位,或者是类似 wifi 名称密码、AP 名称密码等关键信息,使用起来也方便,通过匹配字段的方式将关键信息填入所需任务。如在 AT 指令中将 SSID 和 PASS 通过第三个参数 0 或 1 选择是否存入 flash 中。方便实现开机自动连接 wifi 且可通过指令修改 wifi 等操作。

wKgZO2dRSLWAM9ZwAABKabnPC7c498.jpg



审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1759

    浏览量

    155917
  • 接口
    +关注

    关注

    33

    文章

    9601

    浏览量

    157630
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    零基础玩转Linux+Ubuntu实战视频课程

    ” -> 升华认知:抛弃鼠标的依赖,用“文件寻址”和“命令组合”的思维重塑对计算机的操控。 按这个框架去读,这篇看似晦涩枯燥的零基础长文,就会立刻化作你通往后端开发、运维部署、甚至极客高薪领域的“万能钥匙”。
    发表于 04-18 16:16

    2小时搞定鸿蒙应用!零基础做出你的鸿蒙“处女作”

    当下,低门槛开发正成为生态扩张的最强推力,而鸿蒙生态的快速壮大,也让越来越多零基础小白蠢蠢欲动,想加入开发大军。但繁琐的配置流程、深奥的代码,也让很多人打起了退堂鼓。近日,鸿蒙开发者官
    的头像 发表于 04-17 14:04 103次阅读
    2小时搞定鸿蒙应用!<b class='flag-5'>零基</b>础做出你的鸿蒙“处女作”

    小安立式桌摆外壳设计制作

    小安-Eyes-R2,但是一直没什么时间好好的研究一下。近期学习了一下相关例程,感觉用的很难受,大概是因为屏幕排线比较短且板子和屏幕不好固定,以及烧录两个按键必须要俩手按,于是考虑做外壳固定一下。  
    的头像 发表于 09-09 17:20 1018次阅读
    <b class='flag-5'>小安</b><b class='flag-5'>派</b>立式桌摆外壳设计制作

    【开源硬件】小安AiPi-Eyes-R2详细测评+DIY天气时钟

    接口-130W像素 1 显示器-4.0寸-RGB接口40寸-像素480x480 1 咪头-2pin-1.25mm间距-交叉绞线100mm 2 具体开箱流程照片如下: 环境搭建 因为之前笔者已经用过Windows开发
    的头像 发表于 08-12 16:23 927次阅读
    【开源硬件】<b class='flag-5'>小安</b><b class='flag-5'>派</b>AiPi-<b class='flag-5'>Eyes</b>-R2详细测评+DIY天气时钟

    树莓操作系统:版本、特性及设置完整指南!

    树莓操作系统是什么?树莓操作系统是由树莓基金会专为树莓开发的官方操作系统。它基于DebianLinux发行版,并针对树莓
    的头像 发表于 07-28 18:26 1827次阅读
    树莓<b class='flag-5'>派</b>操作系统:版本、特性及设置完整指南!

    上手体验安信可小安AI开发板,如何接入Home Assistant?

    以下作品由安信可社区用户 无垠的广袤 制作 感谢安信可社区的支持,免费领到了安信可的最新产品 小安AI - AiPi-PalChatV1 语音开发板。 原贴地址: 【AiPi-PalChatV
    的头像 发表于 07-08 10:34 4972次阅读
    上手体验安信可<b class='flag-5'>小安</b><b class='flag-5'>派</b>AI<b class='flag-5'>开发</b>板,如何接入Home Assistant?

    【教程】零基础!手把手教你使用STM32F4进行E22-400T22S编程通信

    通过本文带大家零基础使用STM32F407VET6单片机进行E22-400T22S模块编程并进行简单的通信,当然如果学会了,也可以举一反三应用于E22、E220、E32所有模块上。一STM32环境
    的头像 发表于 07-03 19:32 1824次阅读
    【教程】<b class='flag-5'>零基</b>础!手把手教你使用STM32F4进行E22-400T22<b class='flag-5'>S</b>编程通信

    零基础学习LuatOS编程:快速上手开发实战教程!

    无论你是刚接触物联网编程的新手,还是希望拓展技能的技术爱好者,本教程将为零基础的读者提供一条清晰的LuatOS学习路径。从安装开发工具到编写第一个程序,我们将通过实例讲解核心概念,助你快速实现从理论
    的头像 发表于 06-13 17:27 751次阅读
    <b class='flag-5'>零基</b>础学习LuatOS编程:快速上手<b class='flag-5'>开发</b>实战教程!

    死角玩转STM32——系统

    本文共4册,由于资料内存过大,分开上传,有需要的朋友可以去主页搜索下载哦~ 《死角玩转 STM32》系列教程由初级、中级、高级、系统
    发表于 05-21 14:08

    死角玩转STM32——高级

    本文共4册,由于资料内存过大,分开上传,有需要的朋友可以去主页搜索下载哦~ 《死角玩转 STM32》系列教程由初级、中级、高级、系统
    发表于 05-21 14:02

    死角玩转STM32——中级

    本文共4册,由于资料内存过大,分开上传,有需要的朋友可以去主页搜索下载哦~ 《死角玩转 STM32》系列教程由初级、中级、高级、系统
    发表于 05-21 13:56

    死角玩转STM32——初级

    本文共4册,由于资料内存过大,分开上传,有需要的朋友可以去主页搜索下载哦~ 《死角玩转 STM32》系列教程由初级、中级、高级、系统
    发表于 05-21 13:48

    【「零基开发AI Agent」阅读体验】+读《零基开发AI Agent》掌握扣子平台开发智能体方法

    收到发烧友网站寄来的《零基开发AI Agent》这本书已经有好些天了,这段时间有幸拜读了一下全书,掌握了一个开发智能体的方法。 该书充分从零基础入手,先阐述了Agent是什么,它的基
    发表于 05-14 19:51

    Air8000+G-sensor:零基开发者的传感器入门课!

    无需复杂理论,本文专为零基开发者设计,从Air8000核心板硬件特性入手,一步步演示G-sensor的注册、配置与数据解析。结合趣味实例(如倾斜控制LED),让你30分钟内完成首个传感项目,夯实
    的头像 发表于 05-06 14:36 1047次阅读
    Air8000+G-sensor:<b class='flag-5'>零基</b>础<b class='flag-5'>开发</b>者的传感器入门课!

    【「零基开发AI Agent」阅读体验】+ 入门学习

    很高兴又有机会学习ai技术,这次试读的是「零基开发AI Agent」,作者叶涛、管锴、张心雨。 大模型的普及是近三年来的一件大事,万物皆可大模型已成为趋势。作为大模型开发应用中重要组成部分,提示词
    发表于 05-02 09:26