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);
}
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);
}
}
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
#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_ ?