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

 
 
> 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
 
Start new topic
Ответов
ViKo
сообщение Jul 1 2014, 11:13
Сообщение #2


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

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



Да, можно разместить "прошивальщик" в конце flash, например. И не трогать этот сектор никогда.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jul 1 2014, 11:15
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(ViKo @ Jul 1 2014, 07:13) *
Да, можно разместить "прошивальщик" в конце flash, например. И не трогать этот сектор никогда.

Нет, прошивальщик должен всегда стартовать по нулевому аддрессу, с рестарта. Иначе смысл теряется.
А вот программа может быть где угодно


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 1 2014, 11:18
Сообщение #4


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

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



Цитата(A. Fig Lee @ Jul 1 2014, 14:15) *
Нет, прошивальщик должен всегда стартовать по нулевому аддрессу, с рестарта. Иначе смысл теряется.
А вот программа может быть где угодно

Так стартовать можно, куда задашь. По нулевому адресу расположена таблица startup.
Хорошо, стартанул я в загрузчик. Настроил все нужные режимы, чтобы принять новую прошивку. Жду... а ее нет. Подождал, свалил в основную программу. Так?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 1 2014, 11:25
Сообщение #5


Гуру
******

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



Цитата(ViKo @ Jul 1 2014, 14:18) *
По нулевому адресу расположена таблица startup.
Таблица векторов прошивальщика. Приложение со своей собственной таблицей может располагаться где угодно. При старте запускается прошивальщик, он проверяет целостность приложения, переключает VTOR на вектора приложения (для Cortex-M0 копирует вектора приложения в ОЗУ и делает ремап), грузит указатель стека из векторов приложения и передает управление на вектор Reset приложения. Приложение может отсутствовать вообще (или быть испорченным, недозаписанным), в этом случае прошивальщик весело мигая светодиодом ожидает новую прошивку для приложения, записывает ее и делает рестарт. После рестарта прошивальщик проверяет целостность... (далее читать с начала).


--------------------
На любой вопрос даю любой ответ
"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, 11:34
Сообщение #6


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

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



Цитата(Сергей Борщ @ Jul 1 2014, 14:25) *
При старте запускается прошивальщик, он проверяет целостность приложения, переключает VTOR на вектора приложения (для Cortex-M0 копирует вектора приложения в ОЗУ и делает ремап), грузит указатель стека из векторов приложения и передает управление на вектор Reset приложения.

А если приложение целое, но хочу зашить новую прошивку? Чем подтолкнуть?
А целостность как определить - CRC посчитать? А размеры кода откуда узнать, хранить во flash, рядом с CRC?

В конце flash сектора большие, по 128 KB (речь идет про STM32F20x). Значит, загрузчик надо расположить в начальных секторах, или в OTP (страшно!).
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 1 2014, 11:48
Сообщение #7


Гуру
******

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



Цитата(ViKo @ Jul 1 2014, 14:34) *
А если приложение целое, но хочу зашить новую прошивку? Чем подтолкнуть?
Я делаю программный сброс из приложения. А загрузчик после обновления делает сброс по собаке. При старте загрузчика проверяю источник сброса и если он программный - ухожу на обновление, если нет - проверяю целостность и запускаю приложение.
Цитата(ViKo @ Jul 1 2014, 14:34) *
А целостность как определить - CRC посчитать?
Да, тем более что у STM32 есть и аппаратный расчет CRC и DMA.
Цитата(ViKo @ Jul 1 2014, 14:34) *
А размеры кода откуда узнать, хранить во flash, рядом с CRC?
Я размер храню сразу после области векторов приложения. У меня его туда линкет прописывает:
Код
    .text :
    {
        _image_start = .;
        KEEP(*(.isr_vector))

        LONG((_image_end - _image_start) / 4);    /* application size, in 4-byte words */
      
    ....................
    } > TEXT

    .data :
    {
        . = ALIGN(4);
        _sdata = .;                /* start of .data label */
        *(.ramfunc)
        *(.ramfunc.*)
        *(.data)
        *(.data.*)
        . = ALIGN(4);
        _edata = .;                /* end of .data label */
    } > RAM AT > TEXT
    _sidata = LOADADDR(.data);    /* start of initialized data label */

    .crc :
    {
        . = . + 4;        /* reserve space for CRC */
        _image_end = .;
    } > TEXT



