| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- #include "Flash.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;
- }
- #if 1
- 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.
- }
- }
- fmc_lock();/* flash속傑,쐐岺긍넋 */
- return flag;
- }
- void Flash_BufferRead(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;
- }
- #else
- 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속傑,쐐岺긍넋 */
- return flag;
- }
- uint8_t Flash_BufferWrite(uint8_t _PageNumber,uint32_t *pBuffer,uint16_t Num)
- {
- uint8_t flag = 1;
- uint32_t Address = 0,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);//헌뇝女긍넋댄轎깃羚
- Address = FLASH_USER_START_ADDR + FLASH_PAGE_SIZE * _PageNumber;
- EndAddr = Address + Num;
- while (Address < EndAddr) {
- if (fmc_word_program(Address, *pBuffer++) == FMC_READY) {
- Address += 4;
- } else {
- flag = 0;// Error occurred while writing data in Flash memory.
- }
- }
- fmc_lock();/* flash속傑,쐐岺긍넋 */
-
- return flag;
- }
- /*
- void Flash_BufferRead(uint8_t _PageNumber,uint32_t *pBuffer,uint16_t Num)
- {
- uint8_t i;
- uint32_t Address = 0;
-
- Address = FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * _PageNumber );
- for( i=0; i<Num/4; i++ )
- {
- *pBuffer++ = *(__IO uint32_t *)Address;
- Address += 4;
- }
- for( i=0; i<Num%4; i++ )
- {
- *(uint8_t *)pBuffer = *(__IO uint8_t *)Address;
- ( (uint8_t *)pBuffer )++;//뒈囹속1
- Address += 1;
- }
- }*/
- void Flash_BufferRead(uint8_t _PageNumber,uint8_t *pBuffer,uint16_t Num)
- {
- uint8_t i;
- uint32_t Address = 0;
-
- Address = FLASH_USER_START_ADDR + (FLASH_PAGE_SIZE * _PageNumber );
- for( i=0; i< Num; i++)
- {
- *pBuffer++ = *(__IO uint8_t *)Address++;
- }
- }
- #endif
|