2026-02-07 2:25 AM
I have a question about writing to the STM32F410's FLASH.
I'm creating a program to write data received via USART to FLASH, but it's not working correctly.
The writing to FLASH itself is happening, but the written data differs from what I expect.
This different written data contains a large number of “0xAA” values that are not present in the original data.
Do you know what might be causing this phenomenon?
void FLASH_UNLOCK(){
while ((FLASH->SR & FLASH_SR_BSY) != 0){
}
if ((FLASH->CR & FLASH_CR_LOCK) != 0)
{
FLASH->KEYR = 0x45670123;
FLASH->KEYR = 0xCDEF89AB;
}
}
void FLASH_DELETE(uint32_t address){
while ((FLASH->SR & FLASH_SR_BSY) != 0){
}
FLASH->CR |= FLASH_CR_SER;
FLASH->CR |= (FLASH_CR_SNB & 0x8);
FLASH->CR |= FLASH_CR_STRT;
while ((FLASH->SR & FLASH_SR_BSY) != 0){
}
if ((FLASH->SR & FLASH_SR_EOP) != 0)
{
FLASH->SR |= FLASH_SR_EOP;
}
else
{
}
FLASH->CR &= ~FLASH_CR_SER;
}
void FLASH_Write(uint32_t address, uint8_t data){
while ((FLASH->SR & FLASH_SR_BSY) != 0){
}
FLASH->CR |= FLASH_CR_PG;
*(__IO uint8_t*)address = data;
while ((FLASH->SR & FLASH_SR_BSY) != 0){
}
if ((FLASH->SR & FLASH_SR_EOP) != 0)
{
FLASH->SR |= FLASH_SR_EOP;
}
else
{
}
FLASH->CR &= ~FLASH_CR_PG;
}
const uint32_t main_address = 0x08004000; //sector1 start
const uint32_t end_adress = 0x08007FFF; //sector1 end
const uint32_t next_code = 0x00000100; // 256B=0x100B
void binary_write(){
uint16_t i;
for(i=0;i<256;i++){
bin_data[i] = send_data[i+0x9];
}
switch(send_data[8]){
case 1: re_address = main_address + next_code * 0; break; //0x08004000~0x080040F0
case 2: re_address = main_address + next_code * 1; break; //0x08004100~0x080041F0
case 3: re_address = main_address + next_code * 2; break;
case 4: re_address = main_address + next_code * 3; break;
case 5: re_address = main_address + next_code * 4; break;
case 6: re_address = main_address + next_code * 5; break;
case 7: re_address = main_address + next_code * 6; break;
case 8: re_address = main_address + next_code * 7; break;
case 9: re_address = main_address + next_code * 8; break;
case 10: re_address = main_address + next_code * 9; break;
case 11: re_address = main_address + next_code * 10; break;
case 12: re_address = main_address + next_code * 11; break;
case 13: re_address = main_address + next_code * 12; break;
case 14: re_address = main_address + next_code * 13; break;
case 15: re_address = main_address + next_code * 14; break;
case 16: re_address = main_address + next_code * 15; break;
case 17: re_address = main_address + next_code * 16; break;
case 18: re_address = main_address + next_code * 17; break;
case 19: re_address = main_address + next_code * 18; break;
case 20: re_address = main_address + next_code * 19; break;
case 21: re_address = main_address + next_code * 20; break;
case 22: re_address = main_address + next_code * 21; break;
case 23: re_address = main_address + next_code * 22; break;
case 24: re_address = main_address + next_code * 23; break;
case 25: re_address = main_address + next_code * 24; break;
case 26: re_address = main_address + next_code * 25; break;
case 27: re_address = main_address + next_code * 26; break;
case 28: re_address = main_address + next_code * 27; break;
case 29: re_address = main_address + next_code * 28; break;
case 30: re_address = main_address + next_code * 29; break;
case 31: re_address = main_address + next_code * 30; break;
case 32: re_address = main_address + next_code * 31; break;
case 33: re_address = main_address + next_code * 32; break;
case 34: re_address = main_address + next_code * 33; break;
case 35: re_address = main_address + next_code * 34; break;
case 36: re_address = main_address + next_code * 35; break;
case 37: re_address = main_address + next_code * 36; break;
case 38: re_address = main_address + next_code * 37; break;
case 39: re_address = main_address + next_code * 38; break;
case 40: re_address = main_address + next_code * 39; break;
case 41: re_address = main_address + next_code * 40; break;
case 42: re_address = main_address + next_code * 41; break;
case 43: re_address = main_address + next_code * 42; break;
case 44: re_address = main_address + next_code * 43; break;
case 45: re_address = main_address + next_code * 44; break;
case 46: re_address = main_address + next_code * 45; break;
case 47: re_address = main_address + next_code * 46; break;
case 48: re_address = main_address + next_code * 47; break;
case 49: re_address = main_address + next_code * 48; break;
case 50: re_address = main_address + next_code * 49; break;
case 51: re_address = main_address + next_code * 50; break;
case 52: re_address = main_address + next_code * 51; break;
case 53: re_address = main_address + next_code * 52; break;
case 54: re_address = main_address + next_code * 53; break;
case 55: re_address = main_address + next_code * 54; break;
case 56: re_address = main_address + next_code * 55; break;
case 57: re_address = main_address + next_code * 56; break;
case 58: re_address = main_address + next_code * 57; break;
case 59: re_address = main_address + next_code * 58; break;
case 60: re_address = main_address + next_code * 59; break;
case 61: re_address = main_address + next_code * 60; break;
case 62: re_address = main_address + next_code * 61; break;
case 63: re_address = main_address + next_code * 62; break;
case 64: re_address = main_address + next_code * 63; break;
default: break;
}
__disable_irq();
FLASH_UNLOCK();
for(i=0;i<256;i++){
FLASH_Write(re_address+i,bin_data[i]);
}
sum_match++;
__enable_irq();
}
void StartCode_222(){
if((st222>30) && (Ready_flg==0)){
Ready_flg = 1;
HAL_TIM_Base_Stop_IT(&htim11);//timer stop!!
}
if(Ready_flg==1){
if((send_data[1]==0x54)&&(send_data[2]==0x45)&&(send_data[3]==0x4c)&&(send_data[4]==0x4d)&&(send_data[5]==0x49)&&(send_data[6]==0x43)){
if((send_data[7]==0x7F)&&(delete_flag==0)){
__disable_irq();
FLASH_UNLOCK();
FLASH_DELETE(0x01);
__enable_irq();
delete_flag = 1;
}
if((send_data[8]>0)&&(send_data[8]<65)){
binary_write();
}
}
}
}