embeded/Cortex-M3 STM2025. 7. 28. 15:12

몇개 참조했는데 그냥 결국에는 맨땅에 헤딩해서 대충 구현.. -_ㅠ

[링크 : https://blog.naver.com/eziya76/220988141146]

 

1. HAL_Flash_Program() 호출 전에 해당 섹터는 HAL_FlashEx_Erase()를 불러서 지워져 있는 상태여야 함

STM32Cubeprogrammer로 보면 전부 0xFFFFFF 라서 그냥 바로 쓰면 되겠네? 싶어서

HAL_Flash_Unlock() 이후 바로  HAL_Flash_Program() 호출해서 쓰니 Hard Fault 발생 -_-

찾아봐도 별 도움되는건 없어서, 결국에는 지우고 새로 쓰니 문제 없이 되었는데

[링크 : https://community.st.com/t5/stm32-mcus-products/hal-flash-program-triggers-hardfault-exception/td-p/684669]

 

다시 안지우고 쓰려고 하면 아까처럼 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();
}

'embeded > Cortex-M3 STM' 카테고리의 다른 글

stm32cubeide build analyzer  (0) 2025.07.21
stm32 cubeide ioc gen  (0) 2025.06.18
stm32 uart tx dma  (0) 2025.06.18
stm32 pwm 주파수 계산  (0) 2025.06.05
stm32 timer로 gpio 토글하기  (0) 2025.06.05
Posted by 구차니