复位、时钟、存储器和总线————————ARM微控制器与嵌入式系统清华大学慕课记录

复位

  • 初始化微控制器内部电路
    • 将所有寄存器恢复成默认值
    • 确认MCU的工作模式
    • 禁止全局中断
    • 关闭外设
    • 将IO设置为高阻输入状态
    • 等待时钟趋于稳定
  • 从固定地址取得复位向量并开始执行

中断向量表

中断向量表对于ARM这样的微控制器来讲,当它上电复位的时候,默认地址是从00地址开始,四个字节一个表项,每一个表项存一个指针,或者存一个函数的入口地址
在下图的中断向量表中,我们可以看到,表中第2项存的是复位的中断向量,在这个表项里面存储的函数入口地址就是对应的ARM芯片复位之后所执行的第一条指令的地址。换句话说也就是一旦CPU执行了复位操作,CPU会自动的从这个位置取一个地址然后赋值给PC指针寄存器,进而程序会根据PC指针所指向的地址一条一条地执行指令。而这个位置填入的地址是入口函数的第一条指令的地址,也就是在开发工具的帮助下,生成的startup.s文件里面的入口函数的第一条指令的地址,相应的入口函数最后的指令便是跳转到用户main函数执行用户写的代码。再来看表中的第一项便是堆栈指针寄存器初始值的存放地址,也就是上电初始化时,给堆栈使用的内存空间的地址。
因此,在系统进行上电复位后,会执行两项操作,也就是会把中断向量表中第一项和第二项中存放内容分别赋值给堆栈指针寄存器和PC指针寄存器,从而使CPU在上电复位时的PC指针指向入口函数的第一条指令,而堆栈指针指向内存中用于给堆栈使用的内存的起始地址。这样也就完成了复位操作。

异常类型 表项地址偏移量 异常向量
0 0X00 MSP的初始值
1 0X04 复位

造成复位的原因

  • 有多种引起复位的因素,有相应的标志位和向量(可以进行不同的初始化流程)

    • 上电复位
    • 电源丢失复位
    • 外部产生的手动复位信号
    • 执行复位指令引发的复位
    • 非法指令引起的复位
    • 时钟丢失引起的复位
    • 看门狗复位

    时钟

    计算机嵌入式系统是一个典型的数字时序逻辑的系统,它需要一个时钟的驱动从而能够让一切有序的运行,一个一个时钟的跳动会驱动PC指针寄存器一个一个地址地往下跳转,一条一条指令的取到控制单元进行有序地解析和运算。
    因此:

    • 时钟是指令执行的基本时间间隔,它能够推动CPU一个周期一个周期的运转,时钟频率越高,意味着CPU执行运算的能力越强。
    • 看门狗/定时器/异步通信等都依赖稳定的时钟
    • MCU内部是一个统一的时钟树,外设的时钟是从系统时钟分频得到的。
    • 时钟通常是由外部晶体或者振荡器提供,使用外部的配置引脚在复位时选择时钟输入源。
    • 广泛应用锁相环技术,将外部较低频率的时钟提高成内部较高频率的时钟(better EMC & EMI)

    存储器

在这里插入图片描述

  • CPU仅拥有若干个寄存器,程序指令和运算数据必须保存在外部存储器上。CPU内部的寄存器仅仅用于CPU保存临时的变量,通俗来讲就是“草稿纸”
  • ROM/FLASH可以保存固定内容,不丢失
    • 其中就包含指令,程序,常量
  • RAM用于保存非固定内容,掉电后丢失
    • 可以用于堆栈的使用以及堆的使用,堆用来存储全局变量
    • 程序运行当中保存变量,保存返回地址。

因此对于计算机来讲,存储器是不可或缺的存在。对于不同MCU来讲,存储器是有大有小的,对于一般的32位ARM的CPU来讲,非易失存储器的大小在几百K的量级,而对于易失性存储器RAM来讲,其容量一般处于十几K的量级。

总线

  • CPU通过内部总线接口访问存储器/外设
  • MCU的外部总线接口是内部总线接口的信号子集
  • 内部总线接口包含三部分:
    • 数据总线
    • 地址总线
    • 控制总线
  • 对于ARM Cortex M0+还支持专门的单周期IO读写
    下图是内部总线的示意图:
    在这里插入图片描述

