Allregia 9 4 апреля, 2017 Опубликовано 4 апреля, 2017 · Жалоба Понадобилось портировать несколько проектов, с 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_ ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Т.е. прерывания в аппликации не работают. Компилируете приложение в режиме С или С++? Если второе, то перед void HAL_SYSTICK_Callback(void){ нужно написать extern "C" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Компилируете приложение в режиме С или С++? Если второе, то перед void HAL_SYSTICK_Callback(void){ нужно написать extern "C" В Си, и если скомпилировать без бутлоадера, то все работает. Только после прыжка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба VTOR-то проверили, содержит он правильный адрес в результате? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба VTOR-то проверили, содержит он правильный адрес в результате? Да, там тоже, что и APPLICATION_ADDRESS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Да, там тоже, что и APPLICATION_ADDRESS А в bootloader'е прерывания работают? В приведенном коде мигать светодиодом 1 просто некогда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба А в bootloader'е прерывания работают? В приведенном коде мигать светодиодом 1 просто некогда. Конечно некогда :) Это было сделано специально. В случае нормальной работы, должны мигать светодиоды №2 (в теле основной программы) и №3 (в прерывании основной программы. А вот, если бы мигали светодиоды №2 (в теле основной программы) и №1 (в прерывании бутлоадера), было бы понятно что систиковское прерывание выполняется, но "не от той программы". Но нет, мигает только №2. P.S. Я в отъезде, так что попробовать что-то еще смогу только в понедельник. Хочу посмотреть, что будет если "прыгнуть" из бутлоадера в аппликацию вообще не инициализируюя прерывания в бутлоадере, т.е. в начале main() сразу прыгнуть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба А вот, если бы мигали светодиоды №2 (в теле основной программы) и №1 (в прерывании бутлоадера), было бы понятно что систиковское прерывание выполняется, но "не от той программы". Вопрос, выполняется ли оно вообще в том же загрузчике. Это проверялось? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Конечно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 5 апреля, 2017 Опубликовано 5 апреля, 2017 · Жалоба Дурацкий банальный вопрос. disable_irq() вижу. А кто делает enable() ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 6 апреля, 2017 Опубликовано 6 апреля, 2017 · Жалоба На дурацкие вопрсоы, не очень хочется отвечать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться