|
|
  |
STM32 flash, помогите разобраться |
|
|
|
May 30 2014, 07:34
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
В документации написано что шина данных FLASH памяти у STM32 128-ми битная. Но при этом в коде startup, где идет инициализация переменных в ОЗУ, копирование идет по 4 байта (32 бита) инструкции Код ... ldr r3, [r3, r1] str r3, [r0, r1] adds r1, r1, #4 ... У ST есть AppNote EEPROM emulation in STM32F10x microcontrollers, где при чтении из FLASH (виртуальной EEPROM) копируются 16-ти битные данные Код /** * @brief Returns the last stored variable data, if found, which correspond to * the passed virtual address * @param VirtAddress: Variable virtual address * @param Data: Global variable contains the read variable value * @retval Success or error status: * - 0: if variable was found * - 1: if the variable was not found * - NO_VALID_PAGE: if no valid page was found. */ uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data) Как же все-таки читается FLASH? А если мне надо только один байт прочитать из FLASH ?
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 30 2014, 09:37
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(dimka76 @ May 30 2014, 15:44)  В документации написано что шина данных FLASH памяти у STM32 128-ми битная. ... Как же все-таки читается FLASH? А если мне надо только один байт прочитать из FLASH ? Процессор может свободно читать и один байт, и 32-разрядное слово. Грубо говоря, контроллер флэш подсовывает процессору из этих 128 бит только те, которые ему нужны. Всё это волшебство происходит автоматически и незаметно. Цитата(dimka76 @ May 30 2014, 15:44)  У ST есть AppNote EEPROM emulation in STM32F10x microcontrollers, где при чтении из FLASH (виртуальной EEPROM) копируются 16-ти битные данные Запись - это совсем другая история. Обычно у флэш есть минимальная ячейка памяти, меньше которой записать нельзя. Для STM32F1 это 16 бит. Кстати, в семействах STM32F2 и STM32F4 флэш устроена иначе, и записывать можно даже 1 байт за раз, что открывает новые возможности для эмуляции EEPROM.
|
|
|
|
|
May 30 2014, 14:23
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Спасибо всем ответившим. Цитата(scifi @ May 30 2014, 17:47)  Запись - это совсем другая история. Обычно у флэш есть минимальная ячейка памяти, меньше которой записать нельзя. Для STM32F1 это 16 бит. Кстати, в семействах STM32F2 и STM32F4 флэш устроена иначе, и записывать можно даже 1 байт за раз, что открывает новые возможности для эмуляции EEPROM. Про запись я не спрашивал ;-) А по поводу флэш в STM32F2xx очень полезное замечание, т.к. с ним и работаю. А указанный выше AppNote просто первым подвернулось, и я думал, что у всех STM32F память устроена одинакого. Еще один вопрос. Скомпилировал для STM32F2xx следующую строчку, где raw_data константы во флэш. Компилятор GCC. Код uint8_t raw_data[118660] __attribute__ ((section (".ordata"))); uint8_t appdata[10000]; for(i=0; i<10000UL; ++i) appdata[i] = raw_data[i]; И вот, что наблюдаю в листинге Код 8001a6e: f242 7410 movw r4, #10000 8001a72: 5cb8 ldrb r0, [r7, r2] 8001a74: 6819 ldr r1, [r3, #0] 8001a76: f8df a20c ldr.w sl, [pc, #524] 8001a7a: 5488 strb r0, [r1, r2] 8001a7c: 3201 adds r2, #1 8001a7e: 42a2 cmp r2, r4 8001a80: d1f7 bne.n 8001a72 Мне непонятна строчка Код ldr.w sl, [pc, #524] Что она делает ? Ведь в цикле регистр sl вообще не используется, зачем в него что-то загружается ? И при чем всегда одно и тоже.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
May 31 2014, 01:07
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(dimka76 @ May 31 2014, 00:33)  Код 8001a6e: f242 7410 movw r4, #10000 8001a72: 5cb8 ldrb r0, [r7, r2] 8001a74: 6819 ldr r1, [r3, #0] 8001a76: f8df a20c ldr.w sl, [pc, #524] 8001a7a: 5488 strb r0, [r1, r2] 8001a7c: 3201 adds r2, #1 8001a7e: 42a2 cmp r2, r4 8001a80: d1f7 bne.n 8001a72 Строчка Код ldr.w sl, [pc, #524] явно лишняя, как и строчка Код ldr r1, [r3, #0] в цикле. У вас указатель appdata не volatile случайно?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 20 2014, 11:17
|
Частый гость
 
Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587

|
Читал. Правда не в Programming manual, а в Reference manual, одно и то же слово в слово. Все-равно не работает. Написано "Each OTP data block can be programmed until the value 0x00 is programmed in the corresponding OTP lock byte." Так и делаю, пишу один байт (либо слово (32 бит), либо 4 слова сразу) нулей по адресу 0x1FFF7A00. После чего пробую записать 32-байтное слово по адресу 0x1FFF7820. Смотрю состояние памяти - остается без изменений (все единицы). Что я делаю не так? Может перед этим еще где-то надо какую-то блокировку снять? Вот кусок кода: Код uint32_t* pLockBlock = (uint8_t)0x1FFF7A00; *pLockBlock = 0; uint32_t* pData = (uint32_t)0x1FFF7800; *pData = 0xAA55AA55; Может я с указателями что-то напутал?
Сообщение отредактировал Haamu - Jun 20 2014, 11:19
|
|
|
|
|
Jun 20 2014, 11:42
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Haamu @ Jun 20 2014, 15:17)  Так и делаю, пишу один байт (либо слово (32 бит), либо 4 слова сразу) нулей по адресу 0x1FFF7A00. Код uint32_t* pLockBlock = (uint8_t)0x1FFF7A00; *pLockBlock = 0; Что-то странно вы пишите - запись 0 по адресу 0. Может так: Код uint32_t* pLockBlock = (uint32_t *)0x1FFF7A00; *pLockBlock = 0; Цитата(Haamu @ Jun 20 2014, 15:17)  После чего пробую записать 32-байтное слово по адресу 0x1FFF7820. Смотрю состояние памяти - остается без изменений (все единицы). Код uint32_t* pData = (uint32_t)0x1FFF7800; *pData = 0xAA55AA55; Код uint32_t* pData = (uint32_t *)0x1FFF7800; *pData = 0xAA55AA55;
|
|
|
|
|
Jun 20 2014, 12:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Haamu @ Jun 20 2014, 14:17)  пишу один байт (либо слово (32 бит), либо 4 слова сразу) нулей по адресу 0x1FFF7A00. После чего пробую записать 32-байтное слово по адресу 0x1FFF7820. То есть делаете с точность до наоборот от того, что написано в документации. Там написано: после того, как записали 0 в 0x1FFF7A00 - сушите весла, больше ничего программироваться не будет. Цитата Each OTP data block can be programmed until the value 0x00 is programmed in the corresponding OTP lock byte. Ну и с учетом этого - даже хорошо, что вы писали неправильно (см. сообщение Артема). Это раз. И второе - я так понял, что писать эти байты надо так же, как и остальную флеш, то есть через регистры FLASH_KEY, FLASH_CR, FLASH_SR.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|