• 001.关于Cortex M0系列MCU中断向量表重映射问题


            在STM32F103等Cortex-m3/m4内核的单片机上可以通过设置SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;该寄存器的值来实现中断向量表的重定义。关于Cortex M3/M4中断向量表重映射问题会单独一篇文章详细介绍,此篇主要讲解关于M0的,要问为什么要做中断向量表重映射也会单独一篇文章详细介绍。与M3/M4不同的是在STM32F0xx系列以Cortex-m0为内核的单片机中却怎么也找不到这个设置中断向量表的寄存器,可是在ST提供的固件库里,我却没有发现类似于stm32f10x固件库中的voidNVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)接口,浏览了一下Cortex-M0的Programmingmanual,原来M0并没有SCB->VTOR这个寄存器,难怪ST的库里没有提供NVIC_SetVectorTable这个接口。

    通过查阅 Reference manual文档(RM0360)中找到以下说明:

    sp170318_234358

    可以通过以下方法来实现中断向量表重定义。

    基本思想:

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

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

    3、设置STM32F0xx中断向量表位于RAM中,主要用到的寄存器如下:

    具体实现代码如下:

    /*
    *  Function: void JumpToApp(void)
    * Parameter: none
    *    Return: none
    */
    static void JumpToApp(void)
    {
      ApplicationAddress = APP_FLASHADDR;
      if (((*(uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
      {
        /* Jump to user application */
        m_JumpAddress = *(uint32_t*) (ApplicationAddress + 4);  /*最开头4个字节存放MSP的初始值,从这之后的4个字节存放ResetHandler中断向量*/
        JumpToApplication = (FunVoidType) m_JumpAddress;
        /* Initialize user application's Stack Pointer */
        __set_MSP(*(uint32_t*) ApplicationAddress);
        JumpToApplication();
      }
    } 
    /*
    *  Function: void clock_init(void)
    * Parameter: none
    *    Return: none
    */
    int main(void)
    {
      memcpy((void*)0x20000000, (void*)APP_FLASHADDR, 0x100);
      SYSCFG->CFGR1 |= 0x03;
      JumpToApp();
      while (1);
    }

    微信公众号:嵌入式大玩家

    
    
    
    
    

    更多精彩文章我将第一时间在微信公众号里面分享,如果不想错过,可以关注我的微信公众号。

    
    
    
    
    

    本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果觉得文章的内容对你有用,又想了解更多相关的文章,请用微信搜索“嵌入式大玩家” 或者扫描下面二维码、关注,将有更多精彩内容等着你。

    
    

     
  • 相关阅读:
    JavaScript开发工具WebStorm v2022.2简体中文激活码
    分析J2SE和J2EE的Java剖析程序JProfiler
    Python判断Linux用户是否存在
    php连接MySQL数据库
    centos7镜像部署的phpfpm的9000端口无法被外部访问
    zabbix执行Python脚本报错error: import: command not found
    编译失败configure: error: Cannot find ldap libraries in /usr/lib
    PHP编译安装报错cannot stat `ext/phar/phar.phar': No such file or directory
    count(1)和count(*)的区别
    PHP编辑报错/lib64/liblber2.4.so.2: could not read symbols: Invalid operation
  • 原文地址:https://www.cnblogs.com/andyzhao365/p/6576718.html
Copyright © 2020-2023  润新知