CH59X/CH58X/CH57X 片上flash的使用
以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写之前也是需要先擦再写的