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

 
 
 
Reply to this topicStart new topic
> Bootloader на F7, порт с F1/F4
Allregia
сообщение Apr 4 2017, 14:06
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 999
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Понадобилось портировать несколько проектов, с F1 и F4 на F7, каждый проект состояит из бутлоадера (в начале памяти) и аппликации (выше).
C F7 только недавно начал разбираться, поэтому заранее прошу прощения за может детские вопросы.

С ходу портированное не пошло, и я решил просто провеить на примитивных программках.
Сделал два крохотных проектика, для быстроты на HAL-е. Внутренний клок, работает прерывание от SysTick и к 3-м ножкам прицеплены светодиоды.
Всё, больше ничего нет.

Проблема с переходом из бутлоадера в аппликацию.

Проекты очень простые, в бутлоадере:
Код
void HAL_SYSTICK_Callback(void){  // просто помигать светодиодиком №1
  static uint32_t Cnt1s;
        if(++Cnt>500){
          Cnt=0;
          HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
        }
}
//---------
// эта функция целиком скопирована, за исключением адреса, их рабочих проектов
#define APPLICATION_ADDRESS 0x08100000
typedef  void (*pFunction)(void);
pFunction JumpToApplication;
uint32_t JumpAddress;

//--
void AppStart(void){
    
    __disable_irq();

    JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
    JumpToApplication = (pFunction) JumpAddress;
    
    __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
    JumpToApplication();
}
//--------------
int main(void){
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,1);
  HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,1);
  HAL_GPIO_WritePin(LED3_GPIO_Port,LED3_Pin,1);
  
   AppStart();

  while (1);
}


В основной программе:
Код
void HAL_SYSTICK_Callback(void){  // мигаем светодиодом №3
  static uint32_t Cnt1s;

        if(++Cnt1s>1000){
          Cnt1s=0;
          HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);
        }
}
//-----------------
int main(void) {  // мигаем в мейне светодиодом №2
uint32_t i,j;

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  SystemClock_Config();
  MX_GPIO_Init();

  while (1) {
    for(j=0; j<1000000;j++){
        for(i=0;i<10; i++){
        }
    }
    HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
  }
}


Функция void AppStart(void) - как в куче других проектов, и все работало. Но там был не Ф7.
На бутлоадер в линкере прописан стартовый адрес 0x08000000 и конец 0x080FFFFF, а на апликацию - 0x08100000 и 0x081FFFFF и таблица векторов на 0x08100000

По индикации:
- в бутлоадере в прерывании мигает светодиод №1
- в аппликации в прерывании мигает светодиод №3
- в аппликации в основном цикле мигает светодиод №2


В результате - есть прыжок из бутлоадера в апликацию, после чего мигает только светодиод №2.
Т.е. прерывания в аппликации не работают.
Вопрос - что для Ф7 еще нужно?

В system_stm32f1xx.c (f4) в Кейле я еще прописывал для аппликации:
Код
#ifndef BOOTABLE
#define VECT_TAB_OFFSET  0x00 //  Vector Table base offset field.
#else
#define VECT_TAB_OFFSET  0x0100000 // < Vector Table base offset field.
#endif


Тут пробовал в IAR делать аналогичное в system_stm32f7xx.c, но это ровным счетом ничего не меняет.
Я с IAR еще мало знакОм, в нем в линкере тоже прописывается адрес таблицы векторов, и я пока не пойму нужно ли это делать в system_ ?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Apr 5 2017, 10:37
Сообщение #2


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

Группа: Свой
Сообщений: 1 595
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Allregia @ Apr 4 2017, 21:06) *
Т.е. прерывания в аппликации не работают.

Компилируете приложение в режиме С или С++?
Если второе, то перед void HAL_SYSTICK_Callback(void){
нужно написать extern "C"


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Apr 5 2017, 10:48
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 999
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(SSerge @ Apr 5 2017, 11:37) *
Компилируете приложение в режиме С или С++?
Если второе, то перед void HAL_SYSTICK_Callback(void){
нужно написать extern "C"

В Си, и если скомпилировать без бутлоадера, то все работает. Только после прыжка.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 5 2017, 12:37
Сообщение #4


Гуру
******

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



VTOR-то проверили, содержит он правильный адрес в результате?


--------------------
Go to the top of the page
 
+Quote Post
Allregia
сообщение Apr 5 2017, 13:30
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 999
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(aaarrr @ Apr 5 2017, 13:37) *
VTOR-то проверили, содержит он правильный адрес в результате?


Да, там тоже, что и APPLICATION_ADDRESS
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 5 2017, 14:26
Сообщение #6


Гуру
******

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



Цитата(Allregia @ Apr 5 2017, 16:30) *
Да, там тоже, что и APPLICATION_ADDRESS

А в bootloader'е прерывания работают? В приведенном коде мигать светодиодом 1 просто некогда.


--------------------
Go to the top of the page
 
+Quote Post
Allregia
сообщение Apr 5 2017, 15:38
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 999
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(aaarrr @ Apr 5 2017, 15:26) *
А в bootloader'е прерывания работают? В приведенном коде мигать светодиодом 1 просто некогда.


Конечно некогда sm.gif
Это было сделано специально.
В случае нормальной работы, должны мигать светодиоды №2 (в теле основной программы) и №3 (в прерывании основной программы.

А вот, если бы мигали светодиоды №2 (в теле основной программы) и №1 (в прерывании бутлоадера), было бы понятно что систиковское прерывание выполняется, но "не от той программы".

Но нет, мигает только №2.

P.S. Я в отъезде, так что попробовать что-то еще смогу только в понедельник. Хочу посмотреть, что будет если "прыгнуть" из бутлоадера в аппликацию вообще не инициализируюя прерывания в бутлоадере, т.е. в начале main() сразу прыгнуть.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 5 2017, 15:57
Сообщение #8


Гуру
******

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



Цитата(Allregia @ Apr 5 2017, 18:38) *
А вот, если бы мигали светодиоды №2 (в теле основной программы) и №1 (в прерывании бутлоадера), было бы понятно что систиковское прерывание выполняется, но "не от той программы".

Вопрос, выполняется ли оно вообще в том же загрузчике. Это проверялось?


--------------------
Go to the top of the page
 
+Quote Post
Allregia
сообщение Apr 5 2017, 16:10
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 999
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Конечно.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Apr 5 2017, 19:14
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 909
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Дурацкий банальный вопрос.
disable_irq() вижу. А кто делает enable() ?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Allregia
сообщение Apr 6 2017, 04:41
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 999
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



На дурацкие вопрсоы, не очень хочется отвечать.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th April 2017 - 09:23
Рейтинг@Mail.ru


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