Доброе время суток!) Продолжаем тему 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”
Atmel делает MCU на ядре Cortex M4 – SAM4
Макетки тоже есть
Согласен, хорошая вещь
Comments are closed.