dimka76 63 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба В документации написано что шина данных 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 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба Как же все-таки читается FLASH? Как угодно: разрядность шины flash для ядра прозрачна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба В документации написано что шина данных FLASH памяти у STM32 128-ми битная. ... Как же все-таки читается FLASH? А если мне надо только один байт прочитать из FLASH ? Процессор может свободно читать и один байт, и 32-разрядное слово. Грубо говоря, контроллер флэш подсовывает процессору из этих 128 бит только те, которые ему нужны. Всё это волшебство происходит автоматически и незаметно. У ST есть AppNote EEPROM emulation in STM32F10x microcontrollers, где при чтении из FLASH (виртуальной EEPROM) копируются 16-ти битные данные Запись - это совсем другая история. Обычно у флэш есть минимальная ячейка памяти, меньше которой записать нельзя. Для STM32F1 это 16 бит. Кстати, в семействах STM32F2 и STM32F4 флэш устроена иначе, и записывать можно даже 1 байт за раз, что открывает новые возможности для эмуляции EEPROM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба Спасибо всем ответившим. Запись - это совсем другая история. Обычно у флэш есть минимальная ячейка памяти, меньше которой записать нельзя. Для 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 вообще не используется, зачем в него что-то загружается ? И при чем всегда одно и тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 30 мая, 2014 Опубликовано 30 мая, 2014 · Жалоба регистр SL - это стэк лимит, а вот зачем в него что-то в цикле пихать постоянно... хрен знает... может тут SL просто 10 регистр и все? как временный используется... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kan35 7 31 мая, 2014 Опубликовано 31 мая, 2014 · Жалоба Между памятью и ядром есть прослойка в виде например ART акселератора. Если память работает на частоте 32МГц, то как инструкции могут поступать с частотой 180МГц?.. - вот потому и за 1 обращение вычитывается от 4 до 8 инструкций. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 31 мая, 2014 Опубликовано 31 мая, 2014 · Жалоба 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 случайно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 63 1 июня, 2014 Опубликовано 1 июня, 2014 · Жалоба У вас указатель appdata не volatile случайно? Нет, не волатиле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Haamu 0 20 июня, 2014 Опубликовано 20 июня, 2014 (изменено) · Жалоба Чтобы не плодить новых тем, продолжу эту. Во flash-памяти контроллера STM32F407 есть такая область под названием "OTP (one-time programmable) area", состоящая из 15 блоков по 32 байта памяти и 16 байт блока защиты. У кого есть опыт работы с этой областью памяти, подскажите пожалуйста, в какой последовательности действовать, чтобы записать туда что-либо? Изменено 20 июня, 2014 пользователем Haamu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 20 июня, 2014 Опубликовано 20 июня, 2014 · Жалоба подскажите пожалуйста, в какой последовательности действовать, чтобы записать туда что-либо?www.st.com->Products->Microcontrollers->STM32 ARM Cortex MCU->STM32F4 series->Programming manuals->PM0081 STM32F40xxx and STM32F41xxx Flash programming manual->1.7 One-time programmable bytes Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Haamu 0 20 июня, 2014 Опубликовано 20 июня, 2014 (изменено) · Жалоба Читал. Правда не в 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; Может я с указателями что-то напутал? Изменено 20 июня, 2014 пользователем Haamu Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 20 июня, 2014 Опубликовано 20 июня, 2014 · Жалоба Так и делаю, пишу один байт (либо слово (32 бит), либо 4 слова сразу) нулей по адресу 0x1FFF7A00. uint32_t* pLockBlock = (uint8_t)0x1FFF7A00; *pLockBlock = 0; Что-то странно вы пишите - запись 0 по адресу 0. Может так: uint32_t* pLockBlock = (uint32_t *)0x1FFF7A00; *pLockBlock = 0; После чего пробую записать 32-байтное слово по адресу 0x1FFF7820. Смотрю состояние памяти - остается без изменений (все единицы). uint32_t* pData = (uint32_t)0x1FFF7800; *pData = 0xAA55AA55; uint32_t* pData = (uint32_t *)0x1FFF7800; *pData = 0xAA55AA55; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 20 июня, 2014 Опубликовано 20 июня, 2014 · Жалоба пишу один байт (либо слово (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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 1 июля, 2014 Опубликовано 1 июля, 2014 · Жалоба Кстати, в семействах STM32F2 и STM32F4 флэш устроена иначе, и записывать можно даже 1 байт за раз, что открывает новые возможности для эмуляции EEPROM. Вот задумался сделать обновление программы по-простому. Приму по USART во внешнюю RAM весь file.bin, а потом попробую записать. Смогу ли? Если можно записывать (и стирать, значит?) по байтам? Когда подберется к месту, где находится сама запись во флэш, команды-то в буфере будут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 июля, 2014 Опубликовано 1 июля, 2014 · Жалоба Если можно записывать (и стирать, значит?) по байтам? Нет, конечно. Стирается целый сектор. Иначе это была бы не флеш, а EEPROM. Там и другая проблема: если прервать прошивку, то устройство превращается в кирпич. Поэтому нужен загрузчик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться