Easyelectronics.ru

Электроника для всех
Текущее время: 16 дек 2019, 06:51

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Bootloader с нуля CMSIS
СообщениеДобавлено: 04 май 2019, 09:21 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
Добрый день!

В создании базового "скелета" для серии проектов на STM32 мне не хватает только загрузчика).

Делаю на старом проекте (на ПИКе) так: заливаю по IP-сети шифрованный бинарник, он сохраняется во флеши. Т.е прошивка доступна локально. При любой степени поганства в сети БУТ не активирую пока 100% не удостоверюсь что прошивка залита правильно, это контролирует заливающий софт.
Бинарник делаю утилой hex2bin, далее прогоняю через свой шифровшик, обратный алгоритм знает только БУТ.

Следующей командой в соответствующий офсет флеши пишу настройки БУТа (размер прошивки и бит активации) и при рестарте МК БУТ обнаружив бит активации делает свое дело, сбрасывает бит только при 100% процессе. Т.е оно не окирпичивается если посередине процесса прервать питание (чего в реале никогда не было...).


Разбирая АРМ наткнулся на чудо-статейки,

https://microtechnics.ru/mikrokontrolle ... lya-stm32/
https://microtechnics.ru/mikrokontrolle ... ip-raboty/

но программлю в КЕЙЛе, хотелось бы понять поэтапно:
БУТ естессно в данном случае расположу в начале области программы. (на ПИКе засунул в конец).

1. Как задать в КЕЙЛе офсет для сборки ХЕКСа? Чтобы оно еще и работало. Какой конструкцией на CMSIS перенести таблицу векторов? SPL и HAL избегаю, не люблю этого.. Из статей понятно что нужно использовать разные файлы линкера, но тут вроде примерно знаю где смотреть.

Создам отдельный проект для БУТа, далее при условии 1 думаю смогу разобраться как сшить при компоновке 2 ХЕКСа.

Товарищи извините, подгоняет ДИКОЕ НЕТЕРПЕНИЕ))). Если с ПИКами до момента создания БУТа я уже долго ковырялся, то тут буквально месяц исполнился как пытаюсь программить. Вот и спрашиваю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 04 май 2019, 10:07 
Заглядывает иногда

Зарегистрирован: 05 дек 2017, 18:17
Сообщения: 195
Для самого бутлоадера, который стартует с 0x8000000 оставляете все как есть.
В моем случае бутлоадер не обновляет программу, а решает какую из 2-х прошивок загрузить. "Флаг" выставляется в
Backup регистрах, они при перезагрузке, если питание не пропадает, не обнуляются.
Код выдрал из проекта и поредактировал прямо тут, так что загляните в ДШ, чтобы проверить.
Код примерно вот такой:
Код:
#include "stm32f4xx.h"

#define SD2USB_APP    0x08004000  //Адреса по которым лежат прошивки.
#define LOGGER_APP    0x08040000

int main(void){
   uint32_t jumpAdr;
   uint32_t program_adr=0;
   uint32_t key;
   void (*GoToApp)(void);


/* Работа с Backup регистрами   */
  RCC->APB1ENR |= RCC_APB1ENR_PWREN;
  PWR->CR |= PWR_CR_DBP;
  RCC->CSR |= RCC_CSR_LSION;
  while(!(RCC->CSR & RCC_CSR_LSIRDY)) {}
  RCC->BDCR |=  RCC_BDCR_BDRST;
  RCC->BDCR &= ~RCC_BDCR_BDRST;
  RCC->BDCR &= ~RCC_BDCR_RTCSEL;
  RCC->BDCR |= (RCC_BDCR_RTCSEL_1);
  RCC->BDCR |= RCC_BDCR_RTCEN;

  RCC->AHB1ENR |= RCC_AHB1ENR_BKPSRAMEN;

  key = *(uint32_t *) BKPSRAM_BASE;
  if(key == 777){
   program_adr=SD2USB_APP;
   *(uint32_t *) BKPSRAM_BASE  = 0;
    }else{
   program_adr=LOGGER_APP;
   };
/* К этому месту решили, куда будем прыгать */    
   
   jumpAdr = *((volatile uint32_t*)(program_adr+4));
   GoToApp = (void (*)(void))jumpAdr;
   SCB->VTOR = program_adr;
   __set_MSP(*((volatile uint32_t*)program_adr));
   GoToApp();
   
}


Бутлоадер смотрит на значение в Backup регистре и если оно 777 то стартует одну прошивку, а если нет, то другую.

