关于stm32f030增加bootloader后外部中断不响应的问题

来源:互联网 发布:淘宝怎么看正品 编辑:程序博客网 时间:2024/06/01 08:09


问题描述:

   最近在调试stm32f030芯片,增加bootloader后,可以正常跳转到应用程序,程序能够正常跑起来,但是却不进DMA中断,外部中断无法响应,这个问题找了好久....


源码:

void NVIC_Configuration(void){
uint32_t i = 0;/* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  /* Copy the vector table from the Flash (mapped at the base of the application load address 0x08001000) to the base address of the SRAM at 0x20000000. */for(i = 0; i < 48; i++){VectorTable[i] = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));}/* Enable the SYSCFG peripheral clock*/RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE); /* Remap SRAM at 0x00000000 */SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
}
  由于f030没有向量表,需要做地址映射,来达到程序跳转bootloader的作用。需要将程序的向量表拷贝到ram中,然后通过ram来获取程序的起始地址。

  首先分析问题

  由于SYSCFG寄存器的外部时钟被关闭了,所以造成外部中断无法响应。RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE)函数是用来设置RCC->APB2RSTR的对应位,如果设置了这个对应位那么对应的外设的时钟就被关闭了。通过查找库文件我们发现这个只有在P_DeInit()中才会用而且是成对出现。要想将一个外设或者是寄存器的值恢复到出厂设置,连续调用两次即可,要是调用一次就会出现上述问题,当然我们调用两次也是可以的,先ENABLE然后再DISABLE;而下面的函数RCC_APB2PeriphClockCmd很简单,只是打开外设时钟。
 最后看一下SYSCFG 寄存器:
   主要是用来重映射内存地址和管理外部中断连接到GPIO上。
其实就是我们的API调用错误,但是由于自己知识浅薄,所以也是多方查找才解决问题,所以分享出来,希望大家不要在这上面花费太多时间。

原创粉丝点击