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还有数据缓存数组,我这里做测试这样放,实际不要这样到处飞


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那块,蓝牙我这边也用不到。