历史上的今天
返回首页

历史上的今天

今天是:2024年11月10日(星期日)

正在发生

2020年11月10日 | 关于stm32(cotex-m3)向量表初始化的总结笔记

2020-11-10 来源:eefocus

最近学习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) ”

推荐阅读

史海拾趣

Altonics公司的发展小趣事

在技术创新的基础上,Altonics公司积极拓展市场。公司不仅在国内建立了完善的销售网络,还积极开拓国际市场,产品远销海外。同时,公司注重品牌建设,通过提供优质的产品和服务,树立了良好的品牌形象。公司的广告宣传和展会参展活动也提升了品牌知名度,为公司的长远发展奠定了坚实的基础。

Aplus Flash Technology Inc公司的发展小趣事

随着全球环保意识的提高,电子行业对环保的要求也越来越高。Aplus Flash Technology Inc公司积极响应环保号召,将环保理念融入产品设计和生产过程中。公司研发出了一款低能耗、环保型的闪存芯片,不仅降低了产品的能耗和碳排放,还提高了产品的可回收利用率。这一创新举措得到了消费者的广泛认可和支持,也为公司在市场上树立了良好的环保形象。

Cybernetic Micro Systems公司的发展小趣事

在竞争激烈的电子行业中,CMS始终保持着持续创新的态势。他们不断投入研发资源,推出了一系列具有创新性的产品。例如,他们开发了一款基于人工智能技术的智能家居控制系统,该系统能够通过语音控制实现家电设备的智能化管理。这一产品的推出进一步巩固了CMS在智能家居领域的领先地位。

CANOPUS公司的发展小趣事

CANOPUS公司最初由创始人Shinichi Usuda于1977年创立,当时他经营着一家乐器商店。他深知音乐的力量和乐器的重要性,于是决定将自己的商店逐渐转型为专注于鼓类乐器的制造与销售。经过几年的努力,CANOPUS逐渐在乐器市场上崭露头角,赢得了音乐爱好者的青睐。

ANSHAN [Anshan Suly Electronics]公司的发展小趣事

近年来,随着电子行业的竞争日益激烈和市场环境的不断变化,ANSHAN公司面临着前所未有的挑战。然而,公司始终保持着清醒的头脑和坚定的信心,积极应对各种挑战。公司不断调整战略方向,优化产品结构,加大创新力度,推出了一系列具有竞争力的新产品。同时,公司还积极拓展新的市场领域和合作伙伴,为公司的持续发展注入了新的动力。

这五个故事展示了ANSHAN公司在电子行业发展中不断克服困难、取得成就的历程。从创业初期的艰辛与坚持,到技术突破与产品升级,再到市场拓展与品牌建设、人才培养与团队建设以及应对挑战与持续创新,ANSHAN公司始终保持着坚定的信念和不懈的努力,在电子行业中谱写了一曲曲壮丽的篇章。

安纳森(AnaSem)公司的发展小趣事

在电子行业中,产业链上下游之间的合作至关重要。安纳森深知这一点,因此始终致力于与产业链上下游的企业建立紧密的合作关系。通过与晶圆厂家、IC设计企业等合作伙伴的深入合作,安纳森不仅获得了稳定的原材料供应和技术支持,还共同研发出了多款具有市场竞争力的新产品。这种合作共赢的发展模式不仅提升了整个产业链的竞争力,也为安纳森的长远发展注入了源源不断的动力。

这五个故事只是安纳森在电子行业发展中可能经历的一部分,实际上,其发展历程可能更加复杂和丰富。无论如何,安纳森凭借其创新的技术、全球化的视野、环保的理念、对侵权问题的积极应对以及产业链合作的深化,已经成为了电子行业中一颗璀璨的明星。

问答坊 | AI 解惑

AVR单片机在线编程下载线电路图,PCB图及HEX文件

AVR单片机在线编程下载线电路图,PCB图及HEX文件…

查看全部问答>

wince 5 沙漏(Hourglass)显示问题:点击屏幕,沙漏才有漏沙效果.

刚刚发现的问题,wince 5中用EVC 写应用程序自己调用显示沙漏, 第一种情况:如下,在初始化时显示沙漏持续5s钟,实际效果是,我双击打开应用程序,什么也看不到,如果我点击下屏幕,就会显示出沙漏,如不笔离开屏幕,沙漏也立刻消失.好像只有在点击屏幕是才 ...…

查看全部问答>

切换LCD分辨率时,调色板创建错误,大家来探讨一下!

MINI2440开发板下为了支持动态修改分辨率,在S3C2440DISP:S3C2440DISP()中生成了一个2个元素的数组GPEModeEx  m_ModeInfoEx[2],保存了2个显示模式的分辨率,NumModes()改为返回2,此外其他修改的源代码如下: SCODE S3C2440DISP::GetM ...…

查看全部问答>

WINCE中调用connect函数出错

char *sIp=\"192.168.11.105\";         int nPort = 3000;         int rc;         WSADATA  wsaData;         //SOCKET nConnect;   &nb ...…

查看全部问答>

CH2输入捕获问题

我用TIME2的CH2做输入捕获,数据不对,请大家帮我看一下初始化对不!谢谢! int main(void) { #ifdef DEBUG   debug(); #endif   /* System Clocks Configuration */   RCC_Configuration();  &nb ...…

查看全部问答>

SAMSUNG6410 死机

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 用6410做了个平台,放着过一段时间,就死机了,不知道什么原因,我HOST USB没有,但没接15K,下拉,不知道,有没有关系 …

查看全部问答>

2812搜查令+2812学习课件

资料为学习DSP2812活动的课件,一二讲为基础介绍没有收录,从第三讲到第九讲,基本涵盖了DSP设计的所有方面,知识讲解比较透彻,从实际出发,容易接受。目录如下: 3、CCS常用操作 4、2812的片内资源、存储器映射以及CMD文件的编写 5、中断系统的理 ...…

查看全部问答>

9针串口母座在AD9的哪个库里?

我想请问9针串口母座在AD9的哪个库里?…

查看全部问答>