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

    文章

    1629

    浏览量

    147874
  • 接口
    +关注

    关注

    33

    文章

    8555

    浏览量

    150965
收藏 人收藏

    评论

    相关推荐

    电子DIY作品 小安R1做个86盒中控

    前言 笔者之前看小安的开源资料, 就对 R1 这个板子情有独钟 这就是为 86 盒而生啊 刚好安信可社区一直有积分兑换活动 (https://bbs.ai-thinker.com/) 这次就用
    的头像 发表于 12-05 14:34 108次阅读
    电子DIY作品 <b class='flag-5'>小安</b><b class='flag-5'>派</b>R<b class='flag-5'>1</b>做个86盒中控

    零基开发小安-Eyes-S1 外设 ——I2C

    。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP摄像头接口,外置ES8388音频编解码芯片以及预留TF卡座,并且引出USB接口,可接入USB摄像头。 从开始学习小安
    的头像 发表于 11-27 16:39 176次阅读
    <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

    小安 AiPi-Eyes-R2 玩植物大战僵尸

    - Eyes-R1 带外置 ES8388 音频芯片,支持两路音频输入输出。小安 - Eyes-R2 采用内置 CodeC,支持单路音频输入输出。 如果是编译带 8388
    的头像 发表于 11-06 16:10 181次阅读
    用<b class='flag-5'>小安</b><b class='flag-5'>派</b> AiPi-<b class='flag-5'>Eyes</b>-R2 玩植物大战僵尸

    零基开发小安-Eyes-S1【入门】——工程文件架构

    -Eyes-S1【入门】——初识小安-Eyes-S12、零基
    的头像 发表于 11-06 16:10 126次阅读
    <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>】——工程文件架构

    零基开发小安-Eyes-S1外设】——PWM

    】——工程文件架构7、零基开发小安-Eyes-S1外设
    的头像 发表于 11-06 16:10 123次阅读
    <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>】——PWM

    零基开发小安-Eyes-S1外设——GPIO中断编程

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP摄像头接口,外置ES8388音频编解码芯片以及预留TF卡座,并且引出USB接口,可接入USB摄像头。 产品资料:https://docs.ai-thinker.com/eyes
    的头像 发表于 10-29 14:56 718次阅读
    <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中断编程

    零基开发小安-Eyes-S1外设——GPIO 输入输出

    等。 AiPi-Eyes-S1集成了SPI屏幕接口,DVP摄像头接口,外置ES8388音频编解码芯片以及预留TF卡座,并且引出USB接口,可接入USB摄像头。 从开始学习小安
    的头像 发表于 10-25 13:50 999次阅读
    <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 输入输出

    开发教程 零基开发小安-Eyes-S1入门——Win下SSH连接Linux

    AiPi-Eyes-S1 是安信可开源团队专门为Ai-M61-32S设计的一款开发板,支持WiFi6、BLE5.3。所搭载的Ai-M61-32S 模组具有丰富的
    的头像 发表于 09-24 14:31 274次阅读
    <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

    RT-Thread驱动开发指南进阶-动手驱动先楫未适配的外设LCD

    经过上一的《《RT-Thread设备驱动开发指南》基础--以先楫bsp的hwtimer设备为例》阐述,可以大致了解到RT-thread设备驱动开发的方法步骤,
    的头像 发表于 02-25 11:04 2417次阅读
    RT-Thread驱动<b class='flag-5'>开发</b>指南进阶<b class='flag-5'>篇</b>-动手驱动先楫未适配的<b class='flag-5'>外设</b>LCD

    功德+1,用小安-Eyes-S1做一个电子木鱼

    2024积德累功,心想事成!接下来 看看如何用小安-Eyes-S1做一个电子木鱼 。 01、GUI-Guider 页面设计 先新建一个工程。 直接进入 UI 设计界面,这里用到了两个组件, 一个是图片按钮,一个是文本框 。 先
    的头像 发表于 01-16 14:33 718次阅读
    功德+<b class='flag-5'>1</b>,用<b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b>做一个电子木鱼

    如何用小安-Eyes-S1做一个电子木鱼?

    2024年的第一教程来了,本篇学习如何添加LVGL事件,并制作完成一个电子木鱼(小美苦苦哀求,我略微出手而已)。祝大家2024积德累功,心想事成!接下来看看如何用小安-Eyes-S1
    的头像 发表于 01-13 15:18 1002次阅读
    如何用<b class='flag-5'>小安</b><b class='flag-5'>派</b>-<b class='flag-5'>Eyes-S1</b>做一个电子木鱼?

    用安信可的小安小安,DIY个简单的CC表

    本作品由安信可社区用户 bzhou830 制作 原贴地址:【DIY电子作品】电压与电流CC表 基于小安AiPi-Eye-S1 汇总 https://bbs.ai-thinker.com
    的头像 发表于 12-25 17:07 678次阅读
    用安信可的<b class='flag-5'>小安</b><b class='flag-5'>派</b><b class='flag-5'>小安</b><b class='flag-5'>派</b>,DIY个简单的CC表

    小安DIY个简单的CC表

    Power-Z 上使用的是 INA226,正好手上有这个芯片。那么搭配小安惊艳的屏幕应该能实现出来一个高颜值的CC表。打开原理图可以看到S1正好预留了一个I2C的接口,完美
    的头像 发表于 12-22 18:15 1677次阅读
    用<b class='flag-5'>小安</b><b class='flag-5'>派</b>DIY个简单的CC表

    零基础入门 Hyperlynx 仿真教程

    电子发烧友网站提供《零基础入门 Hyperlynx 仿真教程.pdf》资料免费下载
    发表于 12-22 10:49 31次下载

    使用小安-DSL-3.5寸开发的Rd-03D雷达检测站

    Hello~工程师又来整活了。这是一个使用小安-DSL-3.5寸开发的Rd-03D 雷达检测站,可以把Rd-03D检测的内容显示在3.5寸触摸屏上,直观地查看雷达的检测结果。
    的头像 发表于 12-16 16:05 523次阅读
    使用<b class='flag-5'>小安</b><b class='flag-5'>派</b>-DSL-3.5寸<b class='flag-5'>开发</b>的Rd-03D雷达检测站