본문 바로가기

[STM32F746G-DISCO] Flash 사용하기

by rudals.kim 2024. 7. 17. 댓글 개
반응형
아래 테스트는 STM32CubeIDE 1.6.1/STM32Cube_FW_F7_V1.16.1를 사용하여 테스트 되었습니다.


STM32F746NG의 Flash 메모리는 아래 표와 같이 32KB*4개, 128KB*1개, 256KB*3개로 총 1MB가 내장되어 있습니다.

HAL 드라이버의 stm32f7xx_hal_flash.c/stm32f7xx_hal_flash_ex.c를 보면 Flash memory사용법이 아래와 같이 나옵니다.

FLASH Memory IO Programming functions:
(++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and HAL_FLASH_Lock() functions
(++) Program functions: byte, half word, word and double word
(++) There Two modes of programming :
(+++) Polling mode using HAL_FLASH_Program() function
(+++) Interrupt mode using HAL_FLASH_Program_IT() function

FLASH Memory Erase functions:
(++) Lock and Unlock the FLASH interface using HAL_FLASH_Unlock() and HAL_FLASH_Lock() functions
(++) Erase function: Erase sector, erase all sectors
(++) There are two modes of erase :
(+++) Polling Mode using HAL_FLASHEx_Erase()
(+++) Interrupt Mode using HAL_FLASHEx_Erase_IT()

즉 모든 flash의 erase/write 작업을 하기 전에 HAL_FLASH_Unlock 함수를 호출하여 flash를 unlock을 한 후 작업을 해야 하며 작업이 끝난 후 HAL_FLASH_Lock 함수를 호출하여 flash에 lock을 걸어주어야 합니다.

STM32Cube_FW_F7_V1.16.1에서 제공되는 flash 예제를 참고하여 CLI 환경에서 flash dump/write/erase 동작을 테스트해 보았습니다.

아래는 flash 삭제 동작을 테스트한 코드인데 먼저 HAL_FLASH_Unlock을 하여 flash의 lock을 해제해 줍니다.

FLASH_EraseInitTypeDef structure에 삭제 관련 값을 설정한 후 HAL_FLASHEx_Erase 함수를 호출하여주면 flash의 해당 sector가 삭제가 됩니다. 그런 후 HAL_FLASH_Lock 함수를 사용하여 flash에 다시 lock을 걸어줍니다.

void flash_erase()
{
  /* Unlock the Flash to enable the flash control register access *************/
  HAL_FLASH_Unlock();
  
  /* Get the 1st sector to erase */
  FirstSector = GetSector(FLASH_USER_START_ADDR);

  /* Get the number of sector to erase from 1st sector*/
  NbOfSectors = GetSector(FLASH_USER_END_ADDR) - FirstSector + 1;

  /* Fill EraseInit structure*/
  EraseInitStruct.TypeErase     = FLASH_TYPEERASE_SECTORS;
  EraseInitStruct.VoltageRange  = FLASH_VOLTAGE_RANGE_3;
  EraseInitStruct.Sector        = FirstSector;
  EraseInitStruct.NbSectors     = NbOfSectors;

  /* Note: If an erase operation in Flash memory also concerns data in the data or instruction cache,
       you have to make sure that these data are rewritten before they are accessed during code
       execution. If this cannot be done safely, it is recommended to flush the caches by setting the
       DCRST and ICRST bits in the FLASH_CR register. */
  if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK)
  {
    /*
        Error occurred while sector erase.
        User can add here some code to deal with this error.
        SECTORError will contain the faulty sector and then to know the code error on this sector,
        user can call function 'HAL_FLASH_GetError()'
     */
    /* Infinite loop */
    while (1) ;
  }

  /* Lock the Flash to disable the flash control register access (recommended
         to protect the FLASH memory against possible unwanted operation) *********/
  HAL_FLASH_Lock();
}


아래는 flash 쓰기 동작을 테스트한 코드인데 먼저 HAL_FLASH_Unlock을 하여 flash의 lock을 해제해 줍니다.

HAL_FLASH_Program 함수의 파라미터로 address와 write하기 위한 data값을 넣어주면 해당 주소에 데이터가 write 됩니다. 그런 후 HAL_FLASH_Lock 함수를 사용하여 flash에 다시 lock을 걸어줍니다.

void flash_write()
{
  /* Unlock the Flash to enable the flash control register access *************/
  HAL_FLASH_Unlock();

  /* Program the user Flash area word by word
      (area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/

  Address = FLASH_USER_START_ADDR;
  while (Address < FLASH_USER_END_ADDR)
  {
    if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, DATA_32) == HAL_OK){
      Address = Address + 4;
    } else {
      /* Error occurred while writing data in Flash memory.
           User can add here some code to deal with this error */
      while (1) ;
    }
  }

  /* Lock the Flash to disable the flash control register access (recommended
       to protect the FLASH memory against possible unwanted operation) *********/
  HAL_FLASH_Lock();
}


아래는 CLI로 Flash erase/write/read를 테스트한 화면입니다.

반응형

댓글