Цитата(ViKo @ Jul 1 2014, 14:34) *
Значит, загрузчик надо расположить в начальных секторах, или в OTP (страшно!).
Разумеется в начальных секторах. Чтобы всегда, после заливки чего угодно он всегда стартовал первым и имел возможность залить другое приложения. Я предусматриваю одну из свободных ног для принудительного запуска загрузчика - если залито приложение, которое хотя и целое, но тем не менее нерабочее, то сняв питание, закоротив эту ногу и подав питание снова, я из кирпича получаю готовое к обновлению устройство.


--------------------
На любой вопрос даю любой ответ
"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
doom13
сообщение Jul 1 2014, 13:16
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Цитата(Сергей Борщ @ Jul 1 2014, 14:48) *
Я предусматриваю одну из свободных ног для принудительного запуска загрузчика - если залито приложение, которое хотя и целое, но тем не менее нерабочее, то сняв питание, закоротив эту ногу и подав питание снова, я из кирпича получаю готовое к обновлению устройство.

И вчём смысл такого решения, если всё равно необходимо будет разобрать всё устройство (что порой бывает не просто), чтобы добраться до платы с процессором. Там уже что ножку коротить, что программатор подключить, особой разницы нету.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- dimka76   STM32 flash   May 30 2014, 07:34
- - aaarrr   Цитата(dimka76 @ May 30 2014, 15:44) Как ...   May 30 2014, 07:41
- - scifi   Цитата(dimka76 @ May 30 2014, 15:44) В до...   May 30 2014, 09:37
|- - dimka76   Спасибо всем ответившим. Цитата(scifi @ May ...   May 30 2014, 14:23
||- - AHTOXA   Цитата(dimka76 @ May 31 2014, 00:33) Код ...   May 31 2014, 01:07
||- - dimka76   Цитата(AHTOXA @ May 31 2014, 09:17) У вас...   Jun 1 2014, 04:39
|- - ViKo   Цитата(scifi @ May 30 2014, 12:37) Кстати...   Jul 1 2014, 10:00
|- - scifi   Цитата(ViKo @ Jul 1 2014, 14:00) Если мож...   Jul 1 2014, 10:10
- - Golikov A.   регистр SL - это стэк лимит, а вот зачем в него ч...   May 30 2014, 18:19
- - kan35   Между памятью и ядром есть прослойка в виде наприм...   May 31 2014, 00:34
- - Haamu   Чтобы не плодить новых тем, продолжу эту. Во flash...   Jun 20 2014, 05:45
|- - Сергей Борщ   Цитата(Haamu @ Jun 20 2014, 08:45) подска...   Jun 20 2014, 07:35
- - Haamu   Читал. Правда не в Programming manual, а в Referen...   Jun 20 2014, 11:17
|- - _Артём_   Цитата(Haamu @ Jun 20 2014, 15:17) Так и ...   Jun 20 2014, 11:42
|- - Сергей Борщ   Цитата(Haamu @ Jun 20 2014, 14:17) пишу о...   Jun 20 2014, 12:20
- - ViKo   Как бы тогда перекинуть функцию записи в ОЗУ, и вы...   Jul 1 2014, 10:18
|- - scifi   Цитата(ViKo @ Jul 1 2014, 14:18) Как бы т...   Jul 1 2014, 10:22
||- - Сергей Борщ   Цитата(scifi @ Jul 1 2014, 13:22) Самый п...   Jul 1 2014, 11:07
|- - A. Fig Lee   Цитата(ViKo @ Jul 1 2014, 06:18) Как бы т...   Jul 1 2014, 11:06
|- - demiurg_spb   Цитата(doom13 @ Jul 1 2014, 17:16) И вчём...   Jul 1 2014, 13:32
|- - doom13   Цитата(demiurg_spb @ Jul 1 2014, 16:32) Э...   Jul 1 2014, 13:41
|- - scifi   Цитата(doom13 @ Jul 1 2014, 17:41) Т.е. д...   Jul 1 2014, 13:57
|- - demiurg_spb   Цитата(doom13 @ Jul 1 2014, 17:41) Т.е. д...   Jul 2 2014, 08:42
|- - doom13   Цитата(demiurg_spb @ Jul 2 2014, 11:42) О...   Jul 2 2014, 08:46
||- - demiurg_spb   Цитата(doom13 @ Jul 2 2014, 12:46) Может ...   Jul 2 2014, 09:11
|- - DmitryM   Цитата(demiurg_spb @ Jul 2 2014, 11:42) И...   Jul 2 2014, 15:02
- - ViKo   В секторе 0 расположить загрузчик, основную програ...   Jul 1 2014, 12:15
|- - Сергей Борщ   Цитата(ViKo @ Jul 1 2014, 15:15) В сектор...   Jul 1 2014, 12:22
- - ViKo   Я последовательно соединял две независимых кнопки ...   Jul 1 2014, 13:55
- - Golikov A.   А у меня есть видеорегистратор, который виснет есл...   Jul 1 2014, 15:11
|- - Сергей Борщ   Цитата(Golikov A. @ Jul 1 2014, 18:11) Но...   Jul 1 2014, 15:29
- - ViKo   А вот можно ли зайти во встроенный загрузчик в STM...   Jul 2 2014, 08:55
- - Сергей Борщ   У ST есть несколько подробных аппнотов по загрузчи...   Jul 2 2014, 08:59
|- - ViKo   Цитата(Сергей Борщ @ Jul 2 2014, 11:59) У...   Jul 2 2014, 09:05
|- - scifi   Цитата(ViKo @ Jul 2 2014, 13:05) Листал. ...   Jul 2 2014, 09:42
- - Сергей Борщ   Писал ответ в соседнюю тему и пришла в голову така...   Jul 4 2014, 17:37
|- - A. Fig Lee   Цитата(Сергей Борщ @ Jul 4 2014, 13:37) П...   Jul 4 2014, 17:57
|- - scifi   Цитата(Сергей Борщ @ Jul 4 2014, 21:37) П...   Jul 4 2014, 18:39
- - Golikov A.   Чего то я не понял бизнеса... Хотим загрузить загр...   Jul 4 2014, 18:20
|- - Сергей Борщ   Цитата(Golikov A. @ Jul 4 2014, 21:20) А ...   Jul 4 2014, 18:42
|- - A. Fig Lee   Цитата(Сергей Борщ @ Jul 4 2014, 14:42) В...   Jul 4 2014, 19:14
- - Golikov A.   Ну то есть у нас штатный запуск проца на прошивку ...   Jul 5 2014, 06:40
- - ViKo   Так же можно потерять и самопальный загрузчик. Вер...   Jul 7 2014, 10:10
- - Golikov A.   ну как можно потерять самопальный загрузчик? Если ...   Jul 7 2014, 13:11
|- - ViKo   Цитата(Golikov A. @ Jul 7 2014, 16:11) ну...   Jul 7 2014, 13:58
|- - A. Fig Lee   Цитата(ViKo @ Jul 7 2014, 09:58) Так же, ...   Jul 7 2014, 15:01
- - ViKo   И 3 ФигЛи, несомненно, лучше одного. Не зря сообра...   Jul 7 2014, 20:00
- - Golikov A.   Вижу о космосе вы знаете по наслышке 2 из 3 - это...   Jul 7 2014, 20:18
|- - scifi   Цитата(Golikov A. @ Jul 8 2014, 00:18) На...   Jul 7 2014, 20:34
|- - A. Fig Lee   Цитата(Golikov A. @ Jul 7 2014, 16:18) Ви...   Jul 8 2014, 01:50
- - Сергей Борщ   А я для каждого изделия использую уникальные ключи...   Jul 8 2014, 05:47
|- - mantech   Цитата(Сергей Борщ @ Jul 8 2014, 08:47) А...   Jul 9 2014, 16:18
- - Golikov A.   Для этого нужно оставить механизм старта бута. Есл...   Jul 9 2014, 19:00
|- - skripach   Цитата(Golikov A. @ Jul 9 2014, 22:00) Дл...   Jul 9 2014, 20:01
- - Сергей Борщ   Тогда поделитесь сокровенным - как ваш бут отличае...   Jul 9 2014, 20:39
|- - A. Fig Lee   Цитата(Сергей Борщ @ Jul 9 2014, 16:39) Т...   Jul 9 2014, 20:57
|- - demiurg_spb   Цитата(A. Fig Lee @ Jul 10 2014, 00:57) А...   Jul 9 2014, 21:46
|- - A. Fig Lee   Цитата(demiurg_spb @ Jul 9 2014, 17:46) С...   Jul 9 2014, 22:54
|- - demiurg_spb   Цитата(A. Fig Lee @ Jul 10 2014, 02:54) В...   Jul 9 2014, 23:05
|- - A. Fig Lee   Цитата(demiurg_spb @ Jul 9 2014, 19:05) У...   Jul 10 2014, 01:27
|- - Сергей Борщ   Цитата(A. Fig Lee @ Jul 10 2014, 04:27) О...   Jul 10 2014, 06:04
||- - skripach   Цитата(Сергей Борщ @ Jul 10 2014, 09:04) ...   Jul 10 2014, 06:54
|||- - Сергей Борщ   Цитата(skripach @ Jul 10 2014, 09:54) Уде...   Jul 10 2014, 07:58
||- - A. Fig Lee   Цитата(Сергей Борщ @ Jul 10 2014, 02:04) ...   Jul 10 2014, 11:08
||- - Сергей Борщ   Цитата(A. Fig Lee @ Jul 10 2014, 14:08) Ч...   Jul 10 2014, 11:36
||- - A. Fig Lee   Цитата(Сергей Борщ @ Jul 10 2014, 07:36) ...   Jul 10 2014, 14:00
|- - Axel   Цитата(A. Fig Lee @ Jul 10 2014, 04:27) О...   Jul 10 2014, 06:21
- - scifi   Уже на несколько страниц размазалось обсуждение од...   Jul 10 2014, 07:44
|- - demiurg_spb   Цитата(scifi @ Jul 10 2014, 11:44) Уже на...   Jul 10 2014, 08:28
- - Golikov A.   Все таки хотелось бы еще раз поговорить про кнопку...   Jul 10 2014, 08:41
- - Golikov A.   А вот тут вдруг у меня возникло такое подозрение.....   Jul 10 2014, 11:47
|- - Axel   Цитата(Golikov A. @ Jul 10 2014, 14:47) Т...   Jul 10 2014, 12:02
- - Golikov A.   Извращенная логика%... Забавно что вы не проверяе...   Jul 10 2014, 18:00
|- - A. Fig Lee   Цитата(Golikov A. @ Jul 10 2014, 14:00) И...   Jul 10 2014, 18:15
- - Golikov A.   ЦитатаКонтрольная сумма не спасает от повреждения....   Jul 10 2014, 18:56
- - andrewlekar   Я в своём софте тоже проверяю только, что сектор н...   Jul 11 2014, 06:28
- - Сергей Борщ   Ну что ж, идем на очередной круг. Не всегда есть в...   Jul 11 2014, 06:46
|- - A. Fig Lee   Цитата(Сергей Борщ @ Jul 11 2014, 02:46) ...   Jul 11 2014, 11:33
- - adnega   Я в "крупных" МК использую две области: ...   Jul 11 2014, 07:39
|- - Сергей Борщ   У меня обновление на лету. Тоже шифрование. Нет не...   Jul 11 2014, 09:15
- - andrewlekar   ЦитатаИ ради чего ваши жертвы? Ради экономии 20 ба...   Jul 11 2014, 09:44
- - Golikov A.   Ага%) Есть и на этот случай история у меня из разд...   Jul 11 2014, 18:31
- - grv   Что-то пример от ST мня загоняет в ступор это про...   Oct 20 2015, 05:32
- - scifi   Цитата(grv @ Oct 20 2015, 08:32) Зачем та...   Oct 20 2015, 07:06
- - grv   Цитата(scifi @ Oct 20 2015, 10:06) Вы, по...   Oct 20 2015, 08:46


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

 


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


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