历史上的今天
返回首页

历史上的今天

今天是:2025年03月24日(星期一)

正在发生

2019年03月24日 | STM32 F4 从bootloader跳转用户代码遇到的问题

2019-03-24 来源:eefocus

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


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) ”


推荐阅读

史海拾趣

Gang Song Electronics Co Ltd公司的发展小趣事

在加入Telit后,GainSpan的技术和产品迅速在全球范围内得到推广和应用。Telit凭借其强大的市场网络和品牌影响力,将GainSpan的低功耗WiFi模组带到了更多的国家和地区。特别是在北美、欧洲和亚洲等物联网市场发展迅速的地区,GainSpan的技术和产品更是成为了众多企业和项目的首选。通过全球化布局,Telit进一步巩固了其在物联网市场的领先地位。

DCCOM [ DC COMPONENTS ]公司的发展小趣事

在追求经济效益的同时,DCCOM公司也积极履行社会责任。公司倡导环保理念,注重可持续发展。在生产过程中,公司采用环保材料和清洁能源,减少对环境的影响。此外,DCCOM还积极参与社会公益活动,回馈社会。这种环保理念和社会责任感使得DCCOM在行业中树立了良好的形象。

请注意,以上故事均基于虚构和假设,不代表任何真实情况。如果您需要了解DC Components或其他特定公司的真实发展历程和故事,建议您查阅相关资料或联系公司官方获取准确信息。

贝特莱公司的发展小趣事

深圳贝特莱电子科技股份有限公司成立于2011年7月,从一开始,公司就明确了以技术研发为核心的发展战略。依托专业团队多年的行业资源积累,贝特莱致力于开发具有自主知识产权的核心技术。在指纹识别、触控、生命感知及MCU等芯片领域,贝特莱不断取得突破,为后续的市场拓展奠定了坚实的基础。

CANOPUS公司的发展小趣事

面对激烈的市场竞争,CANOPUS始终保持着创新的精神。公司不断推出新产品、新技术,以满足不同消费者的需求。同时,CANOPUS也注重品牌形象的塑造和提升,通过赞助音乐活动、举办音乐会等方式,提升品牌知名度和影响力。

这些故事只是CANOPUS公司在电子行业中发展的冰山一角。实际上,公司的发展过程充满了挑战和机遇,每一个阶段都离不开创始人的智慧和团队的努力。未来,随着科技的进步和市场的变化,CANOPUS将继续保持创新精神,为音乐爱好者带来更多优质的产品和服务。

广州基安彼(GMB)公司的发展小趣事

随着业务的不断拓展,CANOPUS开始专注于鼓的制造研究。在1984年,公司推出了其标志性产品——整木掏空榉木军鼓。这款鼓的独特之处在于其鼓腔是由整个树干挖空处理而成,导角也做了特有的设计。这一创新使得CANOPUS的鼓在音质和外观上都与众不同,迅速在市场上获得了认可。

CINTERION公司的发展小趣事

近年来,CINTERION与泰雷兹达成战略合作,共同推出了创新型物联网无线通信模组Cinterion MV32。这款模组结合了泰雷兹在连接管理方面的灵活性和CINTERION在无线通信模组技术上的优势,为制造商提供了快速构建和维护高性能5G设备的解决方案。这一合作不仅加强了CINTERION在物联网领域的市场地位,也为其在未来的发展中注入了新的活力。

以上五个故事均基于CINTERION在电子行业中的发展历程和成就进行描述,旨在客观呈现其在不同领域的发展轨迹和技术实力。

问答坊 | AI 解惑

熟悉酷派API的朋友帮个忙

酷派有一个API, int YLMsgBox(TCHAR *content, TCHAR *caption, int iType) 请问这个MessageBox是什么样子呢?跟他自己的UI是一个风格还是?? 还有就是返回值是什么含义?要是是MessageBox的话,用户点击不同的Button,返回值应该不一样吧? 还有,这 ...…

查看全部问答>

图片浏览器:加载大图片的问题

  因为有时候用户可能翻页的速度很快 我必须速度准备好图片,但是有时候图片实在太大了 需要等待很久(比如说一秒) 目前IPHONE 在滑动过快的时候 是显示一张比较模糊的图片,不晓得是怎么实现的 大家有什么好方法 进来talk talk…

查看全部问答>

关于hive注册表?

boot.hv是放在HIVE BOOT SECTION ;END BOOT SECTION之间的,在系统启动的时候实现加载! 那么,在注册表中的其它部分是怎么确认分别归属于default.hv和user.hv的, 是不是有什么标签?  …

查看全部问答>

一个奇怪的放大电路

电路说明:1,电路对R265,R256,R232加热。2,U88用来监测MOS管的电流。问题:U87:A所起的作用是什么?几个电阻DNS了,看不懂,希望有人能够提供帮助…

查看全部问答>

[DIM3517试用]

-------首先要谢谢EEWorld和SEED对我的信任,给了我这个难得试用的机会。对于规模较小的公司来说,设计完整,做工精炼的开发板都是一项不小的开销,何况是对于工程师个人。所以EEWorld和SEED能提供这样的试用机会,我十分高兴也很兴奋。第二,说说 ...…

查看全部问答>

STM8eeprom问题严重--求解

我用STM207,写EEPROM时会导致CPU复位,,不知是何故,, 只要把串口通讯线接上,  一写EEPROM就会死机复位,,,. 拔掉好像不死,,,,怎么会这样,,,,哪位高人请指点指点…

查看全部问答>

我*,杭州电子市场jlinkV8的很便宜!

我*,杭州电子市场jlinkV8的仿真器很便宜!我现在用的V6的当初还要了1K多,刚才问了一下开增值发票才160,本人做技术,不是做广告,所以不说地址,只是让大家买的时候有个心里价位。 我用的是jlinkV6.0(自已当时在网上下来做的板子 )的SWD调 ...…

查看全部问答>

UART4_IRQn定义

红色部分用IAR编译的时候提示 undefined,换成绿色的却没有问题?? void NVIC_Configuartion(void) {   NVIC_InitTypeDef NVIC_InitStructure; /*Config the NVIC Preemption Priority Bits*/   NVIC_PriorityGrou ...…

查看全部问答>

8962 连路由器后不能无线登录

自己做的板子,把板子连到路由器上,然后用PC机访问板子, 如果PC机是用网线和路由器连接的,那么可以正常访问,但是如果用无线连的就访问不了,纠结了,   哪位高人指点一下…

查看全部问答>

开关电源保护电路设计资料汇总

评价开关电源的质量指标应该是以安全性、可靠性为第一原则。为使电源在恶劣环境及突发故障情况下安全可靠地工作,必须设计多种保护电路,比如防过压、欠压、过热、过载等保护电路。本人自毕业后一直从事接触开关电源设计工作,到2011年,也有些年头 ...…

查看全部问答>