Здравствуйте
сам я нуб, работаю на STM32CubeIDE у меня проблема со стиранием секторов во внутренней Flash памяти МК STM32F429ZI (DISCO).
Пытался сделать разными способами, через HAL и напрямую регистрами, до появления в коде функции стирания Flash работает штатно.
Если в коде появляется стирание Flash заливка завершается с такой инф.:
Код при этом работает, если заливался через отладку, то и отладка проходит штатно.
После этого при попытке записать изменения на МК через Cube появляется ошибка:
Цитата:
Error message from debugger back end: Error finishing flash
При этом через STMUtility можно стереть Flas и биты. После стирания Flash (биты не влияют) можно снова работать из CubeIDE.
Переключение на OpenOCD не помогает...
Что только не нагуглил. Наиболее вменяемый вариант не устраивает.
https://kkmspb.ru/development/microcont ... 32F205.phpТ.к. ни другого программатора у меня нет, ни Keil'ом ни
не владею...
Может кто сталкивался с проблемой и знает как решить?
Спойлер
Код:
/* USER CODE BEGIN WHILE */
uint32_t time = 0;
uint32_t VarFlach = 0;
HAL_StatusTypeDef flash_IS = HAL_ERROR;
VarFlach = *(__IO uint32_t*)0x08000000;
// +**************************************************************Писать в Flash
while (flash_IS != HAL_OK)
flash_IS = HAL_FLASH_Unlock();
flash_IS = HAL_ERROR;
while (flash_IS != HAL_OK)
{
flash_IS = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, 0x0800C000, 0x89ABCD);
}
flash_IS = HAL_ERROR;
while (flash_IS != HAL_OK)
flash_IS = HAL_FLASH_Lock();
// +**************************************************************Закончить писать в Flash
VarFlach = *(__IO uint32_t*)0x0800C000;
// +**************************************************************Стирать Flash
flash_IS = HAL_ERROR;
while (flash_IS != HAL_OK)
{
flash_IS = HAL_FLASH_Unlock();
}
FLASH_EraseInitTypeDef strToErase;
strToErase.Banks = FLASH_BANK_1;
strToErase.Sector = FLASH_SECTOR_3;
strToErase.NbSectors = 1;
strToErase.TypeErase = FLASH_TYPEERASE_SECTORS;
strToErase.VoltageRange = FLASH_VOLTAGE_RANGE_3;
uint32_t sectorError = 0;
//HAL_FLASHEx_Erase(&strToErase, §orError); //Вариант 1
//HAL_FLASHEx_Erase_IT(&strToErase); //Вариант 2
//FLASH_Erase_Sector(FLASH_SECTOR_3, FLASH_VOLTAGE_RANGE_3); //Вариант 3
//if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE)==HAL_OK) //Вариант 3
// VarFlach = 0; //Вариант 3
CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE); //Вариант 4
FLASH->CR |= FLASH_PSIZE_WORD; //Вариант 4
CLEAR_BIT(FLASH->CR, FLASH_CR_SNB); //Вариант 4
FLASH->CR |= FLASH_CR_SER | (FLASH_SECTOR_3 << FLASH_CR_SNB_Pos); //Вариант 4
FLASH->CR |= FLASH_CR_STRT; //Вариант 4
while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY) != RESET) //Вариант 4
{
;
}
/* If the erase operation is completed, disable the SER and SNB Bits */
CLEAR_BIT(FLASH->CR, (FLASH_CR_SER | FLASH_CR_SNB));
flash_IS = HAL_ERROR;
while (flash_IS != HAL_OK)
flash_IS = HAL_FLASH_Lock();
// +**************************************************************Закончить стирать Flash
VarFlach = *(__IO uint32_t*)0x0800C000;
//VarFlach = FLASH->SR;
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);//set is On
HAL_GPIO_WritePin(GPIOG, GPIO_PIN_14, GPIO_PIN_RESET);//set is Off
while (1)
{
if (VarFlach==0x89ABCD)
if ((HAL_GetTick()-time)>1000)
{
HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13 | GPIO_PIN_14);
time = HAL_GetTick();
}
/* USER CODE END WHILE */