В "основной" программе надо сделать изменения:
Во-первых указать по каким адресам флеша загружать. В свойствах проекта ("Options for ...." Alt+F7) на закладке target в поле IROM1 ставим нужный адрес. Адрес в ДШ можно посмотреть, поскольку флеш постранично стирается.
Далее, если вы используете стандартный CMSIS, то в файле system_stm32f4xx.c (это для F4, в вашем случае может быть другой) надо задать VECT_TAB_OFFSET, это как понятно из названия, смещение таблицы векторов.
Для примера выше, SD2USB_APP находится по адресу 0x08004000. Соответственно в свойствах проекта в IROM1 стоит 0x08004000, а в system_stm32f4xx.c
Код:
#define VECT_TAB_OFFSET  0x4000 /*!< Vector Table base offset field.
                                   This value must be a multiple of 0x200. */


На всякий случай, если понадобится, то перезагрузка делается вот так:
Код:
void system_reset(void){
   SCB->AIRCR = (0x5FA << SCB_AIRCR_VECTKEYSTAT_Pos) | SCB_AIRCR_SYSRESETREQ_Msk;
   __DSB();                                                                                 
  while(1); 
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 04 май 2019, 10:46 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
Так.., понятно.

>>#define VECT_TAB_OFFSET 0x4000
Т.е это редефайн, до этого он имел стандартное значение?

>>IROM1
Там 3 параметра
X/O Base (пустой)
R/O Base 0x08000000
R/W Base 0x20000000
Я полагаю, второй поправить?

(а, все нашел... вкладка target))))
а в настройках линкера ничего не менять?

>> поскольку флеш постранично стирается.
очевидно как божий день


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 04 май 2019, 11:11 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
>>#define VECT_TAB_OFFSET 0x4000
нашел!
старое значение закоментил

>>>>IROM1
Поменял только его. Другое не трогал. Действительно, ХЕКС собрался с этим офсетом!
Прошилось, и даже заработало)

Это что получается, если в ПИКах18 адреса векторов прерывания жесткие, единственный способ отправить оттуда прерывание на другой вектор - это разместить в железных позициях команды GOTO, то тут без лишних прыжков ARM принимает предписанный прогером адрес векторов?


Последний раз редактировалось esatman 04 май 2019, 11:15, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 04 май 2019, 11:15 
Заглядывает иногда

Зарегистрирован: 05 дек 2017, 18:17
Сообщения: 195
esatman писал(а):
Так.., понятно.
>>#define VECT_TAB_OFFSET 0x4000
Т.е это редефайн, до этого он имел стандартное значение?

Нет, там изначально 0, этот define есть в CMSIS. Я не знаю какой у вас контроллер, но посмотрите где у вас находится функция SystemInit(), в этом же файле будет
этот дефайн, частота кварца и настройки тактирования.
Применение этого дефайна я в CMSIS нашел только в одном месте, в SystemInit()
Код:
/* Configure the Vector Table location add offset address ------------------*/
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
#endif
}

Т.е. если вы используете стандартный startup (асемблерный .s файл), в котором есть вызов SystemInit() из CMSIS, то в бутлоадере таблицу векторов можно и не переносить,
это будет все равно в SystemInit сделано.

esatman писал(а):
а в настройках линкера ничего не менять?

Я не менял. Там есть вариант указать scatter файл, это вроде аналог .ld у Keil. Но я не разбирался с этим.
Сейчас вообще от Keil-а отказался в пользу сборки makefile-лом, и соответственно эти настройки действительно в файле линкера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 04 май 2019, 11:33 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1140
esatman писал(а):
то тут без лишних прыжков ARM принимает предписанный прогером адрес векторов?
Совершенно неграмотная постановка вопроса. Даже только в семействе STM32 этих ARM-ов разных туева хуча и на разных ядрах разные механизмы переключения таблицы векторов прерываний. Что уж говорить за ARM в целом...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 04 май 2019, 11:58 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
Ну извините! Разберусь со временем!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 04 май 2019, 12:30 
Старожил

Зарегистрирован: 02 ноя 2015, 19:21
Сообщения: 634
Откуда: Санкт-Петербург
При всем уважении, советую просто в поиске форума набрать bootloader. эта тема обсуждается почти каждый месяц и тем огромное количества. причем как с нормальными решениями, так и разного рода извращениями. короче инфы очень много, поэтому сомневаюсь что кто-то тут что-то новое напишет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 04 май 2019, 21:54 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
Вы правы, но ложка была хороша что называется, к обеду.
(как скучно было бы жить, если бы вся информация была представлена в единственном экземпляре и каталогизирована).
Спасибо что есть форумы)

