ผมลองหาวิธีเม็มค่าลงในชิพ stm32F072 Nucleo ไปเจอจากในเน็ตมากปรับๆดู ผมสร้างฟังชั่นกดปุ่มให้มันเขียนค่าลงไป แล้วผมลอง กดรีเซ็ตที่บอร์ดเพื่อเริ่มการทำงานใหม่ มันก็จะสามารถอ่านค่าได้ตรงกับที่เม็มไว้ แต่ถ้าผมกดรีเซ็ตอีกรอบ มันก็ไม่สามารถอ่านค่าได้แล้ว ต้องกดปุ่มให้เขียนค่าอีกที ถึงจะเรียกอ่านได้อีกรอบ เพิ่งเคยลองเล่นการflash ครั้งแรก ยังไม่มีประสบการณ์เท่าไหร่ ขอคำแนะนำหน่อยครับ
ผมจะอ่านค่าด้วยฟังก์ชั่นนี้
Quotevoid WriteToFlash(uint16_t MemA1){
//Declare and initialize variables
//Unlock Flash
while ((FLASH->SR & FLASH_SR_BSY) != 0); //Wait until flash not busy
if ((FLASH->CR & FLASH_CR_LOCK) != 0){ //If flash is locked, do unlk seq.
FLASH->KEYR = FLASH_KEY1; //Unlock code 1
FLASH->KEYR = FLASH_KEY2; //Unlock code 2
}
//Clear Flags
FLASH->SR |= FLASH_SR_EOP; //Clear end of operation flag
FLASH->SR |= FLASH_SR_WRPRTERR; //Clear write protect error flag
FLASH->SR |= FLASH_SR_PGERR; //Clear programming error
//Erase Page before writing
FLASH->CR |= FLASH_CR_PER; //Enable flash page erase
FLASH->AR = FLASH_PAGE; //Set page to erase
FLASH->CR |= FLASH_CR_STRT; //Start erase
while ((FLASH->SR & FLASH_SR_BSY) != 0);//Wait until flash no busy
if ((FLASH->SR & FLASH_SR_EOP) != 0){ //If flash finished operation
FLASH->SR |= FLASH_SR_EOP; //Clear flag
}
FLASH->CR &= ~FLASH_CR_PER; //Disable page erase
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Write to Page
FLASH->CR |= FLASH_CR_PG; //Write 1 to PG (programming bit)
//*pPage = Temperature; //Write to flash page
*(__IO uint16_t*)(FLASH_PAGE) = MemA1; //GET HARDFAULT HERE. CODE FROM ST
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
while ((FLASH->SR & FLASH_SR_BSY) != 0); //Wait until bus is not busy
if ((FLASH->SR & FLASH_SR_EOP) != 0){ //Check if flash is completed
FLASH->SR |= FLASH_SR_EOP; //Clear flag is flash is complete
}
FLASH->CR &= ~FLASH_CR_PG; //Clear prog bit to disable write to flash
HAL_Delay(10);
}
ผมจะอ่านค่าด้วยฟังก์ชั่นนี้
Quote
uint16_t ReadFromFlash(uint16_t memAdd){
uint16_t InitTemp;
//Read value in flash
InitTemp = *((uint16_t *) (FLASH_PAGE)); //GET HARDFAULT HERE. CODE FROM ST
HAL_Delay(10);
return InitTemp;
}