标题：MC908GP32单片机
主要特点
①512B片内RAM；32K片内Flash程序存储器，具有在线编程能力和保密功能。
②时钟发生器模块，具有32KHz晶振PLL电路，可产生各种工作频率；8MHz内部总线频率。
③增强的HC05 CPU结构；16种寻址方式(比HC05多8种)；16位变址寄存器和堆栈指针；存储器至存储器数据传送；快速8×8乘法指令；快速16/8除法指令；扩展的循环控制功能；BCD功能。
④33根通用I/O脚，包括26根多功能I/O脚和5或7根专用I/O脚；PTA、PTC和 PTD的输入口有可选择的上拉电阻；PTC0—PTC4有15mA吸流和放流能力，其他口有10mA吸流和放流能力 (总体驱动电流应小于150mA)；所有口有最高5mA输入电流保护功能。
⑤增强型串行通讯口SCI；串行外围接口SPI；两个16位双通道定时器接口模块(TIM1和 TIM2)，每个通道可选择为输入捕捉、输出比较和PWM，其时钟可分别选为内部时钟的1、2、4、8、16、32和64的分频值；带时钟预分频的定时基模块有8种周期性实时中断(1、4、16、256、512、1024、2048和4096Hz)，可在STOP方式时使用外部32KHz晶振周期性唤醒 CPU；8位键盘唤醒口。
⑥系统保护特性：计算机工作正常(COP)复位；低电压检测复位，可选为3V或5V操作；非法指令码检测复位；非法地址检测复位。
⑦具有PDIP40、SDIP42和QFP44封装形式。
⑧优化用于控制应用；优化支持C语言。
内部结构简图
单片机(以下简称GP32单片机)的三种封装形式只是引脚数量和形式有所区别，其它方面是一致的。图中I/O口是按 44引脚的GP32给出的，对于42引脚的GP32单片机则没有PTC5、PTC6两个引脚，对于40引脚的GP32单片机则没有PTC5、PTC6及 PTD6/T2CH0、PTD7/T2CH1四个引脚。
从内部结构简图可以看出，GP32内部有以下主要部分：CPU08、存储器、定时器接口模块、定时基模块、看门狗模块、通用I/O接口、串行通信接口 SCI、串行外设接口SPI、断点模块、A/D转换模块、键盘中断模块、时钟发生模块及锁相环电路、低电压禁止模块、复位与中断模块、监控模块MON和系统设置模块。
引脚功能
40引脚的MC908GP32单片机的引脚图，引脚功能分类简介如下：  (1) 电源类引脚
VDD、VSS(20脚、19脚)：电源供给端。
VDDAD /VREFH、VSSAD /VREFL(31脚、32脚)：内部A/D转换器的电源供给及参考电压输入端。
VDDA、VSSA(1脚、2脚)：时钟发生器模块(CGM)的电源供给端。
(2) 控制类引脚
(6脚)：外部低有效复位输入或输出脚，有内部上拉电阻。
(14脚)：外部中断输入脚，有内部上拉电阻。
(3) I/O类引脚
PTA7/KBD7～PTA0/KBD0(40～33脚)：8位通用双向I/O口，每个可编程为键盘输入脚。
PTB7/AD7～PTB0/AD0(30～23脚)：8位通用双向I/O口，也可作为8路8位A/D转换输入脚。
PTC4～PTC0(11～7脚)：5位通用双向I/O口。
PTD5/T1CH1～PTD0/ (22、21、18～15脚)：6种特殊功能、双向I/O口，其中T1CH1、T1CH0用于定时器模块(TIM1)。SPSCK、MOSI、MISO、 用于串行外围接口(SPI)。
PTE0/TxD、PTE1/RxD(12脚、13脚)：2位双向I/O口或串行通讯口。
(4) 其它
CGMXFC(3脚)：CGM的外部滤波电容连接脚。
OSC1、OSC2(5脚～4脚)：片内振荡器引脚。
GP32存储器组织
CPU08 可寻址64K地址空间，所以它的地址范围是$0000～$FFFF，在这$0000～$FFFF的寻址范围内，分成多个不同区段，每个区段的作用不同。 MC908GP32单片机的存储器组织及地址分配见图。图中只是画出了64K地址空间的简要映像。RAM区域及其作用用户RAM的地址范围是：$0040～$023F，共512字节。这个区域既是用户RAM，也是堆栈RAM。一般情况下，这个区域安排用户数据和堆栈空间。由于这个空间较小，必须合理安排初始堆栈指针SP和用户数据，更好地发挥RAM的作用。在这个区域中，有192字节的RAM属于第0页，也就是地址的高8位为0，第0页RAM的地址范围是：$0040～$00FF，这个地址范围寻址方便，合理分配使用这些内存地址对实际编程很有帮助。
必须注意的是，由于堆栈也在RAM区域，且复位时SP=$00FF，位于第0页内，所以实际编程时，可以把SP从第0页移出，例如使之为$023F，也就是初始的SP在RAM的最高地址处，由于M68HC08系列单片机的进栈指令是使SP-1，所以是堆栈数据向低地址方向依次堆放，这样堆栈使用的地址空间是$023F→更低地址方向。安排用户数据时，可以从RAM的最低地址$0040向更高地址空间安排，即用户数据使用的地址空间是$0040→更高地址方向。这样从两头向中间使用，可以尽量避免两种数据交叠，发生错误。但是，用户数据不宜安排过多，要给堆栈留有足够的空间，否则运行时可能产生错误。若内存安排较满，必须精确计算堆栈最大可能深度，以保证程序的正常执行。映像寄存器名及简明含义所谓映像寄存器，是指那些通过存储器地址访问的寄存器，它们不像寄存器A、H:X、SP、PC、CCR那样直接通过其“名”来使用它，而是通过它们对应的地址来使用它们。要通过其“名”来使用它们，必须用伪指令定义它们所占用的实际地址与“名”对应。
Flash存储器寄存器
在MC908GP32单片机中，与Flash编程有关的寄存器有2个，它们是Flash控制寄存器(FLCR)和Flash块保护寄存器(FLBPR)。对应的地址分别为$FE08和$FF7E，下面分别阐述这些寄存器的功能及用法。Flash控制寄存器
FLCR的地址：$FE08，定义为： 
数据位 D7 D6 D5 D4 D3 D2 D1 D0 
定义 未定义 未定义 未定义 未定义 HVEN MASS ERASE PGM 
复位 0 0 0 0 0 0 0 0 
D7～D4位：未定义。 
D3 — HVEN位：高压允许位(High-Voltage Enable Bit)。 HVEN=1，打开电荷泵并将高电平加到Flash阵列上；HVEN=0，撤除Flash阵列上的高电平并关闭电荷泵。当PGM=1或ERASE=1时，可以通过设置HVEN将来自片内电荷泵的高压加到Flash阵列上。 
D2 — MASS位：整体擦除控制位(Mass Erase Control Bit)。该位在ERASE=1时有效，用于选择Flash擦除操作方式：整体擦除或页擦除。MASS=1，选择整体擦除方式；MASS=0，选择页擦除方式。 
D1 — ERASE位：擦除控制位(Erase Control Bit)。该位用于设置Flash编程操作为擦除操作。ERASE位与PGM位之间存在互锁关系，无法同时被设置为1。ERASE=1，选择擦除操作；ERASE=0，不选择擦除操作。 
D0 — PGM位：编程(写入)控制位(Program Control Bit)。该位用于设置Flash编程操作为编程(写入)操作，且无法与ERASE位同时为1。PGM=1，选择写入操作；PGM=0，不选择写入操作。 
Flash块保护寄存器
FLBPR的地址：$FF7E，它的内容为Flash保护区域的起始地址的14～7位，保护区域的起始地址的最高位始终为1，而保护区域的起始地址的低7位(位6～0)始终为0。对FLBPR写入，可以设定被保护的Flash区域，它本身也是一个Flash字节。当Flash处于保护状态时，擦除和写入操作都是受限制的，HVEN将无法被正常置起。Flash块保护寄存器设定的只是保护区域的起始地址，保护区域的结束地址始终为Flash存储区的结束地址($FFFF)。例如，设定FLBPR的值为$02(%0000 0010)，则保护区域为$8100～$FFFF(%1000 0001 0000 0000 ～ %1111 1111 1111 1111)。 
特别情况是：FLBPR的存储内容为$00，整个Flash存储区都受到保护；如果FLBPR的存储内容为$FF，则整个Flash存储区都可以被擦除或写入。 
只有当单片机处于运行用户程序时，对FLBPR本身和Flash保护区域的擦写操作保护才是有效的。复位不影响FLBPR。 
需要注意的是，FLBPR的8位数据所代表的地址取决于具体型号的芯片的Flash容量。以上是对MC908GP32而言的，FLBPR设定的是16位起始地址的第14～7位(第15位恒为1)；而对MC68HC908JL3而言，它们设定的是16位起始地址的第12～5位(第15～13位恒为1)。这两种情况见表13-1。具体设定时可以根据相应芯片手册结合要保护的区域进行计算得到。
Flash存储器的编程过程
在HC08系列单片机中，对Flash进行擦除或写入操作需要遵循一定的时序和步骤。对于整个MC68HC908系列的各个型号，这些步骤是一样的，但时序要求可能略有不同，针对具体型号的Flash进行编程时应参考相应的芯片手册。同时需要注意的是，一些型号的监控ROM内含有Flash编程子程序，用户可直接调用，例如MC68HC908JL3；有的型号则没有，例如MC908GP32，这种情况需自行编制子程序。下面介绍MC908GP32的Flash编程的基本操作。 
(1) 页擦除操作下面过程可以擦除GP32的Flash存储器的一页(128字节)： 
①$2→FLCR(1→ERASE位，0→MASS位)：进行页面擦除。 
②读Flash块保护寄存器FLBPR。 
③向被擦除的Flash页内任意一个地址写入任意值，为方便起见，一般向待擦除页首地址写入0。 
④延时tnvs(>10µs)。 
⑤$A→FLCR(1→HVEN位)。 
⑥延时terase(>1ms)。 
⑦$8→FLCR(0→ERASE位)。 
⑧延时tnvh(>5µs)。 
⑨$0→FLCR(0→HVEN位)。 
⑩延时trcv(>1µs)，完成一页的擦除操作。 
(2) 整体擦除操作下面过程擦除GP32的整个Flash区域，以便把新的程序装入Flash存储器，这是应用系统研制过程中开发工具对GP32编程的准备工作。 
①$6→FLCR(1→ERASE位，1→MASS位)：进行整体擦除。 
②读Flash块保护寄存器FLBPR。 
③向被擦除的Flash任意一个地址写入任意值，为方便起见，一般向首地址写入0。 
④延时tnvs(>10µs)。 
⑤$E→FLCR(1→HVEN位、MASS位、ERASE位)。 
⑥延时tMerase(>4ms)。 
⑦$C→FLCR(0→ERASE位)。 
⑧延时tnvhl(>100µs)。 
⑨$0→FLCR(0→HVEN位、MASS位)。 
⑩延时trcv(>1µs)，完成整体擦除操作。 
(3) 编程操作MC908GP32的Flash编程操作以行(64字节)为单位进行的。当然，一次写入可以小于一行，但不能大于一行。对于已经写过的部分，未经擦除不能重新写入变更其数据，否则将引起数据出错。写入过程如下: 
①$1→FLCR(1→PGM位)。 
②读Flash块保护寄存器FLBPR。 
③向将要写入的Flash行内任意一个地址写入任意值，为方便起见，一般向行首地址写入0，这一步选定了所要编程的行，以下的目标地址必须在这一行中。 
④先延时tnvs(>10µs)；再将$9→FLCR(1→HVEN位)。 
⑤先延时tpgs(>5µs)；再将待写数据写入对应的Flash地址。 
⑥延时tprog(>30µs)，完成一个字节的写入(编程)工作。 
⑦重复⑤、⑥，直至同一行内各字节写入完毕。 
⑧$8→FLCR(0→PGM位)。 
⑨先延时tnvh(>5µs)；再将$0→FLCR(0→HVEN位)。 
⑩延时trcv(>1µs)以后，完成本行写入工作，可以读出校验。