发帖
0 0 0

[BW20]二次开发学习4 FLASH读写

夜雨喧嚣
高级会员

12

主题

7

回帖

529

积分

高级会员

积分
529
BW系列 15 0 昨天 23:22

1、驱动函数熟悉

驱动函数位置

ameba-rtos-release-v1.1\component\soc\amebadplus\hal\src\flash_api.c

具体内容可以自行下载SDK查看

本文需要使用的函数如下(也可直接使用自带的 vfs,我本来是用这个的,结果那时候因为定时器选了0号,有个bug解决不了,就换flash了)

1.1 、单页擦除命令

文件中第120行开始

我这边数据小于4K,所以就使用这个,如果有大需求可以选择另一个

void flash_erase_sector(flash_t *obj, u32 address)

obj:flash对象(不生效)

address:擦除起始地址

1.2、写flash

文件中第217行开始

int  flash_stream_write(flash_t *obj, u32 address, u32 len, u8 *data)

obj:FLASH对象(不生效)

address:写入起始地址

len:数据长度

data:数据指针

1.3、读flash

文件中第197行开始

int  flash_stream_read(flash_t *obj, u32 address, u32 len, u8 *data)

obj:FLASH对象(不生效)

address:读取起始地址

len:数据长度

data:数据指针

2、flash.c,.h文件创建

.c代码如下,读写保护我觉得保不保都行,开了写入固件还会麻烦几步

#include "userFlash.h"
#include "userUartApp.h"

#define DATA_SIZE 2048  //数据大小
volatile unsigned char data[DATA_SIZE] = {0};  //写入缓存
volatile unsigned char dataStorage[DATA_SIZE] = {0};  //读取缓存
unsigned long address = 0x3E0000;  //flash读写地址

void userFlashWrite(void)
{
    //flash_write_protect(&flash_obj, 0); // 0: 取消写保护
    flash_erase_sector(&flash_obj, address);
    flash_stream_write(&flash_obj, address, DATA_SIZE,(unsigned char *)data);
    //flash_write_protect(&flash_obj, 1); // 0: 开启写保护
}

void userFlashRead(void)
{
    flash_stream_read(&flash_obj, address, DATA_SIZE,(unsigned char *)dataStorage);
}

.h代码如下



#ifndef _USERFLASH_H_
#define _USERFLASH_H_

#include "flash_api.h"

void userFlashWrite(void);
void userFlashRead(void);
#endif

3、主函数实现

开头导入.h还有数据缓存数组,我这里做测试这样放,实际不要这样到处飞

image.png

image.png

	userGpioInit();  //初始化GPIO
	userUartInit();
	userTimeInit(gpioTestTask);
	data[0] = 0x30;
	data[1] = 0x31;
	data[2] = 0x32;
	data[3] = 0x33;
	data[4] = 0x34;
	data[5] = 0x35;
	data[10] = 0x30;
	data[2047] = 0x30;  //为数组写入初始值,并测试极值写入读取
	userFlashRead();  //读取flash
	dataStorage[10]++;

	if((0x30 > dataStorage[10]) || (0x38 < dataStorage[10]))  
	{
		dataStorage[10] = 0x30;
	}
	data[10] = dataStorage[10];
	LEDTest(data[10] % 3);  //根据读取值亮led灯

	userUart2Send("\r\nuart2Test\r\n",14);

	userUart2Send((char *)dataStorage,11);  //打印数据
	userUart2Send((char *)&dataStorage[2047],1);  //打印极值

	userFlashWrite();  //写flash

gpio.c修改为如下

#include "userGPIO.h"

gpio_t LED[3];



void userGpioInit(void)
{
    gpio_init(&LED[0],PB_17);
    gpio_init(&LED[1],PB_18);
    gpio_init(&LED[2],PB_19);

    gpio_dir(&LED[0],PIN_OUTPUT);
    gpio_dir(&LED[1],PIN_OUTPUT);
    gpio_dir(&LED[2],PIN_OUTPUT);
}

void LEDTest(int mode)
{
    if((0 > mode)||(2 < mode))
    {
        mode = 1;
    }
    gpio_direct_write(&LED[mode],1);

}

烧录后现象为

uart2Test
\0012345\0\0\0\000
//重新上电
uart2Test
\0012345\0\0\0\010
//重新上电
uart2Test
\0012345\0\0\0\020

...
//重新上电
uart2Test
\0012345\0\0\0\080
//重新上电
uart2Test
\0012345\0\0\0\000

并且开发板指示灯依次亮起,自此flash的简单操作完成,后续我应该不会再去看这些基础功能了,比如i2c,spi,我这边项目用不到,后续我应该会去看wifi那块,蓝牙我这边也用不到。

──── 0人觉得很赞 ────

使用道具 举报

您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28764 个
  • 话题数: 41100 篇