【FR801xH】富芮坤FR801xH之Flash读写

00. 目录

01. FR801xH概述

在这里插入图片描述

FR801xH 系列芯片是面向SOC(片上系统),易于快速开发的低功耗蓝牙芯片。基于 Freqchip 的蓝牙智能固件和协议栈的支持,完全兼容蓝牙 V5.3(LE 模式)协议。同时用户可以基于芯片内置的 ARM CorteM3 嵌入式 32 位高性能单片机开发各种应用程序。

蓝牙智能固件包括 L2CAP 服务层协议、安全管理器 (SM)、属性协议(ATT)、通用属性配置文件 (GATT)和通用访问配置文件(GAP)。此外,还 支持应用程序配置文件,例如接近度、健康温度计、 心率、血压、血糖、人机界面设备(HID)和 SDK (包括驱动程序、OS-API 等)。SDK 还集成了用于网络应用程序的 SIG Mesh 协议。

采用 Freqchip 的创新技术,将 PMU(锂电池充电 器+LDO)、带 XIP 模式的 QSPI FLASH ROM、 I2C、UART、GPIO、ADC、PWM 集成在一块芯片中,为客户提供:

  • 竞争力的功耗
  • 稳定的蓝牙连接
  • 极低的 BOM 成本

02. FR801xH功能框图

在这里插入图片描述

03. Flash相关类型

头文件components/driver/include/driver_flash.h

#define FLASH_READ_TYPE_SINGLE          1
#define FLASH_READ_TYPE_DUAL            2
#define FLASH_READ_TYPE_QUAD            4

04. Flash相关API

4.1 qspi_flash_init

/*********************************************************************
* @fn      qspi_flash_init
*
* @brief   initialize the qspi flash controller.
*
* @param   type - used to set read mode: SINGLE(1), DUAL(2), QUAD(4).
*
* @return  flash ID.
*/
uint32_t qspi_flash_init(uint8_t type);
功能:
	初始化Fqspi flash
参数:
	type 设置读模式
返回值:
	flash id

4.2 flash_erase

/*********************************************************************
* @fn      flash_erase
*
* @brief   sector erase.
*
* @param   offset   - the start address to be erase, should be aligned with
*                     sector (0x1000).
*          size     - should be multiple of 0x1000, 0 means one sector.
*
* @return  None.
*/
void flash_erase(uint32_t offset, uint32_t size);
功能:
	擦除扇区
参数:
	offset 擦除起始地址,4K对齐
    size 擦除字节大小,必须是4K的倍数
返回值:
	None

4.3 flash_write

/*********************************************************************
* @fn      flash_write
*
* @brief   write data into flash.
*
* @param   offset   - the start address to be written.
*          length   - how many bytes to be written.
*          buffer   - data source pointer.
*
* @return  None.
*/
void flash_write(uint32_t offset, uint32_t length, uint8_t *buffer);
功能:
	将数据写入flash
参数:
	offset 起始地址
    length 写入的字节数
    buffer 写入的数据
返回值:
	None

4.4 flash_read

/*********************************************************************
* @fn      flash_read
*
* @brief   read data from flash.
*
* @param   offset   - the start address to be read.
*          length   - how many bytes to be read.
*          buffer   - pointer to the area used to store data.
*
* @return  None.
*/
void flash_read(uint32_t offset, uint32_t length, uint8_t *buffer);
功能:
	从flash读取数据
参数:
	offset 起始地址
    length 读取的字节数
    buffer 保存读取的数据
返回值:
	None

4.5 show_reg

__STATIC __INLINE void show_reg(uint8_t *data,uint32_t len,uint8_t dbg_on)
{
    uint32_t i=0;
    if(len == 0 || (dbg_on==0)) return;
    for(; i<len; i++)
    {
        co_printf("0x%02X,",data[i]);
    }
    co_printf("\r\n");
}

05. Flash程序示例

程序示例


#include "driver_flash.h"
#include "sys_utils.h"

