Старт ARM. Эта ужасная FLASH от STM32. HAL

Доброе время суток!) Продолжаем тему stm32f4, сегодня в нашем вооружении stm32f429i –disco и в качестве лабораторного зверька встроенная flash память, а точнее EEPROM. И что тут сказать «Надо высказать ФЕ-ФЕ-ФЕ st. Ребята, что вы делаете!!!». Так, а чем я…
1) Время стирания сектора от 1 до 3 сек.
2) Один байт в память(ПЗУ) будет записываться 30 мкс до 237.25 мс.
3) Читаем один байт 0.68мкс до 251мкс.
4) Как только вы падаете в момент стирания сектора или банка памяти, например, из MDK Keil, нам ПО говорит (режим отладки): «Друг обломись…»
5) AND память, то есть если повторно пишу в тут же область памяти значение, то запишется меньшое их 2-х значений и так до 0.
Ладно, пару строк кода и мы свами и убедимся в перечисленном.


Отладка микроконтроллера

int main(void)
{
	HAL_StatusTypeDef	flash_ok = HAL_ERROR;
	
  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* System interrupt init*/
  /* Sets the priority grouping field */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

	//##################################################################
	//Делаем память открытой
	while(flash_ok != HAL_OK){
		flash_ok = HAL_FLASH_Unlock();
	}
	//Записываем в память значение 0x7777
	//##################################################################
	flash_ok = HAL_ERROR;
	while(flash_ok != HAL_OK){
		flash_ok = HAL_FLASH_Program(TYPEPROGRAM_WORD, 0x08100000, 0x7777);
	}	
	//Закрываем память
	flash_ok = HAL_ERROR;
	while(flash_ok != HAL_OK){
		flash_ok = HAL_FLASH_Lock();
	}
//..........................................................................
	flash_ok = HAL_ERROR;
	while(flash_ok != HAL_OK){
		flash_ok = HAL_FLASH_Unlock();
	}
	//Стираем память
	FLASH_Erase_Sector(FLASH_SECTOR_12, VOLTAGE_RANGE_3);

	flash_ok = HAL_ERROR;
	while(flash_ok != HAL_OK){
		flash_ok = HAL_FLASH_Lock();
	}

	flash_ok = HAL_ERROR;
	while(flash_ok != HAL_OK){
		flash_ok = HAL_FLASH_Unlock();
	}	
	flash_ok = HAL_ERROR;
	while(flash_ok != HAL_OK){
		flash_ok = HAL_FLASH_Program(TYPEPROGRAM_WORD, 0x08100000, 0x8888);
	}	
	flash_ok = HAL_ERROR;
	while(flash_ok != HAL_OK){
		flash_ok = HAL_FLASH_Lock();
	}

	
  /* Infinite loop */
  while (1)
  {

  }
  /* USER CODE END 3 */

}

А сейчас немного поизвращаемся, сделаем цикл который будет стирать память 10 раз и перед началом стирания включим светодиод, а после стирания памяти его выключим. И тут нас ждет костыль, если мы напишем так:

	HAL_FLASH_Unlock();
	HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);
	for(iter = 0; iter < 10; iter++){
		FLASH_Erase_Sector(FLASH_SECTOR_12, VOLTAGE_RANGE_3);
		HAL_Delay(1000);
	}
	HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);
	HAL_FLASH_Lock();

Все будет работать, а если так:

	HAL_FLASH_Unlock();
	HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);
	for(iter = 0; iter < 10; iter++){
		FLASH_Erase_Sector(FLASH_SECTOR_12, VOLTAGE_RANGE_3);
	}
	HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);
	HAL_FLASH_Lock();

Так микроконтроллер просто подвиснет, вот же…
Еще пару слов на счет как можно стирать память. Есть хорошая утилита STM32 ST-LINK Utility, которая позволяет работать с памятью микроконтроллера. Так же таблица организации память, что бы быстро посмотреть и заюзать нужную область(stm32f429xx, stm32f439xx).
БАНК 1
Сектор 0 – 0x08000000, 16К
Сектор 1 – 0x08004000, 16К
Сектор 2 – 0x08008000, 16К
Сектор 3 – 0x0800С000, 16К
Сектор 4 – 0x08010000, 64 K
Сектор 5 – 0x08020000, 128 К
Сектор 6 – 0x08040000, 128 К
Сектор 7 – 0x08060000, 128 К
Сектор 8 – 0x08080000, 128 К
Сектор 9 – 0x080A0000, 128 К
Сектор 10 – 0x080C0000, 128 К
Сектор 11 – 0x080E0000, 128 К
БАНК 2
Сектор 12 – 0x08100000, 16К
Сектор 13 – 0x08104000, 16К
Сектор 14 – 0x08108000, 16К
Сектор 15 – 0x0810С000, 16К
Сектор 16 – 0x08110000, 64 K
Сектор 17 – 0x08120000, 128 К
Сектор 18 – 0x08140000, 128 К
Сектор 19 – 0x08160000, 128 К
Сектор 20 – 0x08180000, 128 К
Сектор 21 – 0x081A0000, 128 К
Сектор 22 – 0x081C0000, 128 К
Сектор 23 – 0x081E0000, 128 К


утилита STM32 ST-LINK Utility

Жаль, что Atmel не выпускает Cortex M4. Память, например at91sam3u(cortex M3) быстрая и там настоящая flash, все происходит на лету. На сегодня все! Всем пока!
Проект flash_stm32f429zi

2 thoughts on “Старт ARM. Эта ужасная FLASH от STM32. HAL

  1. Atmel делает MCU на ядре Cortex M4 – SAM4
    Макетки тоже есть

Comments are closed.