stm32f103ret flash program / erase 테스트
몇개 참조했는데 그냥 결국에는 맨땅에 헤딩해서 대충 구현.. -_ㅠ
[링크 : https://blog.naver.com/eziya76/220988141146]
1. HAL_Flash_Program() 호출 전에 해당 섹터는 HAL_FlashEx_Erase()를 불러서 지워져 있는 상태여야 함
STM32Cubeprogrammer로 보면 전부 0xFFFFFF 라서 그냥 바로 쓰면 되겠네? 싶어서
HAL_Flash_Unlock() 이후 바로 HAL_Flash_Program() 호출해서 쓰니 Hard Fault 발생 -_-
찾아봐도 별 도움되는건 없어서, 결국에는 지우고 새로 쓰니 문제 없이 되었는데
다시 안지우고 쓰려고 하면 아까처럼 hard fault는 안뜨고
HAL_Flash_Program() 의 리턴값이 HAL_ERROR(1)로 뜰 뿐 문제가 없다. 머지?
아래는 쓰는데 성공한 예제
2. 섹터 지우는건 빠른데, 쓰는건 느리다(word)
아래 코드에서 32MHz로 작동중인데,
Erase는 2msec 이내로 끝났고
Write는 2048 Byte, 1 섹터를 가득 채우는건데 65 msec 미만으로 소요되었다.
tick1 1 tick2 64 |
3. 16bit 32bit write 속도가 다르다.
함수 호출 횟수 차이인진 모르겠으나 WORD 에서 HALFWORD로 바꾸고 쓰기 횟수를 2배로 늘려주니
ret = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr, data); |
무려(?) 3msec가 느려졌다.
tick1 1 tick2 67 |
3. HAL_FLASH_Unlock() / HAL_FLASH_Lock()
플래시를 unlock 하지 않고 erase / program 하면 실제로 써지거나 지워지지 않지만 HAL_OK로 리턴된다.
이게 머야 -_-
소스코드
void flash_test() { HAL_StatusTypeDef ret; uint32_t addr = FLASH_BASE + 0x0007F800; int data = 0; HAL_FLASH_Unlock(); FLASH_EraseInitTypeDef eraseDef; eraseDef.TypeErase = FLASH_TYPEERASE_PAGES; eraseDef.Banks = 1; eraseDef.PageAddress = 0x807F800; eraseDef.NbPages = 1; uint32_t ret_era = 0; uint32_t tick = HAL_GetTick(); HAL_FLASHEx_Erase(&eraseDef, &ret_era); uint32_t tick2 = HAL_GetTick(); printf("tick1 %d\r\n",tick2-tick); tick = HAL_GetTick(); for(int idx = 0; idx < 512; idx++) { ret = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, data); if(ret != HAL_OK) { printf("ret[%x]\r\n", ret); break; } // else // { // printf("%X [%X] ok\r\n", FLASH_BASE + addr * 4, data); // } addr += 4; data += 4; } tick2 = HAL_GetTick(); printf("tick2 %d\r\n",tick2-tick); HAL_FLASH_Lock(); } |