STM32 F4 从bootloader跳转用户代码遇到的问题

2024-01-31 22:08

本文主要是介绍STM32 F4 从bootloader跳转用户代码遇到的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码跳转后运行用户程序遇到的问题:

DMA2_Stream3_IRQHandler                                           

DMA2_Stream4_IRQHandler                                        
ETH_IRQHandler                                                         
ETH_WKUP_IRQHandler                                
CAN2_TX_IRQHandler                                                           
CAN2_RX0_IRQHandler                                                          
CAN2_RX1_IRQHandler                                                          
CAN2_SCE_IRQHandler                                                          
OTG_FS_IRQHandler                                                    
DMA2_Stream5_IRQHandler                                          
DMA2_Stream6_IRQHandler                                          
DMA2_Stream7_IRQHandler                                          
USART6_IRQHandler                                                        
I2C3_EV_IRQHandler                                                          
I2C3_ER_IRQHandler                                                          
OTG_HS_EP1_OUT_IRQHandler                           
OTG_HS_EP1_IN_IRQHandler                            
OTG_HS_WKUP_IRQHandler                                
OTG_HS_IRQHandler                                                   
DCMI_IRQHandler                                                            
CRYP_IRQHandler                                                    
HASH_RNG_IRQHandler
FPU_IRQHandler                                                 

                B       .       //停在此处

                ENDP

                ALIGN

错误说明:有未处理的中断函数,未实现的中断函数。

错误原因:1.在bootloader中使用了部分外设的中断如TIM定时器,跳转到用户程序之前未关闭外设,用户程序又没有使用这些外设。

2.用户程序起始地址未对齐,此处对齐不单单是按照4字节对齐,要满足向量表的地址要求为0x200对齐,即库函数中#define VECT_TAB_OFFSET  0x20200 /*!< Vector Table base offset field.This value must be a multiple of 0x200. */

关于为何是0x200整数倍的解释如下:(转自http://blog.csdn.net/u011318735/article/details/17589779)

最近学习lm3s811的时候,看到启动代码发现跟STM32的启动代码有不少区别,然后就开始详细的看启动代码,最后总结出如下几个点,其实并没有本质 上的区别,由于用lm3s811是为了最近的比赛,所以快速的用库进行了开发,就没有对具体TI公司怎么来设计进行细看,所以就以STM32来说。
1,首先STM32启动代码里面AREA    RESET, DATA, READONLY ;由于是Readonly,所以其实是放到了CODE区
__Vectors应该就是0了,因为编译器本身分配是从头开始的。
  2,而软件仿真时添加__Vectors到Watch1里面观察是x20000688,但是由于其不是变量,所以数值是不可预测的,这里应该是涉及到编译器与仿真器之间的关联了,(问题)以后再研究为啥会是这个数(实际上是从头开始的地址)。
  3,软件仿真时发现system_stm32f10x.c这个文件中SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;(其中FLASH_BASE的值为0x08000000,VECT_TAB_OFFSET为0x0)这么 一句话让VTO寄存器变成了0x08000000,所以其第28:7位的TBLOFF应该是0x100000,第29位TBLBASE为0,意思是向量表 被重定位到VT0寄存器的值即0x08000000,即STM32F10X系列(其他系列不知道,应该是ARM规定的类似的内存映射)中FLASH起始位 置。另外这里第29位TBLBASE为1的话,整个VTO变成了0x28000000即RAM的起始位置。

  而ST公司重定位向量表的库函数:
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)
 
  assert_param(IS_NVIC_VECTTAB(NVIC_VectTab));
  assert_param(IS_NVIC_OFFSET(Offset));  
   
  SCB->VTOR = NVIC_VectTab | (Offset & (uint32_t)0x1FFFFF80);
}

其中NVIC_VectTab要么是FLASH要么是RAM的起始位置,Offset: Vector Table base offset field. This value must be a multiple of 0x200,这里先是IS_NVIC_OFFSET(OFFSET)  ((OFFSET) < 0x000FFFFF)断言机制,ST公司技术支持给我的回信是这么说的“The max flash size is 1MB, that is 0x100000, so the vector table must be placed within this address range, so ((OFFSET) < 0x000FFFFF) is checked.”f10x 内置flash最大也就512K,SRAM内置是64k,并没有看到官方人员说的1MB,我想这些断言机制恐怕也是为了给很多芯片共同使用而写的,也就是说实际还是要自己小心着用啊~
然后(Offset & (uint32_t)0x1FFFFF80)事实上就是取了Offset的[28:7]位。但是 你还是需要人为让其为0x200的倍数,至于为什么,
在ARM官方给出的Cortex-m3 technial reference manul中是这么说的:
The Vector Table Offset Register positions the vector table in CODE or SRAM space. 
The default, on reset, is 0 (CODE space). When setting a position, the offset must be 
aligned based on the number of exceptions in the table. This means that the minimal 
alignment is 32 words that you can use for up to 16 interrupts. For more interrupts, you 
must adjust the alignment by rounding up to the next power of two. For example, if you 
require 21 interrupts, the alignment must be on a 64-word boundary because table size 
is 37 words, next power of two is 64.
所以由于人家规定要对齐向量表,由于stm32的中断向量一共有68+16=84个,应该把这个数增加到下一个2的整数倍即128,然后换算成地址范围128*4=512,就得到了0x200。
IS_NVIC_OFFSET(Offset)

另外看到一个网友“京剧娃娃”这一句话我觉得很不错:
“学STM32的过程中觉得看手册一点很重要,就是区分各个官方手册的等级: 
"ARMv7-M Architecture Application Level Reference Manual(November 2010)" (ARM官方发布) 这是理论框架,涵盖范围最广..........(I) 
"Cortex-M3 Technical Reference Manual.r2p1" (ARM官方发布) 这是技术构架,涵盖范围次之.........................................................(II) 
"PM0056 Programming manual Rev4" & "Reference manual_Rev13"(ST官方发布)这是产品实现,范围最小,定位到特定系列产品.....(III) ”

这篇关于STM32 F4 从bootloader跳转用户代码遇到的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665197

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at