地址线

  • 总线设备(存储器/外设)必须具备一个确定的地址范围
  • CPU驱动地址线,地址译码逻辑选中对应的设备
  • 地址线的宽度决定CPU的寻址范围(16bit = 0x0000-0xFFFF)

数据线

  • CPU通过数据线从设备读取数据、向设备写入数据
  • 数据总线总是双向的
  • 有8bit,16bit,32bit…

单片机内部地址映射

从CPU向外看,我们可以以地址的角度看到CPU外围设备在地址上与CPU的联系。从下图我们可以清楚地看到从地址0x0000 0000-0X0800 0000是非易失存储器的地址,有128kb的FLASH,在FLASH有一段是专门用于中断向量表的存储,仅接着有一段灰色的从0x0800 0000-0x1FFF F000的这一段是None的,也就是没有任何设备这用这段地址,再接下来便是从0X1FFF F000- 0X2000 0000的地址空间,这段地址空间是用于堆使用的RAM,在一般的裸机程序中,堆也就是用于存储程序中用到的全局变量的地方,再接下来就是从0X2000 000-0X2000 3000的地址,这段地址也是用于RAM的地址,所不同的是这段RAM地址是用于堆栈使用的。0X2000 3000-0X4000 0000是None的,没有任何设备使用,接下来是0X4000 0000 - 0x6000 0000,从图中也可以看出这段地址主要是用于存储外设寄存器的,这些外设是由不同的单片机产商设计的,比如意法半导体设计的或者是TI设计的,尽管是同一个ARM核,但是不同产商设计的寄存器会存在差异,因此这段也就会因为产商的不同而不同,紧接着的是0X6000 0000 - 0XE00 0000,这段地址空间也是没有任何设备使用的,最后一段0XE000 0000-0XFFFF FFFF,这一段主要是用于ARM公司设计的外设,这一段地址空间的外设不会因为单片机产商不同而不同。
在这里插入图片描述

外设

  • CPU实际是通过外设和外部世界进行连接
  • 外设是为特定的控制应用而设计的
    • 输入输出:DIO,ECT,PWM
    • 模拟量处理:AD,DA
    • 通信处理:SCI,SPI,I2C,HDLC,CAN
  • 在MCU中,外设是通过一系列寄存器俩完成设置

存储器

  • 单片机编程的精髓就在于存储器的使用:
    • 代码存储在存储器中
    • 变量存储在存储器中
    • 外设也是通过其在存储器的位置进行访问
  • 单片机开发的特点(相对于计算机来讲):

单片机启动过程

在这里插入图片描述
在描述了CPU,堆栈,存储器,总线,外设的基础上,根据上图所示可以清楚地知道单片机的启动过程,首先在单片机进行上电复位之后,单片机从中断向量表的第一项和第二项分别获得了用于堆栈空间的内存的起始地址以及复位后入口函数的第一条指令,进而使PC指针发生跳转,跳转到Flash地址执行,从上图也可以清楚地看到RAM分成了两段,一段在上,一段在下,因此可以知道用于堆的RAM就是上面绿色的RAM空间,用于堆栈的RAM就是下面绿色的RAM空间。

总结

回顾上述所讲,主要包含了如下几个方面:

  • 单片机复位的时候,默认地址是从0000开始的,也就是中断向量表的第一项,中断向量表的第一个表项的内容是指定的堆栈的起始地址,第二个表项的内容是程序入口函数的第一条指令的地址。复位的时候,单片机会取出第一个表项的内容,从而完成堆栈的初始化,指定堆栈可用的内存空间的起始地址。除此之外,也会取出第二个表项的内容,将这个表项的内容赋值给PC指针使用,从而使得程序从入口函数的第一条指令开始执行
  • 存储器中RAM的作用是作为堆栈和堆使用,而ROM的作用是存储程序,指令和常量
  • CPU的总线主要包括:数据总线,地址总线和控制总线
  • CPU的启动过程和复位时的过程是一致的
发布了19 篇原创文章 · 获赞 6 · 访问量 1727

猜你喜欢

转载自blog.csdn.net/weixin_42616791/article/details/103445017
今日推荐