Sergey_spb, исключительно четко по инструкции получилось.
Сшивку файлов автоматизировал при помощи hexmate (проверил - корректно собирает), генерация bin-а - hex2bin.
В итоге создал отдельный проект BOOT, а в основном - папку output, в которую запихал эти 2 проги и командный cmd-файл.
В CMD прописал команды сшивки и генерации bin-а, а сам cmd подсунул KEIL-у в разделе USER.

В итоге, при пересборке проекта автоматом в отдельную папку генерится основной ХЕКС, сшитый ХЕКС с Бутом, а так же bin пригодный для скармливания шифровщику. Осталось переписать на Шарпе шифровшик, чтобы в виде консольного Win-приложения можно было включить в этот CMD-файл.

Все это (вопросы компоновки 2-х проектов так чтобы все четко работало и выдавало набор файлов для прошивки-шифровки) - ИМХО является краеугольным камнем конструкции с БУТом, не знаю кому как, а при миграции на новую платформу мне это кажется самым сложным.

Остальные вопросы (сам механизм работы БУТа) это объемная, сложная, но прямолинейная рутина.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 22 авг 2019, 12:56 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
Добрый день!

Делаю теперь то же самое но на 405RGT6. Не могу отправить чип в reset.
Конструкция:
SCB->AIRCR = (0x5FA << SCB_AIRCR_VECTKEYSTAT_Pos) | SCB_AIRCR_SYSRESETREQ_Msk;
__DSB();
while(1);

равно как и ее системный аналог внутри макроса NVIC_SystemReset();
виснет в цикле while(1), причем запускал и из главного цикла и из прерывания.
Туплю над ДШ пока.. возможно ли что с разводкой чипа проблема? Плата уже своя, на чипе развел только то что мне нужно для функционала.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 22 авг 2019, 13:44 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1140
Reset аппаратно не зажат на VCC? А то ведь оно софтварный ресет делает через генерацию импульса на аппаратном. Его осциллом должно быть видно - 20 мкС. Или кондёр большой висит, который зафильтровал импульс?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 22 авг 2019, 13:51 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
NRST через 10КОм подтянут к +3.3
BOOT0, BOOT1 через 10КОм соединен с землей.

На NRST имеется постоянный потенциал (пульпуш) от другого чипа (ведущего), если надо ресетнуть его с ведущего.

Дошло кажись..

переделал "дергающий" пин мастера с пульпуша на открытый сток, все заработало.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 29 авг 2019, 19:19 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
Добрый день!
Вопрос в рамках этой темы.

Пилю F4RGT6. Некоторое время уже курю reference manual, пока не получается следующее.
Делаю очистку секторов. 0-й занят БУТом, его не трогаю. Надо очистить 1-11 сектора. Вроде бы).
Код:

while(FLASH->SR & FLASH_SR_BSY);
FLASH->CR |= FLASH_CR_SER;
FLASH->CR &= ~FLASH_CR_PSIZE_1;
FLASH->CR &= ~FLASH_CR_PSIZE_0;
//одинаковый эффект при PSIZE 0,0 и при 1,0.

n=1;
FLASH->CR |= ((uint32_t)n << FLASH_CR_SNB_Pos); //стираем 1-11 сектора, в данном случае "1"

FLASH->CR |= FLASH_CR_STRT;
while(FLASH->SR & FLASH_SR_BSY);
FLASH->CR &= ~FLASH_CR_SER;

Стирается не все, что конкретно можно при желании выяснить, но ясно что не все. 1-й сектор стирается точно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 29 авг 2019, 22:22 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
Получается так: Вышеописанное ессно делается в цикле, с 1 по 11 сектор. (0й не трогаю.)
Так вот! Если я начинаю с интервала 1-7 - то 8й и последующие сектора не стираются, даже время на них не расходуется. Если начинаю с 8-го - то доходит до 11, но если потом продолжить с 1 - то их не стирает.

Такое ощущение что память разделена на 2 сегмента, но "банков" в 405RGT6 нету. И как "перейти" в другую "группу" секторов если уже какую-то стер - непонятно. Ну ресетом. Интересно как еще.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 29 авг 2019, 22:32 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1809
https://www.feaser.com/en/openblt.php
https://github.com/feaser/openblt/blob/ ... F4/flash.c

