Easyelectronics.ru

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

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



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

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

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

В создании базового "скелета" для серии проектов на 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
Сообщения: 160
Для самого бутлоадера, который стартует с 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
Сообщения: 84
Так.., понятно.

>>#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
Сообщения: 84
>>#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
Сообщения: 160
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
Сообщения: 943
esatman писал(а):
то тут без лишних прыжков ARM принимает предписанный прогером адрес векторов?
Совершенно неграмотная постановка вопроса. Даже только в семействе STM32 этих ARM-ов разных туева хуча и на разных ядрах разные механизмы переключения таблицы векторов прерываний. Что уж говорить за ARM в целом...


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

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


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

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


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

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

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
Сообщения: 84
Добрый день!

Делаю теперь то же самое но на 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
Сообщения: 943
Reset аппаратно не зажат на VCC? А то ведь оно софтварный ресет делает через генерацию импульса на аппаратном. Его осциллом должно быть видно - 20 мкС. Или кондёр большой висит, который зафильтровал импульс?


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

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

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

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

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


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

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

Пилю 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
Сообщения: 84
Получается так: Вышеописанное ессно делается в цикле, с 1 по 11 сектор. (0й не трогаю.)
Так вот! Если я начинаю с интервала 1-7 - то 8й и последующие сектора не стираются, даже время на них не расходуется. Если начинаю с 8-го - то доходит до 11, но если потом продолжить с 1 - то их не стирает.

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


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

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1740
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
Сообщения: 415
Откуда: Киев
esatman G-шки с 2 метрами флеша. Проверял на 429. Да и стирание второго банка только целиком, посекторно не работает.


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

Зарегистрирован: 19 ноя 2018, 20:15
Сообщения: 84
На чипе написано 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
Сообщения: 415
Откуда: Киев
FLASH->CR |= ((uint32_t)n << FLASH_CR_SNB_Pos); херня будет


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

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

Погуглил, нашел 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 Кб]
Скачиваний: 5
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bootloader с нуля CMSIS
СообщениеДобавлено: 31 авг 2019, 11:23 
Старожил
Аватара пользователя

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


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

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1740
А зачем гуглить когда в 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
Сообщения: 4274
Откуда: Кемеровская область, Киселевск
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
Сообщения: 84
Спасибо, запрограммлю, в понедельник проверю!


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

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 415
Откуда: Киев
Попробуй еще этот вариант.
Код:
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
Сообщения: 84
Всем спасибо!! Девайс не с собой, зетестить смогу в понедельник.
А за один раз можно стереть только один сектор, или же весь желаемый набор по маске установить можно?


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

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


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

Сейчас этот форум просматривают: dosikus_2, Katz


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

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

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