реклама на сайте
подробности

 
 
7 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> STM32 flash, помогите разобраться
dimka76
сообщение May 30 2014, 07:34
Сообщение #1


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 ?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 30 2014, 07:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(dimka76 @ May 30 2014, 15:44) *
Как же все-таки читается FLASH?

Как угодно: разрядность шины flash для ядра прозрачна.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 30 2014, 09:37
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
dimka76
сообщение May 30 2014, 14:23
Сообщение #4


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 вообще не используется, зачем в него что-то загружается ? И при чем всегда одно и тоже.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 30 2014, 18:19
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

может тут SL просто 10 регистр и все? как временный используется...
Go to the top of the page
 
+Quote Post
kan35
сообщение May 31 2014, 00:34
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Между памятью и ядром есть прослойка в виде например ART акселератора. Если память работает на частоте 32МГц, то как инструкции могут поступать с частотой 180МГц?.. - вот потому и за 1 обращение вычитывается от 4 до 8 инструкций.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 31 2014, 01:07
Сообщение #7


фанат дивана
******

Группа: Свой
Сообщений: 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 случайно?



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 1 2014, 04:39
Сообщение #8


developer
****

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



Цитата(AHTOXA @ May 31 2014, 09:17) *
У вас указатель appdata не volatile случайно?


Нет, не волатиле.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Haamu
сообщение Jun 20 2014, 05:45
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



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

Сообщение отредактировал Haamu - Jun 20 2014, 05:47
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2014, 07:35
Сообщение #10


Гуру
******

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



Цитата(Haamu @ Jun 20 2014, 08:45) *
подскажите пожалуйста, в какой последовательности действовать, чтобы записать туда что-либо?
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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Haamu
сообщение Jun 20 2014, 11:17
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 20 2014, 11:42
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 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;
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2014, 12:20
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 1 2014, 10:00
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(scifi @ May 30 2014, 12:37) *
Кстати, в семействах STM32F2 и STM32F4 флэш устроена иначе, и записывать можно даже 1 байт за раз, что открывает новые возможности для эмуляции EEPROM.

Вот задумался сделать обновление программы по-простому. Приму по USART во внешнюю RAM весь file.bin, а потом попробую записать. Смогу ли? Если можно записывать (и стирать, значит?) по байтам? Когда подберется к месту, где находится сама запись во флэш, команды-то в буфере будут.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 1 2014, 10:10
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Jul 1 2014, 14:00) *
Если можно записывать (и стирать, значит?) по байтам?

Нет, конечно. Стирается целый сектор. Иначе это была бы не флеш, а EEPROM.
Там и другая проблема: если прервать прошивку, то устройство превращается в кирпич. Поэтому нужен загрузчик.
Go to the top of the page
 
+Quote Post

7 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 19:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01525 секунд с 7
ELECTRONIX ©2004-2016