ну и конечно книга "Стань Гугл гуру за 24 часа"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 30 авг 2019, 12:20 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 471
Откуда: Киев
esatman G-шки с 2 метрами флеша. Проверял на 429. Да и стирание второго банка только целиком, посекторно не работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 30 авг 2019, 16:28 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
На чипе написано 405RGT6.)
ST-link выдает следующее:
17:16:08 : Device ID:0x413
17:16:08 : Device flash Size : 1MBytes
17:16:08 : Device family :STM32F405xx/F407xx/F415xx/F417xx

Вопрос этот "окучил" со всех возможных сторон, пишу, проверяю что записалось, и т.д.
Страниц там 12. 0-11. если их по одной стирать то все отлично. Но если я стираю несколько, по очереди, то если стираю из нижнего диапазона (0-7) то верхний затронуть уже не могу, и наоборот. Позже перейду к записи, посмотрю какие там закономерности.

В официальном доке в разделе описывающем erase ничего подобного не указано. Перепробовал все варианты параллелизма.
Ну конечно предварительно, то для чего мне нужен этот чип я и в 200кб уложу, но это как то непривычно оставлять такие вопросы нерешенными.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 30 авг 2019, 17:50 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 471
Откуда: Киев
FLASH->CR |= ((uint32_t)n << FLASH_CR_SNB_Pos); херня будет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 31 авг 2019, 11:01 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
>>херня будет
Можете сказать почему?

Погуглил, нашел HAL-библиотеку(архив во вложении), в нутрях которой (стр.701) следующее:
FLASH->CR &= CR_PSIZE_MASK;
FLASH->CR |= tmp_psize;
FLASH->CR &= SECTOR_MASK;
FLASH->CR |= FLASH_CR_SER | (Sector << FLASH_CR_SNB_Pos);
FLASH->CR |= FLASH_CR_STRT;

Это разве не то же самое? Чип конечно другой, но лексемы идентичные.


Вложения:
stm32f7xx_hal_flash_ex.rar [6.17 Кб]
Скачиваний: 8
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 31 авг 2019, 11:23 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1140
Потому что "|=" это удобно, стильно, модно, современно, понтово, но неуместно. Тау как биты умеет только устанавливать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 31 авг 2019, 11:30 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1809
А зачем гуглить когда в CubeMX просто лежит файл
stm32f4xx_hal_flash_ex.c

А также лежат примеры

FLASH_EraseProgram

IAP_Main
This directory contains a set of sources files and pre-configured projects that
describes how to build an application to be loaded into Flash memory using
In-Application Programming (IAP, through USART).

EEPROM_Emulation
This application describes the software solution for substituting standalone EEPROM
by emulating the EEPROM mechanism using the on-chip Flash of STM32F4xx devices.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 31 авг 2019, 12:53 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4473
Откуда: Кемеровская область, Киселевск
esatman стирание так выглядит на F407

Код:


FLASH->KEYR = 0x45670123; //UNLOCK
FLASH->KEYR = 0xCDEF89AB;

FLASH->ACR |= FLASH_ACR_LATENCY_5WS; //SET LATENCY //2.7 - 3.6V, 150 < HCLK ≤168

FLASH->SR = 0xFFFFFFFF; //CLEAR SR
FLASH->CR |= FLASH_CR_SER; //SECTOR ERASE ACTIVATE
FLASH->CR |= FLASH_CR_PSIZE_1; // Set program/erase parallelism 2.7 - 3.6 V 0x10 (RM0090 85 page)
FLASH->CR |= ((uint32_t)11 << FLASH_CR_SNB_Pos); //SECTOR 11 ERASE

FLASH->CR |= FLASH_CR_STRT; //START
while((FLASH->SR & FLASH_SR_BSY) == 1){};
FLASH->CR = 0x80000000; //RESET CONTROL AND LOCK FLASH



https://radiowolf.ru/2019/08/850/coding ... 2f4_flash/

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 31 авг 2019, 14:24 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
Спасибо, запрограммлю, в понедельник проверю!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 31 авг 2019, 18:24 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 471
Откуда: Киев
Попробуй еще этот вариант.
Код:
void Flash_EraseSector(uint8_t tSector)
{
  while(FLASH->SR & FLASH_SR_BSY);
  FLASH->CR = FLASH_CR_SER | FLASH_CR_PSIZE_1 | ((tSector & 0x1f) << 3);
  FLASH->CR |= FLASH_CR_STRT;
  while(FLASH->SR & FLASH_SR_BSY);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 31 авг 2019, 23:31 
Заглядывает иногда

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 88
Всем спасибо!! Девайс не с собой, зетестить смогу в понедельник.
А за один раз можно стереть только один сектор, или же весь желаемый набор по маске установить можно?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB