Перейти к содержанию
    

В документации написано что шина данных 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 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как же все-таки читается FLASH?

Как угодно: разрядность шины flash для ядра прозрачна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В документации написано что шина данных FLASH памяти у STM32 128-ми битная.

...

Как же все-таки читается FLASH?

А если мне надо только один байт прочитать из FLASH ?

Процессор может свободно читать и один байт, и 32-разрядное слово. Грубо говоря, контроллер флэш подсовывает процессору из этих 128 бит только те, которые ему нужны. Всё это волшебство происходит автоматически и незаметно.

 

У ST есть AppNote EEPROM emulation in STM32F10x microcontrollers, где при чтении из FLASH (виртуальной EEPROM) копируются 16-ти битные данные

Запись - это совсем другая история. Обычно у флэш есть минимальная ячейка памяти, меньше которой записать нельзя. Для STM32F1 это 16 бит. Кстати, в семействах STM32F2 и STM32F4 флэш устроена иначе, и записывать можно даже 1 байт за раз, что открывает новые возможности для эмуляции EEPROM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо всем ответившим.

 

Запись - это совсем другая история. Обычно у флэш есть минимальная ячейка памяти, меньше которой записать нельзя. Для 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 вообще не используется, зачем в него что-то загружается ? И при чем всегда одно и тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

регистр SL - это стэк лимит, а вот зачем в него что-то в цикле пихать постоянно... хрен знает...

 

может тут SL просто 10 регистр и все? как временный используется...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Между памятью и ядром есть прослойка в виде например ART акселератора. Если память работает на частоте 32МГц, то как инструкции могут поступать с частотой 180МГц?.. - вот потому и за 1 обращение вычитывается от 4 до 8 инструкций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 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 случайно?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы не плодить новых тем, продолжу эту.

Во flash-памяти контроллера STM32F407 есть такая область под названием "OTP (one-time programmable) area", состоящая из 15 блоков по 32 байта памяти и 16 байт блока защиты. У кого есть опыт работы с этой областью памяти, подскажите пожалуйста, в какой последовательности действовать, чтобы записать туда что-либо?

Изменено пользователем Haamu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите пожалуйста, в какой последовательности действовать, чтобы записать туда что-либо?
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Читал. Правда не в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так и делаю, пишу один байт (либо слово (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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

пишу один байт (либо слово (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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, в семействах STM32F2 и STM32F4 флэш устроена иначе, и записывать можно даже 1 байт за раз, что открывает новые возможности для эмуляции EEPROM.

Вот задумался сделать обновление программы по-простому. Приму по USART во внешнюю RAM весь file.bin, а потом попробую записать. Смогу ли? Если можно записывать (и стирать, значит?) по байтам? Когда подберется к месту, где находится сама запись во флэш, команды-то в буфере будут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если можно записывать (и стирать, значит?) по байтам?

Нет, конечно. Стирается целый сектор. Иначе это была бы не флеш, а EEPROM.

Там и другая проблема: если прервать прошивку, то устройство превращается в кирпич. Поэтому нужен загрузчик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...