2

コード -

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

質問で述べたように、このコードは、フラッシュ (GND に接続された BOOT0) から直接起動すると問題なく動作しますが、ブートローダーを使用すると動作しません。割り込みが発生するとすぐに、チップがリセットされ、再びブートローダーに戻ります。どうすればこれを修正できますか?
カスタムリンカー スクリプトと大幅に変更されたboot.sを使用していることに言及する必要があります。

4

2 に答える 2

2

darkwuffs のコメントによると、boot.s と linker.script へのリンクが機能するため、ベクター テーブルはまだブートローダーからのものであり、アプリケーションの割り込みはそこにジャンプするだけだと思います。ブートローダがそのベクタ テーブルにマップされた ISR を持たない場合、リセットを発行するだけかもしれません (不正なアドレス/命令によるトラップ/例外)。スタートアップ コードでアプリケーションによって上書きされた RAM 提供のベクター テーブルに間接的にジャンプする汎用ベクター テーブルを使用できる場合があります。

于 2019-02-25T09:39:44.310 に答える