CH59X/CH58X/CH57X 片上flash的使用

发布时间 2023-12-27 20:09:33作者: 小舟从此逝_1

以CH592F为例;在使用时先看手册对code和data区的划分

一、DataFlash的读写的操作

 先看几个操作dataflash的API(读擦写);

/**
 * @brief   read Data-Flash data block
 *
 * @param   StartAddr   - Address of the data to be read.//要读取的数据的地址,传入的的地址是相对地址所以0是dataflash,0对应dataflash的起始地址
 * @param   Buffer      - Pointer to the buffer where data should be stored, Must be aligned to 4 bytes.定义的buffer需要四字节对齐,读的时候可以进行单字节读
 * @param   Length      - Size of data to be read, in bytes.
 *
 * @return  0-SUCCESS  (!0)-FAILURE
 */
#define EEPROM_READ(StartAddr,Buffer,Length)        FLASH_EEPROM_CMD( CMD_EEPROM_READ, StartAddr, Buffer, Length )

/**
 *     
 * @param   StartAddr   - Address of the data to be erased.  擦除这里是256高位对其,即你擦除了257字节,实际上擦除的是512;擦除后的地址区域EEPROM_READ读出来的值是0xff
* @param Length - Size of data to be erased, in bytes. * * @return 0-SUCCESS (!0)-FAILURE */ 传入地址是相对地址,0是起始地址

#define EEPROM_ERASE(StartAddr,Length) FLASH_EEPROM_CMD( CMD_EEPROM_ERASE, StartAddr, NULL, Length )

/** * @brief write Data-Flash data block *
* @param StartAddr - Address of the data to be written.
写这里需要写入的是指针数据,可以进行单字节写,数据是需要在RAM里的。传入地址是相对地址,0是起始地址
* @param Buffer - Pointer to the source buffer, Must be aligned to 4 bytes. 
* @param Length - Size of data to be written, in bytes.
*
* @return 0-SUCCESS (!0)-FAILURE
*/

#define EEPROM_WRITE(StartAddr,Buffer,Length) FLASH_EEPROM_CMD( CMD_EEPROM_WRITE, StartAddr, Buffer, Length )

使用实例:

EEPROM_ERASE(0, 256*2);  
EEPROM_WRITE(0, TestBuf, 500); 
EEPROM_READ(0, TestBuf, 500);

二、CodeFlash的的操作:

codeflash的读写校验:

//codeflash的读的地址位绝对地址,可进行单字节进行读取
void
FLASH_ROM_READ(uint32_t StartAddr, void *Buffer, uint32_t len)
//这里的buffer是需要写入的指针数据,需要进行4字节对齐,数据长度要是4的倍数,数据需要在RAM里面 FLASH_ROM_WRITE(StartAddr,Buffer,Length)
//codeflash的擦的地址是绝对地址,擦除是4k对齐,假如你擦除4097字节实际上擦出的是8192字节;
FLASH_ROM_ERASE(StartAddr,Length)

FLASH_ROM_VERIFY(StartAddr,Buffer,Length)

使用示例:

 FLASH_ROM_ERASE(20 * 1024, 4096);
 FLASH_ROM_WRITE(20 * 1024, TestBuf, 128);  
FLASH_ROM_READ(20 * 1024, TestBuf, 128);

三、修改用户配置值
//需在调用用户配置字生效函数后生效,且每次烧录后只能修改一次(使用该函数,必须使用官方提供的.S文件,同时调用该函数后,两次上电后,两线调试接口默认关闭)

RESET_EN - 外部复位引脚使能
BOOT_PIN - ENABLE-使用默认boot脚-PB22,DISABLE-使用boot脚-PB11
UART_NO_KEY_EN - 串口免按键下载使能
FLASHProt_Size - 写保护大小(单位4K)

uint8_t UserOptionByteConfig(FunctionalState RESET_EN, FunctionalState BOOT_PIN, FunctionalState UART_NO_KEY_EN, uint32_t FLASHProt_Size)

关闭两线仿真接口 uint8_t UserOptionByteClose_SWD(
void)

注意事项:

1.无论的CodeFlash写操作,还是DataFlash的写操作,其传入的源数据指针只支持在RAM中,而不支持在flash中,否则即使,写操作返回成功,仍然会写失败。

2.CodeFlash读操作是有硬件加扰的,也就是擦除后读不是全FF,而是四个固定字节的循环,DataFlash读操作没有硬件加扰。

3.CodeFlash和DataFlash都可以直接指针读数据(指针读经过硬件加扰)。

4.DataFlash写之前也是需要先擦再写的