STM32F030F4P6 запускает обработчик прерываний только при загрузке с флэш-памяти.Сбрасывается при загрузке с загрузчика - PullRequest
0 голосов
/ 25 февраля 2019

Код -

#include<stm32f030x6.h>

void _delay_ms(unsigned int del) {
  //Delay with systick
}

void sys_init() {
  //Set Clock to 6 * 8MHz crystal
}

void TIM14_IRQHandler(void) {
  //If UEV was generated, toggle PA4 (Connected to LED)
  if(TIM14->SR & TIM_SR_UIF) {
    GPIOA->BSRR = (GPIOA->ODR & GPIO_ODR_4)?(GPIO_BSRR_BR_4):(GPIO_BSRR_BS_4);
    TIM14->SR &= ~TIM_SR_UIF;
  }
}


int main(void) {
  sys_init();
  RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
  RCC->APB1ENR |= RCC_APB1ENR_TIM14EN;

  GPIOA->MODER = 0b1 << GPIO_MODER_MODER4_Pos;
  //GPIOA->AFR[0] = 4 << GPIO_AFRL_AFRL4_Pos;

  //Init timer
  TIM14->ARR = 731;
  TIM14->PSC = 0xffff;
  TIM14->DIER |= TIM_DIER_UIE;
  TIM14->CR1 |= TIM_CR1_CEN;

  NVIC_EnableIRQ(TIM14_IRQn);
  NVIC_SetPriority(TIM14_IRQn, 0);

  while(1);
}

Как уже упоминалось в вопросе, этот код прекрасно работает, когда я непосредственно загружаю его с флэш-памяти (BOOT0 подключен к GND), но не работает при использованиизагрузчик.Как только прерывание поднято, чип сбрасывается и снова возвращается в загрузчик.Как я могу это исправить?
Следует отметить, что я использую собственный скрипт компоновщика и сильно модифицированный boot.s .

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Согласно комментариям duskwuffs, и поскольку ваши ссылки на boot.s и linker.script работают, я предполагаю, что ваша векторная таблица все еще та же, что и в загрузчике, и прерывание вашего приложения просто скачет туда.Если ваш загрузчик не имеет ISR, сопоставленного с этой векторной таблицей, он может просто выполнить сброс (ловушка / исключение из-за неправильного адреса / инструкций).Вы можете иметь общую векторную таблицу для косвенного перехода к векторной таблице, предоставленной в ОЗУ, перезаписанной вашим приложением в коде запуска.

0 голосов
/ 25 февраля 2019

Вы столкнулись с ограничением ядра Cortex-M0, используемого в этом микроконтроллере.

Cortex-M0 может использовать только таблицу векторов прерываний, сопоставленную по адресу 0x0.Когда микроконтроллер настроен на загрузку с загрузчика, системная память отображается по адресу 0, поэтому таблица векторов загрузчика используется для всех прерываний.В результате вы не можете безопасно использовать прерывания в приложении, запущенном через загрузчик.

В Cortex-M0 + и более поздних версиях вы можете установить SCB->VTOR для использования таблицы векторов, расположенной в другом месте в памяти.Однако этот регистр не существует на деталях Cortex-M0, таких как STM32F0, так что это не вариант для вас.

Рассмотрите возможность использования программатора SWD, такого как ST-Link, для программирования вашего микроконтроллера.загрузчика.Это также позволит вам отладить ваше приложение.

...