×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-05-25 发布时间:
|

问题描述:


最近在调试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调用错误,但是由于自己知识浅薄,所以也是多方查找才解决问题,所以分享出来,希望大家不要在这上面花费太多时间。  


关键字:stm32f030  bootloader  外部中断

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
用中断方式.实现PIC单片机的串口传输