IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 解决STM32进行IAP升级跳转至APP后无法进中断问题 -> 正文阅读

[嵌入式]解决STM32进行IAP升级跳转至APP后无法进中断问题

最近碰到STM32在进行IAP升级时跳转至APP后无法进入中断,导致程序无法运行。正常情况下STM32进行IAP升级时,在跳转至APP程序之前,应该关闭外设,关闭中断。BootLoader中跳转程序如下:

		typedef void (*pFunc)(void);//定义
		
		__set_FAULTMASK(1);
		pFunc pApp;
		pApp = (pFunc)(*(__IO uint32_t*)(APP_DEFAULT_IMAGE_ADDR + 4));
		__set_MSP(*(__IO uint32_t*)APP_DEFAULT_IMAGE_ADDR);
		pApp();

在APP程序中keil已经进行如下设置:
在这里插入图片描述
在system_stm32l4xx.c中打开USER_VECT_TAB_ADDRESS宏定义,并设置偏移量:
在这里插入图片描述
运行之后发现能正常跳转至APP程序中,并且没有跑飞,只是无法进入中断,最后发现是BootLoader程序中执行了__set_FAULTMASK(1);这行代码。

FAULTMASK是一个中断屏蔽寄存器,当它置1时,只有NMI能响应,其他的中断或者fault都无法响应,为0的时候表示没有异常,才能正常响应中断,属于特权级。

因此,在进入APP程序中,应该使用__set_FAULTMASK(0);打开FAULTMASK全局中断,可以加在SystemInit()函数开始部分或者main()函数中。

void SystemInit(void)
{
	__set_FAULTMASK(0);
#if defined(USER_VECT_TAB_ADDRESS)
  /* Configure the Vector Table location -------------------------------------*/
  SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET;
#endif

  /* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
  SCB->CPACR |= ((3UL << 20U)|(3UL << 22U));  /* set CP10 and CP11 Full Access */
#endif

  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set MSION bit */
  RCC->CR |= RCC_CR_MSION;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000U;

  /* Reset HSEON, CSSON , HSION, and PLLON bits */
  RCC->CR &= 0xEAF6FFFFU;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x00001000U;

  /* Reset HSEBYP bit */
  RCC->CR &= 0xFFFBFFFFU;

  /* Disable all interrupts */
  RCC->CIER = 0x00000000U;
}

SystemInit()函数在main()函数之前执行,可以在启动代码startup_stm32l431xx.s中看到:

Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

同理,如果跳转前使用__disable_irq();关中断,在APP中要先使用__enable_irq();打开中断。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-19 12:03:02  更:2021-10-19 12:03:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:38:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码