Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AB32VG1
FAL
flash
中科蓝讯AB32VG1片上Flash评测
发布于 2021-03-30 01:37:04 浏览:1416
订阅该版
**一、AB32VG1片上Flash:** AB32VG1 内部集成8M bit即1M byte flash,每个扇区4096 Bytes,由于程序整体不大,所以将后512KB用于用户存储区,并通过文件系统挂载。 **二、flash驱动** 1、关于AB32VG1片上flash的信息目前还没有公开,目前由@greedyhao 通过编译库的形式提供,函数接口如下: uint16_t os_spiflash_read(void *buf, uint32_t addr, uint16_t len); void os_spiflash_program(void *buf, uint32_t addr, uint16_t len); void os_spiflash_erase(uint32_t addr); 2、扩展flash驱动(flash.c): 为满足文件系统的正常挂载、使用,对flash驱动进行了进一步封装 ``` static uint8_t buff[SECTOR_SIZE]; uint8_t FlashCheckSectorErase(uint32_t addr, uint8_t *data) { uint16_t i; FlashRead(addr, data, SECTOR_SIZE); for(i=0;i
= DATA_ADDRESS_START) && ((addr + len) < DATA_ADDRESS_END)) { uint32_t sectorAssress; uint16_t writed = 0; uint16_t toWrite; uint16_t offset; while(writed < len) { sectorAssress = FlashGetSectorAddr(addr); if(FlashCheckSectorErase(sectorAssress, buff) == 1) { os_spiflash_erase(sectorAssress); } offset = addr - sectorAssress; toWrite = ((len - writed) < (SECTOR_SIZE - offset) ? (len - writed) : (SECTOR_SIZE - offset)); rt_memmove(buff + offset, data + writed, toWrite); if(FlashWritePage(sectorAssress, buff)==0) break; writed += toWrite; } } } void FlashErase(uint32_t addr, size_t len) { int i,j; if((addr >= DATA_ADDRESS_START) && ((addr + len) < DATA_ADDRESS_END)) { uint32_t sectorAssress; uint16_t writed = 0; uint16_t toWrite; uint16_t offset; while(writed < len) { sectorAssress = FlashGetSectorAddr(addr); if(FlashCheckSectorErase(sectorAssress, buff) == 1) { os_spiflash_erase(sectorAssress); } offset = addr - sectorAssress; toWrite = ((len - writed) < (SECTOR_SIZE - offset) ? (len - writed) : (SECTOR_SIZE - offset)); rt_memset(buff + offset, 0xFF, toWrite); if(FlashWritePage(sectorAssress, buff)==0) break; writed += toWrite; } } } void FlashRead(uint32_t addr, uint8_t *data, size_t len) { os_spiflash_read(data, addr, len); } ``` **三、FAL移植** 1、软件包添加fal ![image.png](https://oss-club.rt-thread.org/uploads/20210330/69525b95a22900c589bcfd7790541772.png) ![image.png](https://oss-club.rt-thread.org/uploads/20210330/3e20bb76d619e139ce52540f676c4610.png) 2、将packages/fal-v0.5.0/samples/porting/fal_cfg.h拷贝到board文件夹,并完成驱动接口,如下: ``` #ifndef _FAL_CFG_H_ #define _FAL_CFG_H_ #include
#include
/* ===================== Flash device Configuration ========================= */ extern const struct fal_flash_dev ab32vg1_onchip_flash; /* flash device table */ #define FAL_FLASH_DEV_TABLE \ { \ &ab32vg1_onchip_flash, \ } /* ====================== Partition Configuration ========================== */ #ifdef FAL_PART_HAS_TABLE_CFG /* partition table */ #define FAL_PART_TABLE \ { \ {FAL_PART_MAGIC_WORD, "flash1", "AB32_onchip", 0, 512*1024, 0}, \ } #endif /* FAL_PART_HAS_TABLE_CFG */ #endif /* _FAL_CFG_H_ */ ``` 3、新建fal_flash_ab32vg1_port.c文件并写入以下内容 ``` #include
#include "flash.h" /** * Get the sector of a given address * * @param address flash address * * @return The sector of a given address */ static int init(void) { /* do nothing now */ } static int read(long offset, uint8_t* buf, size_t size) { size_t i; uint32_t addr = ab32vg1_onchip_flash.addr + offset; FlashRead(addr, buf, size); return size; } static int write(long offset, const uint8_t* buf, size_t size) { size_t i; uint32_t read_data; uint32_t addr = ab32vg1_onchip_flash.addr + offset; FlashWrite(addr, buf, size); return size; } static int erase(long offset, size_t size) { FlashErase(offset, size); return size; } const struct fal_flash_dev ab32vg1_onchip_flash = { .name = "AB32_onchip", .addr = DATA_ADDRESS_START, .len = DATA_ADDRESS_END - DATA_ADDRESS_START, .blk_size = 512, .ops = {init, read, write, erase}, .write_gran = 8 }; ``` **四、开启文件系统** 配置打开DFS及Fatfs ![image.png](https://oss-club.rt-thread.org/uploads/20210330/bce3848e1cf9e288328e0df2eb245e33.png) **五、初始化FAL并挂载flash至根目录‘/’** ``` int ab32_flash_mount(void) { struct rt_device *flash_dev; fal_init(); flash_dev = fal_blk_device_create("flash1"); if(flash_dev == NULL) { LOG_E("Failed to create flash device!"); return -1; } retry: if (dfs_mount(flash_dev->parent.name, "/", "elm", 0, 0) == 0) { LOG_D("Filesystem initialized!"); return 0; } else { if(dfs_mkfs("elm", "flash1") == 0) { LOG_D("mkfs ok!"); goto retry; } LOG_E("Failed to initialize filesystem!"); LOG_D("You should create a filesystem on the block device first!"); } return -1; } INIT_APP_EXPORT(ab32_flash_mount); ``` **六、下载验证** 1、FAL初始化成功,并完成挂载 ![image.png](https://oss-club.rt-thread.org/uploads/20210330/60d3dba4b53b9954810a32e66f4b0e9e.png) 2、试试文件操作 ![image.png](https://oss-club.rt-thread.org/uploads/20210330/a03ed13d62aebe314fd53ab11c2cb6cd.png) **七、心得体会** 很幸运,RT-Thread官方及中科蓝讯官方给了我这次参与评测的机会。当初选择flash评测是因为flash功能的评测难度定为3颗星,难度较难,心想申请的人应该比较少,入选的概率就大了。公布结果那一刻,很开心,我成功入选了。 第二天,评测板就到了,不过一看资料,关于flash的资料几乎为0,感觉这是不可能完成的任务。后来得知是和中科蓝讯的开发人员一起参与功能开发。在此要感谢@greedyhao,他提供了flash驱动,我的评测任务才得以顺利进行。 rt-thread已经是国内开源社区的佼佼者,特别是rt-thread studio发布以来,国产软件得到了越来越多工程师的认可。AB32VG1采用的是RISC-V架构,这也是我第一次接触这种架构,想必开源架构也将会是未来的主流,这款芯片的功能很丰富,但也还有很多功能有待开发,也希望中科蓝讯官方也能尽快完善驱动库,让大家体验更多的功能。 **八、源码** https://gitee.com/lingzijian/ab32-vg1-flash.git
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
lingzijian
这家伙很懒,什么也没写!
文章
1
回答
0
被采纳
0
关注TA
发私信
相关文章
1
关于FAL移植
2
添加fal软件包之后编译出现错误,求助!
3
关于easyflash4.0的写入和读取norflash一些疑惑咨询
4
FAL驱动移植&构建脚本问题
5
帮我看一下这样分区会不会冲突??
6
EasyFlash 4.0疑似出BUG
7
疑似FAL日志输出与DFS冲突??
8
fal软件包偏移量大于等于当前分区的大小会报错
9
为什么片内Flash总是写失败?
10
片上flash的文件系统的建立
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部