STM32 - FLASH write
FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector, uint8_t VoltageRange); FLASH_Status FLASH_EraseAllSectors(uint8_t VoltageRange); |
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data); FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data); |
지우기는 섹터단위이고, 쓰기는 주소이다. 각 섹터의 주소가 어디인지 알아야한다.
현재 상태나, 이전 쓰기,지우기등의 동작 결과 확인함수
FLASH_Status FLASH_GetStatus(void); FLASH_Status FLASH_WaitForLastOperation(void); |
리턴값은 아래와 같다.
typedef enum { FLASH_BUSY = 1, FLASH_ERROR_PGS, FLASH_ERROR_PGP, FLASH_ERROR_PGA, FLASH_ERROR_WRP, FLASH_ERROR_PROGRAM, FLASH_ERROR_OPERATION, FLASH_COMPLETE }FLASH_Status; |
전압이 너무 낮으면, 사용할 수 없다. 현재 사용하는 전압을 설정해준다.
"꼭 해야되?"
=>CPU 전압에 따라 동작할 수 도 있고, 안될 수 도 있다.
#define VoltageRange_1 ((uint8_t)0x00) /*!< Device operating range: 1.8V to 2.1V */ #define VoltageRange_2 ((uint8_t)0x01) /*!<Device operating range: 2.1V to 2.7V */ #define VoltageRange_3 ((uint8_t)0x02) /*!<Device operating range: 2.7V to 3.6V */ #define VoltageRange_4 ((uint8_t)0x03) /*!<Device operating range: 2.7V to 3.6V + External Vpp */ |
#define FLASH_Sector_0 ((uint16_t)0x0000) /*!< Sector Number 0 */ #define FLASH_Sector_1 ((uint16_t)0x0008) /*!< Sector Number 1 */ #define FLASH_Sector_2 ((uint16_t)0x0010) /*!< Sector Number 2 */ #define FLASH_Sector_3 ((uint16_t)0x0018) /*!< Sector Number 3 */ #define FLASH_Sector_4 ((uint16_t)0x0020) /*!< Sector Number 4 */ #define FLASH_Sector_5 ((uint16_t)0x0028) /*!< Sector Number 5 */ #define FLASH_Sector_6 ((uint16_t)0x0030) /*!< Sector Number 6 */ #define FLASH_Sector_7 ((uint16_t)0x0038) /*!< Sector Number 7 */ #define FLASH_Sector_8 ((uint16_t)0x0040) /*!< Sector Number 8 */ #define FLASH_Sector_9 ((uint16_t)0x0048) /*!< Sector Number 9 */ #define FLASH_Sector_10 ((uint16_t)0x0050) /*!< Sector Number 10 */ #define FLASH_Sector_11 ((uint16_t)0x0058) /*!< Sector Number 11 */ |
내장된 플래시메모리는, 코드가 실행중에는 삭제/쓰기가 안된다.(읽기는 됨)
그래서 RAM에 쓰기관련 코드를 올려서, RAM에서 실행하면서, FLASH에 쓰면, 모든 영역의 FLASH에 쓰기를 할 수 있다.
FLASH가 섹터별로 나뉜 이유는, 사용하지 않는 섹터는 쓰기가 가능하다.
따라서, FLASH 사이즈가 256k이고, 프로그램 코드가 64k인 경우, 64k를 제외한 나머지 영역에 존재하는 섹터는 데이터용으로 쓰기가 가능하다.
IAP와 같은 부트로더 제작도 가능.
In-Application Programming (IAP)
위 표는 "STMicroelectronics flash loader.exe"화면에 나온다.
FLASH_Latency_2, VoltageRange_1 정도로 설정하면, 동작함.
프로그램코드도 지워진다.(정지함)
FLASH는 EEPROM과 달리, 한번 기록되면, 다시쓰기위해 Erase해주어야한다.
또한, EEPROM처럼 수시로 업데이트가 불가능하다.
한번 저장하면, 오래 사용하는 데이터를 저장하기에 적당한 메모리이다.
FLASH_Unlock();
쓰기()
FLASH_Lock();