aerkate

MSP430基础篇—内部模块结构、寄存器【原创】

0
阅读(3083)

 

自从写完第一篇后,一直都在思索下面该如何展开。最近看C++的过程中给了我一些想法,可能大家会知道学习C++有两本很好的书:《The+C+++Programming+Language》和《C++Primer》。前一本是C++之父Bjarne Stroustrup的作品,前言中有提示说不需要任何基础就可学习,当我看了100多页时有点小崩溃了,可能只有当我们可以站在他的角度上的话确实不需要任何基础,后来只得折回头来看《C++Primer》,会从比较基础的方面一步一步的引导你探索新的东西。当然还有一本《C++Primer Plus》可能会更适合初学者。

扯得有点远了,当然每个人都有自己学习的不同方式,我还是比较赞同先打好基础的。在对430进行进一步探索前,我们需要先来建立一些直观的认识。下面呢让我们先进入MSP430的内部去探讨一番。

 

上图是MSP430的内部功能部件。精简指令集CPU,因系列而不同的时钟系统,防止系统跑飞的看门狗(WDT)、在51系列中也有出现的用于直接数据传输的DMA,功能强大的定时器A、B,各种存储介质(Flash、ROM、RAM),模数、数模转换(ADC、DAC),I/O口,可选择方式的液晶驱动模块(LCD diver),用于低功耗和配合LCD的基本定时器(BASIC Timer),具有日历功能的32为计数器的实时时钟(RTC),硬件乘法器,运放,比较器,用于串行通信的USART模块。当然某款单片机的部件是依据它所专注功能来部分的选择上述模块了。

看完了内部模块,下面再让我们来看一下MSP430中的寄存器资源

上图摘自TI的datasheet,通过此图我们可以看出MSP430具有可谓丰富的寄存器资源,包括R0~R3的4个特殊功能寄存器:用于程序计数器的R0、用于堆栈指针的R1、用于记录控制标志和状态标志的状态寄存器R2、用作常数发生器的R2,R3。

程序计数器PC是CPU最基本的寄存器,存放着下一条将要从程序寄存器中取出的指令的地址,通过往程序寄存器中植入新的数值来改变程序的流向,实现中断的响应,条件、无条件的转移以及调用指令。

执行系统的过程中,当需要调用子程序或者进入中断服务程序时就要用到堆栈,通过入栈、出栈的操作,来操作程序的执行过程,而这些操作将会涉及到堆栈指针SP了。

16位的状态寄存器其实只用到了9位。可以浏览一下,里面的标志位后面使用时都会提到。

 

MSP430系列采用的是ROM、RAM统一地址空间的“冯—诺依曼”结构,使用一组地址、数据总线、相同的指令对他们进行字节或者字形式的访问。下图明了的给出了64K存储器空间的使用描述。

不同型号的存储空间分布存在一些差异:容量不同,起始地址也不一样。当然由于使用C语言进行编程所以对其只需有印象上的了解,也不必深究。从图可看出,程序由高地址向下存储,而在0FFE0~0FFFFH空间中保存的中端向量表也因型号而异已。数据存储器从0200H开始向上存储。

 

MSP430以其低功耗而著称,通过有效的时钟系统,各个模块可以不依赖CPU而单独工作,只在需要处理时通过发送中端来唤醒沉睡中的CPU,从而最大限度的降低功耗。下面我给出一张MSP430的工作模式状态图,其中包含了各种工作模式、控制位及时钟的活动状态,在没有说明时钟系统之前先大体的了解一下。