Sector de borrado de Flash STM32 0

0

Tengo un proyecto actualizable con stm32f407. Código producido por cubeMx. El código del actualizador comprueba la nueva actualización de Internet y, si está disponible, escriba el programa principal en 0x08020000 (sector 5) y este código del actualizador en 0x08000000 (sector 0 y sector 2 el tamaño es menor a 32kb)

Estoy escribiendo un código (será como el proyecto principal en el sector 5), puedo actualizar el código del actualizador en el sector 0

Mi problema es cuando borro el sector 0 AC6 y doy un error para ajustar la dirección y STM32 deja de funcionar. Creo que es debido a que el sector 0 tiene una situación especial. No hay problema con borrar otros sectores. ¿Hay alguna forma de borrar sector0 con un programa incrustado? El problema comienza después de eliminar 1 sector. No se que hacer. (perdón por mi mal inglés)

                              for(data_sayac=0;data_sayac<=filelength/2;data_sayac+=2)
                              {
                                 // UPDATEDATA_ADDRESS defined 0x08040000 (sector 6 where my new updater data copied from internet)
                                 // UPDATEDATA_ADDRESS2 defined 0x08000000 (sector 0 where my new updater program copied from sector 6)
                                  Data1=Flash_oku_halfword(UPDATEDATA_ADDRESS+data_sayac);
                                  if(Flash_oku_halfword(UPDATEDATA_ADDRESS2+data_sayac)!=0xFFFF)  // if sector is not empty erase first
                                  {
                                     HAL_FLASH_Unlock();
                                     Get_Sector= FLASH_If_GetSectorNumber(UPDATEDATA_ADDRESS2+data_sayac);  // get sector number by address
                                     FLASH_Erase_Sector(Get_Sector,VOLTAGE_RANGE_3);            //erase sector
                                  }
                                  Flash_yaz_halfword(UPDATEDATA_ADDRESS2+data_sayac,Data1);  // write halfword

                              }
    
pregunta user164200

1 respuesta

0
  

Mi problema es cuando borro el sector 0 AC6 y doy un error para el ajuste de direcciones

Recuerde que el primer elemento en la página cero es la tabla de vectores de interrupción.

Su problema se parece mucho a que tiene habilitadas las interrupciones. Esto solo funcionaría en caso de que moviera la tabla vectorial a una dirección RAM utilizando el registro SCB->VTOR . Tenga en cuenta que la tabla de vectores necesita una dirección con el byte más bajo todos cero (256 bytes alineados).

  

¿Hay alguna forma de borrar sector0 con un programa incorporado?

Esto usualmente necesita un poco de preparación:

  1. inhabilita las interrupciones (o usa VTOR arriba)
  2. borrar página
  3. escribir nuevo contenido de la página
  4. habilitar interrupciones

Un fallo de alimentación (o cualquier otro reinicio) podría " brick " el dispositivo, si ocurriera entre El borrado y la nueva escritura.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas