单片机
返回首页

STM32F0xx IAP实现之中断向量表重定义

2017-09-11 来源:eefocus

在STM32F103等cortex-m3/m4内核的单片机上可以通过设置SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;该寄存器的值来实现中断向量表的重定义。但在STM32F0xx系列以cortex-m0为内核的单片机中却怎么也找不到这个设置中断向量表的寄存器,可以通过以下方法来实现中断向量表重定义。

基本思想:

1、将中断向量表放入到RAM的起始地址(只需要在应用程序中保留RAM其实地址的0x100大小不使用即可)。

2、在bootload中将应用程序的中断向量表从Flash中拷贝到RAM中。

3、设置STM32F0xx中断向量表位于RAM中。

具体实现代码如下:


  1. /* 

  2. *  Function: void JumpToApp(void) 

  3. * Parameter: none 

  4. *    Return: none 

  5. */  

  6. static void JumpToApp(void)  

  7. {  

  8.   ApplicationAddress = APP_FLASHADDR;  

  9.   if (((*(uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)  

  10.   {  

  11.     /* Jump to user application */  

  12.    /*最开头4个字节存放MSP的初始值,从这之后的4个字节存放ResetHandler中断向量*/  

  13.     m_JumpAddress = *(uint32_t*) (ApplicationAddress + 4);   

  14.     JumpToApplication = (FunVoidType) m_JumpAddress;  

  15.   

  16.     /* Initialize user application's Stack Pointer */  

  17.     __set_MSP(*(uint32_t*) ApplicationAddress);  

  18.     JumpToApplication();  

  19.   }  

  20. }  

  21. /* 

  22. *  Function: void clock_init(void) 

  23. * Parameter: none 

  24. *    Return: none 

  25. */  

  26. int main(void)  

  27. {  

  28.   memcpy((void*)0x20000000, (void*)APP_FLASHADDR, 0x100);  

  29.   SYSCFG->CFGR1 |= 0x03;  

  30.    

  31.   JumpToApp();  

  32.   while (1);  

  33. }  



进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章