| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- #include "Flash.h"
- #include "Uart.h"
- /********************************
- * @brief OTA参数初始化
- * @retval FLASH_COMPLETE初始成功
- ********************************/
- uint8_t Flash_RangeErase(uint32_t FlashAddress, uint32_t Size)
- {
- uint8_t flag = 1;
- uint32_t msize=0;
- fmc_state_enum FlashStatus = FMC_READY;
- while(Size > msize) {
- fmc_unlock();/* 解锁flash */
- fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
- fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
- fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
- FlashStatus = fmc_page_erase(FlashAddress+msize);//擦除指定的页,参数页地址
- fmc_lock();/* flash加锁,禁止编程 */
- /* If erase operation was failed, a Flash error code is returned */
- if (FlashStatus != FMC_READY) {
- flag = 0;
- break;
- }
- msize += FLASH_PAGE_SIZE;
- }
- return flag;
- }
- uint8_t Flash_PageErase(uint8_t _PageNumber)
- {
- uint8_t flag = 0;
- if(_PageNumber > 127)
- return 0;
- fmc_unlock();/* 解锁flash */
- fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
- fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
- fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
- if( fmc_page_erase(FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * _PageNumber)) == FMC_READY )
- {
- flag = 1;
- }
- fmc_lock();/* flash加锁,禁止编程 */ // Lock the Flash to disable the flash control register access
- return flag;
- }
- uint8_t Flash_BufferWrite(uint32_t address, uint32_t *p_buffer, uint32_t len)
- {
- uint8_t flag = 1;
- uint32_t EndAddr = 0;
- //uint32_t *p_buffer = (uint32_t *)buffer;
- if(address%4||len%4) {
- return 0;
- }
- fmc_unlock();/* 解锁flash */
- fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
- fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
- fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
- EndAddr = address + len;
- while (address < EndAddr) {
- if (fmc_word_program(address, *p_buffer) == FMC_READY) {
- p_buffer++;
- address += 4;
- } else {
- flag = 0;// Error occurred while writing data in Flash memory.
- break;
- }
- }
- fmc_lock();/* flash加锁,禁止编程 */
- return flag;
- }
- uint8_t Flash_BufferWrite_uint16(uint32_t address, uint16_t *p_buffer, uint32_t len)
- {
- uint8_t flag = 1;
- uint32_t EndAddr = 0;
- fmc_unlock();/* 解锁flash */
- fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
- fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
- fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
- EndAddr = address + len;
- while (address < EndAddr) {
- if (fmc_halfword_program(address, *p_buffer) == FMC_READY) {
- p_buffer++;
- address += 2;
- } else {
- flag = 0;// Error occurred while writing data in Flash memory.
- break;
- }
- }
- fmc_lock();/* flash加锁,禁止编程 */
- return flag;
- }
- void Flash_BufferRead(uint32_t address, uint8_t *buffer, uint32_t len)
- {
- uint32_t EndAddr = 0;
- uint8_t *p_buffer = (uint8_t *)buffer;
- // if(address%4||len%4) {
- // return ;
- // }
- fmc_unlock();/* 解锁flash */
- fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
- fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
- fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
- EndAddr = address + len;
- while (address < EndAddr) {
- *p_buffer++ = *(__IO uint8_t *)address;
- address += 1;
- }
- fmc_lock();/* flash加锁,禁止编程 */
- }
- void Flash_BufferRead_btye4(uint32_t address, uint8_t *buffer, uint32_t len)
- {
- uint32_t EndAddr = 0;
- uint32_t *p_buffer = (uint32_t *)buffer;
- if(address%4||len%4) {
- return ;
- }
- fmc_unlock();/* 解锁flash */
- fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
- fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
- fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
- EndAddr = address + len;
- while (address < EndAddr) {
- *p_buffer++ = *(__IO uint32_t *)address;
- address += 4;
- }
- fmc_lock();/* flash加锁,禁止编程 */
- }
- //读取flash中有效数据的长度
- uint32_t Flash_DatalenRead(uint32_t address,uint32_t len)
- {
- uint32_t BeginAddr = 0;
- uint32_t addrlen = 0;
- uint32_t data;
- if(address%4||len%4) {
- return addrlen;
- }
- fmc_unlock();/* 解锁flash */
- fmc_flag_clear(FMC_FLAG_BANK0_END);//清除操作结束标志
- fmc_flag_clear(FMC_FLAG_BANK0_WPERR);//清除擦除/错误标志
- fmc_flag_clear(FMC_FLAG_BANK0_PGERR);//清楚页编程错误标志
- BeginAddr = address + len - 4;
- while(address < BeginAddr)
- {
- data = *(__IO uint32_t *)BeginAddr;
- if(data != 0xFFFFFFFF)
- break;
- BeginAddr -= 4;
- }
- fmc_lock();/* flash加锁,禁止编程 */
- if(address <= BeginAddr)
- {
- addrlen = (BeginAddr+4) - address;
- }
- return addrlen;
- }
- void flash_test(void)
- {
- uint8_t data[8] = {11,22,33,45,100,23,67,89};
- uint8_t i = 0,outda[8] = {0};
- printf("eraser flash one page 0x8018000\r\n");
- Flash_RangeErase(0x8018000,2048);
- printf("write flash 0x8018000\r\n");
- Flash_BufferWrite(0x8018000,(uint32_t*)data,8);//正常的flash 写入
- printf("read flash 0x8018000\r\n");
- Flash_BufferRead(0x8018000,outda,8);//数据存入到outda中
- for(i=0;i<8;i++){
- printf("%d, ",outda[i]);
- }
- printf("\r\n");
- Flash_RangeErase(0x8018000,2048);
- printf("eraser flash and test finish\r\n");
- }
|