ARM微控制器与嵌入式系统学习笔记 - 1

MOOC链接:http://www.xuetangx.com/courses/course-v1:TsinghuaX+20320074X+2019_T1

MCU基础

CPU基本结构和运行机制

CPU包含ALU(运算逻辑单元)、寄存器组、控制单元,也可以有浮点运算单元、缓存单元、内存管理单元等。

ALU就是给它输入然后输出结果给我们,一个运算有4个要素:两个输入数据(操作数),Instruction(运算),一个输出数据(运算结果),还有状态(flag标志位),之所以还需要flag,是因为运算可能会出现各种各样的状况,比如溢出,就需要用一个位来告诉程序。

寄存器(register)是由电路实现的若干个保存0或者1的临时的存储单元,在任何CPU的设计中都会有一个特殊的存储器来保留运算中所产生的状态位,它的状态位是随着每一个指令的执行自动更新的,这个寄存器叫Program Status Register程序状态寄存器(PSR),一般会有4种位:Z代表零,N代表负数,O代表溢出,C代表进位。

寄存器也用于临时保存/获取操作数,当然寄存器是肯定不够一个程序使用的,所以我们也可以从存储器中拿到操作数,不过存储器的速度就慢得多了。

控制单元将一条确定的指令解析为对存储器、寄存器、ALU的控制来明确要做的运算以及数据的流向。程序由指令序列构成,保存在程序存储器中,这些指令依次进入CPU进行执行,完成一条指令再取一条。PC寄存器(Program Counter)保存下一条指令将要执行的地址,指令被取出后,PC更新指向下一条指令。

堆栈的概念

但是PC寄存器不能很好的处理函数调用带来的跳转问题,调用很多时不能保存返回地址,虽然早起CPU确实时通过多设置几个寄存器来解决,但是随着程序越来越复杂,这样一种机制并不是很好的解决方案。因此出现了栈的概念。栈是一段连续的存储空间,按照LIFO(后入先出)的方式工作,只能对栈的顶部进行操作。关于栈的操作我在学习算法的时候已经了解很多了,就不再记录了。对于大多数CPU而言,顶端是低位的地址空间。

栈有什么好处呢,在程序之间跳转调用的时候,栈可以用来保存返回地址以及局部参数等。那么我们也需要有一个指针来存储栈顶的位置,堆栈顶端位置通过CPU内部的一个堆栈指针寄存器确定,也就是Stack Pointer。如果要自己操作堆栈,有进一定就要有出,同时也要记住LIFO。而空间的大小总是有限的,因此堆栈不能无限制地存数据,当使用的空间过多,就会造成栈溢出,引发不可控的后果。

中断的概念和机制

轮询是周期性连续地检查一个外部事件是否发生,虽然简单但是会消耗大量的CPU时间;中断是一种硬件判断是否发生外部事件并通知CPU的机制,由专门的中断服务程序来处理事件。中断需要CPU立刻处理,可能是内部事件(比如计时器时间到)也可能是外部事件(比如按键动作等人机交互)。

中断的机制:内部/外部事件请求CPU处理,CPU停止正常流程,执行中断服务程序ISR,ISR结束后,CPU返回正常流程。

同时我们也需要一个机制来保存和还原正常流程的上下文(context),即寄存器内的数据要压入堆栈。虽然压全部寄存器是很好的,但是大多数CPU不会选择全部,例如ARM Cortex在中断发生时只会压R0, R1, R3, R12, Link Register, PC, xPSR,返回正常流程时CPU也会将堆栈里的数据“还回”寄存器中。如果需要这之外的,则需要自己手动操作。

中断子程的概念和编程

中断服务子程(ISR, Interrupt Service Routine),在ARM Cortex M0+平台上,ISR一般与C函数写法没有区别,使用同样汇编返回指令即可。在ARM Cortex M中,ISR是由硬件自动调用的,而不用在其他程序在代码中调用,写成C函数的参数和返回值都应该为void,在ISR执行前后,CPU自动进行堆栈出入的操作。

中断向量表是一段连续的存储空间,在复位后有默认的起止位置,每个中断在中断向量表中都有相应的表象,存储的值是函数的入口地址。每个表象对应不同的中断源,然后存储了入口地址,这样就能将中断与程序绑定起来,方便事件发生时调用它。

多个中断同时出现时,高优先级中断先得到相应。中断优先级可以是固定的或编程指定的,相同优先级的中断按先后顺序处理。

中断嵌套指CPU在执行一个中断服务程序的过程中,可以再次相应新的中断请求。

中断和全局变量一起使用时可能会出现不可预料的风险。

复位、时钟、存储器和总线

复位是初始化MCU内部电路的一个过程:

  • 将所有寄存器恢复成默认值
  • 确认MCU的工作模式
  • 禁止全局中断
  • 关闭外设
  • 将IO置为高阻输入状态
  • 等待时钟震荡趋于稳定

上电、电源丢失、外部产生、复位指令、非法指令、时钟丢失…都会引发复位。

计算机系统是一个典型的时序逻辑系统。时钟是指令执行的基本时间间隔,时钟频率高,意味着CPU执行运算的能力强。看门狗/定时器/异步通信等都依赖于稳定的时钟。时钟通常由外部晶体或振荡器提供。

CPU通过内部总线接口访问存储器/外设,MCU外部总线接口时内部总线接口的信号子集。内部总线接口包括三部分,数据线、地址线和控制线。

地址线:总线设备必须具有一个确定的地址范围,地址线的宽度决定CPU的寻址范围。数据线:CPU通过数据线从设备读取数据/向设备写入数据,是双向的。

本页面的全部内容在 CC BY-NC-SA 4.0 协议之条款下提供,附加条款亦可能应用
本文链接:https://www.copperion.com/2019/arm-mcu-notes-1/