#define FLASH_PAGE_SIZE (0x1000)    //4K
#define USER_FLASH_BASE_ADDR (0x78000)  //200K
#define USER_FLASH_MAX_PAGE_ADDR  (0x80000 - FLASH_PAGE_SIZE)   //512K-4K
uint8_t buf[FLASH_PAGE_SIZE];

void peripheral_demo(void)
{

    uint32_t id;
    co_printf("flash demo\r\n");

    id = qspi_flash_init(2);
    id = (id & 0xFFFFFF);
    co_printf("flash id:%x\r\n", id);

    flash_erase(USER_FLASH_BASE_ADDR, FLASH_PAGE_SIZE);
    uint32_t idx = 0;
    for (idx = 0; idx < FLASH_PAGE_SIZE; idx++)
        buf[idx] = idx;
    flash_write(USER_FLASH_BASE_ADDR, FLASH_PAGE_SIZE, buf);
    for (idx = 0; idx < FLASH_PAGE_SIZE; idx++)
        buf[idx] = 0xff;
    flash_read(USER_FLASH_BASE_ADDR, FLASH_PAGE_SIZE, buf);
    co_printf("read reg:\r\n");
    show_reg(buf, 5, 1);
    show_reg(buf + 4091, 5, 1);

    flash_erase(USER_FLASH_BASE_ADDR, FLASH_PAGE_SIZE);
    for (idx = 0; idx < FLASH_PAGE_SIZE; idx++)
        buf[idx] = idx + 1;
    flash_write(USER_FLASH_BASE_ADDR, FLASH_PAGE_SIZE, buf);
    for (idx = 0; idx < FLASH_PAGE_SIZE; idx++)
        buf[idx] = 0xfe;
    flash_read(USER_FLASH_BASE_ADDR, FLASH_PAGE_SIZE, buf);
    co_printf("read reg:\r\n");
    show_reg(buf, 5, 1);
    show_reg(buf + 4091, 5, 1);

    flash_erase(USER_FLASH_MAX_PAGE_ADDR, FLASH_PAGE_SIZE);
    for (idx = 0; idx < FLASH_PAGE_SIZE; idx++)
        buf[idx] = idx + 2;
    flash_write(USER_FLASH_MAX_PAGE_ADDR, FLASH_PAGE_SIZE, buf);
    for (idx = 0; idx < FLASH_PAGE_SIZE; idx++)
        buf[idx] = 0xfd;
    flash_read(USER_FLASH_MAX_PAGE_ADDR, FLASH_PAGE_SIZE, buf);
    co_printf("read reg:\r\n");
    show_reg(buf, 5, 1);
    show_reg(buf + 4091, 5, 1);

    flash_erase(USER_FLASH_MAX_PAGE_ADDR, FLASH_PAGE_SIZE);
    for (idx = 0; idx < FLASH_PAGE_SIZE; idx++)
        buf[idx] = idx + 3;
    flash_write(USER_FLASH_MAX_PAGE_ADDR, FLASH_PAGE_SIZE, buf);
    for (idx = 0; idx < FLASH_PAGE_SIZE; idx++)
        buf[idx] = 0xfc;
    flash_read(USER_FLASH_MAX_PAGE_ADDR, FLASH_PAGE_SIZE, buf);
    co_printf("read reg:\r\n");
    show_reg(buf, 5, 1);
    show_reg(buf + 4091, 5, 1);

    flash_erase(USER_FLASH_MAX_PAGE_ADDR, FLASH_PAGE_SIZE);
    // flash_chip_erase();
}

程序运行结果

freqchipuser_entry_after_ble_init
flash demo
flash id:1340c4
read reg:
0x00,0x01,0x02,0x03,0x04,
0xFB,0xFC,0xFD,0xFE,0xFF,
read reg:
0x01,0x02,0x03,0x04,0x05,
0xFC,0xFD,0xFE,0xFF,0x00,
read reg:
0x02,0x03,0x04,0x05,0x06,
0xFD,0xFE,0xFF,0x00,0x01,
read reg:
0x03,0x04,0x05,0x06,0x07,
0xFE,0xFF,0x00,0x01,0x02,

06. 附录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沧海一笑-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值