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

发布者:binggege最新更新时间:2019-03-24 来源: eefocus关键字:STM32  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  bootloader  跳转  用户代码 引用地址:STM32 F4 从bootloader跳转用户代码遇到的问题

上一篇:STM32 USB CDC 驱动问题
下一篇:STM32-USB之Buffer Description Table

推荐阅读最新更新时间:2024-03-16 16:26

关于IAR开发STM32配置
因为自己要学Msp430还有ZigBee发现IAR真的挺好用,,,所以以后想着就用IAR写单片机程序,, 这次配置我不会把程序的配置弄得有条理,分开文件夹存放,,,我要把那些文件全都放到一块,,弄得乱七八糟,,,因为自己一开始学习用Keil开发32的时候,,网上的视频建工程全都是建的 很有条理,,对于一开始学的自己当时就感觉特麻烦,,,对于初学者更是感觉麻烦,,反而让初学者觉得难,,,,,所以呢!嘿嘿,,,,,,,哪样简单哪样弄 不要以为我不是一个讲究的人哈,我自己建的工程都是很有条理的,,看我Keil的,,,第一次用IAR嘛,,先怎样简单怎样建,,,,,,,, 首先你要有下载的STM32的固件库 新建一个文件夹 把
[单片机]
关于IAR开发<font color='red'>STM32</font>配置
STM32 HAL 库, 配置串口DMA接收及空闲中断
1、 使用CUBEMX 配置自动生成代码: ①添加串口的DMA 通道 ②使用串口全局中断: 其他的配置就不详细说了。 生成代码后, 打开工程在串口初始化函数中添加代码: /* USART1 init function */ void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Pari
[单片机]
__main() 和 main()
__main() 和 main()(转载) 因为我们通常在BOOTLOADER中都已做好了比较细致的初始化工作,包括代码的搬运,所以我们最好别再调用库函数__main(),因为__main()作为ADS集成好的库函数,会对系统进行初始化设置,可能会与我们的初始化发生冲突,故在我们做好初始化后最好别调用__main()。仿真时若调了__main()且没设置entry会报警告,__main()库函数代码不太了解,估计跟ADS初始化有关,库函数__main()要慎用。 当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。最简单的一种情况是: IMPORT main B
[单片机]
STM32笔记 (九)串口通讯USART(串口发送接收编程)
简介 串口USART(Universal Synchronous Asynchronous Receiver and Transmitter)也叫通用同步异步收发器,是单片机与外部进行信息交互的重要通信接口,属于单片机的一种外设,几乎所有单片机都支持使用串口通讯,同时也是单片机程序调试的一种重要手段,对于STM32,串口资源非常丰富,功能也比较齐全,以STM32F103ZET6为例,就提供了5路的串口,我们一般用把串口用来在电脑的串口调试工具上打印调试信息,从而了解程序运行是否正确、如果出错的话也能知道是哪里出了错误。 通讯的有关概念 并行通讯 并行就是采用多条数据线进行通讯 优点是传输速度快,缺点是占用的引脚资源多 串行
[单片机]
<font color='red'>STM32</font>笔记 (九)串口通讯USART(串口发送接收编程)
STM32项目(二) —— 车灯测试台架
需求: (1)、点灯控制器:在线节拍,离线节拍; (2)、PWM控制盒:在线PWM,离线PWM; (3)、电流测试模块:检测车灯电流校准系数; 方案: 点灯控制器:STM32 + CAN + GPIO 节拍:比如亮多长时间,灭多长时间;大节拍中嵌套多个小节拍,每个灯对应相同或者不同的节拍。 上位机下发控制指令,表明此时是在线还是离线。(离线跑的节拍是在在线模式下下载的) 在线模式:如果是直接输出,按照指定格式下发CAN消息,MCU接受消息并解析,切继电器点灯;如果是存储节拍,MCU内部Flash存储上位机通过CAN下发的点灯节拍。 离线模式:从内部Flash中读取节拍,并控制继电器点灯; 模式切换按钮:不仅可以通过上位机控制
[单片机]
仿生液压四足机器人伺服控制器设计
引言 近年来各类军用机器人在国防领域和地缘战略中发挥着重要的作用。在我国广大西部地区,由于地形复杂、道路崎岖,传统的轮式或履带式机器人无法满足地形通过性要求,而仿生四足机器人能够较好地满足在非结构化地形条件下可靠行进的任务需求。液压驱动的仿生四足机器人是近年国内外的研究热点与主攻项目,在其关键技术群中,电液伺服控制技术则是保障仿生液压四足机器人实现稳定行进功能的核心技术。 1总体设计 1.1控制对象分析 本文依托北京理工大学特种机器人技术创新中心正在研发的一款仿生液压四足机器人展开研究,机器人每条腿具有3个主动自由度和1个被动自由度,分别为髋侧摆关节、髋正摆关节、膝关节和足部二阶弹簧减震器,全部12个主动关节均由液
[单片机]
仿生液压四足机器人伺服控制器设计
JLINK给STM32下载的两种模式--jtag & sw连线及配置
jtag线就不说了,将jlink的Vref、GND、TMS、TCK分别接至SW接口。对于STM32F103RCT6来说:TMS--PA12,TCK--PA14. 关于KEIL MDK中的设置如下图所示就可以了,然后就可以像下载JTAG那个下载sw了:
[单片机]
STM32软件复位(基于库文件V3.5)
STM32软件复位(基于库文件V3.5) void SoftReset(void) { __set_FAULTMASK(1); // 关闭所有中端 NVIC_SystemReset();// 复位 } 在官方软件库的 core_cm3.h 文件里 直接提供了 系统复位的函数 static __INLINE void NVIC_SystemReset(void) { SCB- AIRCR = ((0x5FA SCB_AIRCR_VECTKEY_Pos) | (SCB- AIRCR & SCB_AIRCR_PRIGROUP_Msk) | SCB_AIRCR
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved