Jump to content

    
Sign in to follow this  
dimka76

STM32 flash

Recommended Posts

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

Share this post


Link to post
Share on other sites
В документации написано что шина данных FLASH памяти у STM32 128-ми битная.

...

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

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

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
 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 случайно?

 

 

Share this post


Link to post
Share on other sites

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

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

Edited by Haamu

Share this post


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

Share this post


Link to post
Share on other sites

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

Может я с указателями что-то напутал?

Edited by Haamu

Share this post


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

Share this post


Link to post
Share on other sites
пишу один байт (либо слово (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.

Share this post


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

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

Share this post


Link to post
Share on other sites
Если можно записывать (и стирать, значит?) по байтам?

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this