NXP

关于STM32 M0中IAP升级后找不到SCB->VTOR问题

2019-07-12 13:10发布

参考链接http://www.51hei.com/bbs/dpj-40235-1.html   最近在做STM32F070xx 的OTA功能,也就是远程升级 但是程序跳转后,发现APP发生中断可以响应(仅WKUP ,其他的没试过,不敢妄下结论).。但是无法进入中断处理函数,经过排查,应该是中断向量的偏移没有设置好,之前在做F4的时候,是在程序的开头部分加上SCB->VTOR = FLASH_BASE | 0x8000(后面加上的是自己的偏移地址,可以自行设置) 但是发现在F0的库函数中,并没有发现这个寄存器的设置位置。所以查找了相关的文档后发现,M0的偏移要通过其他的方式来设置,以下是设置的步骤 1 在程序的开头加上    memcpy((void*)0x20000000, (void*)0x08002000, 0xc0); 
                                   SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM); 其中 0x20000000是不需要改动的 这个是SRAM的地址 后面加上的0x08002000是程序的偏移地址 可以自行更改 后面的0xc0是中断向量的的大小 可以在.s文件中查看定义的中断个数  比如 __Vectors       DCD     __initial_sp                   ; Top of Stack
                DCD     Reset_Handler                  ; Reset Handler
                DCD     NMI_Handler                    ; NMI Handler
                DCD     HardFault_Handler              ; Hard Fault Handler
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     SVC_Handler                    ; SVCall Handler
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     PendSV_Handler                 ; PendSV Handler
                DCD     SysTick_Handler                ; SysTick Handler                 ; External Interrupts
                DCD     WWDG_IRQHandler                ; Window Watchdog
                DCD     0                              ; Reserved
                DCD     RTC_IRQHandler                 ; RTC through EXTI Line
                DCD     FLASH_IRQHandler               ; FLASH
                DCD     RCC_IRQHandler                 ; RCC
                DCD     EXTI0_1_IRQHandler             ; EXTI Line 0 and 1
                DCD     EXTI2_3_IRQHandler             ; EXTI Line 2 and 3
                DCD     EXTI4_15_IRQHandler            ; EXTI Line 4 to 15
                DCD     0                              ; Reserved
                DCD     DMA1_Channel1_IRQHandler       ; DMA1 Channel 1
                DCD     DMA1_Channel2_3_IRQHandler     ; DMA1 Channel 2 and Channel 3
                DCD     DMA1_Channel4_5_IRQHandler     ; DMA1 Channel 4 and Channel 5
                DCD     ADC1_IRQHandler                ; ADC1 
                DCD     TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger and Commutation
                DCD     TIM1_CC_IRQHandler             ; TIM1 Capture Compare
                DCD     0                              ; Reserved
                DCD     TIM3_IRQHandler                ; TIM3
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     TIM14_IRQHandler               ; TIM14
                DCD     0                              ; Reserved
                DCD     TIM16_IRQHandler               ; TIM16
                DCD     TIM17_IRQHandler               ; TIM17
                DCD     I2C1_IRQHandler                ; I2C1
                DCD     0                              ; Reserved
                DCD     SPI1_IRQHandler                ; SPI1
                DCD     0                              ; Reserved
                DCD     USART1_IRQHandler              ; USART1
                DCD     USART2_IRQHandler              ; USART2
                DCD     0                              ; Reserved
                DCD     0                              ; Reserved
                DCD     USB_IRQHandler                 ; USB 这里有48个 每个DCD4个字节 所以中断向量的大小为48*4 = oxC0 所以在 这边如红 {MOD}区域的设置。这样基本就解决了。