Катастрофия!!! Код записи во FLASH, Который прекрасно работал и на
STM32F103 и на GD32F103, ушел в продакшен тысячей экземпляров.
Перестал работать на свежекупленном GD32F103C8T6. Все в норме, схема стандартная... //
void WriteIntEEPROM(unsigned char* b, unsigned char* adr, unsigned short N)
{
#if UseOTLADKA!=0
putstrfifo0("\n\rвключить внутрений генератор\n\r");
Delay(10);
#endif
{//включить внутрений генератор
LL_RCC_HSI_Enable();
//Wait till HSI is ready
while(LL_RCC_HSI_IsReady() == 0) {;}
}
#if UseOTLADKA!=0
putstrfifo0("\n\rзапретить прерывания\n\r");
Delay(10);
#endif
__disable_irq(); // запретить прерывания
//__disable_interrupt(); // запретить прерывания
{//Разблокировка
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;
}
{//Стирание страницы flash
while (FLASH->SR & FLASH_SR_BSY);
if(FLASH->SR & FLASH_SR_EOP) { FLASH->SR = FLASH_SR_EOP;}
FLASH->CR |= FLASH_CR_PER;
FLASH->AR = (unsigned long)adr;
FLASH->CR |= FLASH_CR_STRT;
while (!(FLASH->SR & FLASH_SR_EOP));
FLASH->SR = FLASH_SR_EOP;
FLASH->CR &= ~FLASH_CR_PER;
}
{//Запись
while (FLASH->SR & FLASH_SR_BSY);
if(FLASH->SR & FLASH_SR_EOP) {FLASH->SR = FLASH_SR_EOP;}
FLASH->CR |= FLASH_CR_PG;
for(int i=0; i<((N+1)&0x3FE); i=i+2)
{
*(volatile unsigned short*)(adr + i) = *((unsigned short*)(&(b[i])));
while(!(FLASH->SR & FLASH_SR_EOP));
FLASH->SR = FLASH_SR_EOP;
}
FLASH->CR &= ~(FLASH_CR_PG);
}
{//Блокировка
FLASH->CR |= FLASH_CR_LOCK;
}
__enable_irq();
//__enable_interrupt();
return;
}
// Доходит до __disable_interrupt();, дальше проверить не могу.
Кейловским дебагером вижу останов на адресе 0x08000580. Как искать проблему?