您的位置:首页 > 其它

ARM CORTEX M系列中ROM TABLE原理分析

2017-08-08 10:13 316 查看
最近因为工作需要,在研究CORTEX M系列的MCU内部ROM TABLE工作方式,之前对这个ROM TABLE的理解有些模糊,经过查询一些文档加上自己的理解,现在比较清晰了,在此总结以下。

目前参考到的文档有以下:

1.ARM® Debug Interface Architecture Specification ADIv5.0 to ADIv5.2

2.ARMv6-M Architecture Reference Manual

3.ARMv7-M Architecture Reference Manual

4.ARMv8-M Architecture Reference Manual(该文档主要针对最新推出的CM23 CM33系列MCU,主要特性是引入了TrustZone)

5.JEDEC STANDARD Standard Manufacturer’s Identification Code 

目前参考的芯片是STM32L053系列的一款LQFP64封装的样片,具体分析稍后再讲,先说一下ROM TABLE的概念,现在网上抄来抄去的概念我就不再重复了,大家想要了解,随便百度都可以看到,这篇文章我讲一下个人的理解。

1.首先要明白ROM TABLE之所以叫这个名字,是因为它是一张表,那么它的表结构是怎样的呢,看下面的图:



这里以ARM V6系列架构的MCU为例,在这个表中,可以清晰的看到ROM TABLE的结构,首先是ROM TABLE中保存的都是32位的数据,每一个数据的含义如下:



其中[31:12]表示的是地址偏移量,以偏移0x000位置的值为例分析:

地址偏移为:0xFFF0F000,由于当前ROM TABLE所在位置为0xE00FF000,所以可以计算出SCS所在地址为:0xE00FF000+0xFFF0F000=0x1E000E000,最高进位舍弃,那么就得到了SCS的基址为0xE000E000。该值的bit0和bit1在上面表里已经写的很清楚了,就不再啰嗦。看到这里,可能大家又会问,这个表能看懂了,但是这个表在哪里该怎么查到呢?看下面。

2.ROM TABLE的基址问题。在ARM的每一个系列的架构中,一般都有一个默认的ROM TABLE基址,其实v6m,v7m,v8m的默认基址都是0xE00FF000,但是对于每家芯片厂商都是可以重新定义的,以STM32L053为例,就已经重新定义了ROM TABLE的结构,其中,该基址的值保存在AP中的0xF8偏移的位置:



针对该值的读取,可能需要大家具备一些对ARM DEBUG INTERFACE的了解,不属于这篇文章的目的,暂时不展开讲,感兴趣的可以看我其他两篇博客。使用J-LINK读取该寄存器,如下图:



这里可以读取到上面的DEBUG BASE REGISTER.值为0xF0000003,这个寄存器的结构和bit定义与上面讲的ARMv6m的ROM TABLE中的寄存器定义是一致的,这样就可以确认到SMT32L0的ROM TABLE入口地址为0xF0000000.

3.确定ROM TABLE入口地址以后,在来看下面这个图:



 看这个图就很清晰了,ROM TABLE是可能有多个的,所以需要逐条读取ROM TABLE中的值,直到到达ROM TABLE的最后为止,结束的标志就是其中的值为0x00000000.

再来看STM32L0的实际内容:截取了开头和结尾





在这个表中,第一项为0xF00FF003,表明该项为有效项(bit0为1),第二项为0x00200002,表明该项为无效项。再看0xF0000FF4位置

CID的[7:4]表明了当前ROM TABLE的class,该值当前为1,具体含义如下:

1表示当前是一个ROM TABLE,其中保存的值都是一些偏移量,类似我们写程序提到的指针,需要在当前表里继续查询,一般查到最低一级的ROM TABLE后,该类别的值就会是0xE,表明是一个IP COMPONENT。

然后就该计算另一个ROM TABLE的入口地址了:0xF0000000+0xF00FF000=0x1E00FF000,是不是很熟悉的地址,这就是默认的ROM TABLE入口地址。

至此,就可以搞清楚ROM TABLE的确认过程,之后每一级的ROM TABLE分析都是一样的逻辑,如果需要上面提到的文档,可以留下邮箱,有时间我发给大家。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ARM ROM TABLE GD32 STM32