Доброе время суток!) Продолжаем тему 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.