### M68HC08 Flash 存储器编程详解
#### 一、M68HC08 Flash 存储器概述
M68HC08系列微控制器是Motorola公司推出的一款高性能、低功耗的8位单片机。其内部集成了Flash存储器,主要用于程序代码的存储。在某些应用场合下,出于降低成本的需求,可能会考虑利用这部分Flash作为非易失性数据存储。不过,值得注意的是,与传统的RAM不同,Flash存储器的擦除与写入过程较为复杂,并且这些操作通常无法在Flash本身中执行。
#### 二、Flash 编程方法
##### 1. 一般MC68HC908的Flash存储器的在线擦除、编程方法
M68HC908系列单片机提供了专门用于控制Flash擦除与编程的寄存器——FLCR(Flash Control Register)。该寄存器中包含以下几个关键位:
- **PGM** (Bit 0): 当此位置1时,表示正在进行编程操作。
- **ERASE** (Bit 1): 当此位置1时,表示正在进行擦除操作。
- **MASS** (Bit 2): 保留位,通常设置为0。
- **HVEN** (Bit 3): 在进行编程或擦除操作时,此位置1。当FLCR寄存器不为0时,无法访问Flash中的内容(包括执行程序)。
此外,M68HC908还提供了Flash块保护寄存器,用于定义Flash的保护区域。用户程序必须位于这个保护区域内,而需要更改的数据则应该放在保护区域之外。
需要注意的是,不同型号的芯片可能使用不同的方式来保存这个保护寄存器的内容,有些使用Flash单元,有些则使用RAM单元。如果是RAM单元的话,则需要在系统复位后立即写入保护地址。
##### 2. GP32等Flash编程方法
对于配备了较大RAM空间的M68HC908系列单片机(如GP32、SR12、MR32等),可以采用以下步骤来进行Flash编程:
1. **编写擦除和编程子程序**:在用户程序所在的Flash保护区内编写擦除和编程子程序。
2. **将擦除子程序拷贝至RAM**:在对Flash进行编程之前,将擦除子程序从Flash复制到RAM中。
3. **备份待擦除数据**:将待擦除的Flash数据区内容复制到RAM中。具体复制的大小取决于所使用的芯片型号。例如,GP32擦除时的一块大小为128字节。
4. **执行擦除子程序**:切换到RAM中执行擦除Flash的子程序,完成后返回主程序(位于Flash中)。
5. **将编程子程序拷贝至RAM**:接着将编程子程序从Flash复制到RAM。
6. **执行编程子程序**:再次切换到RAM中执行编程子程序,完成将RAM中的数据(包括新数据以及未被修改但已擦除的数据)写回Flash中。完成后返回主程序,完成一次完整的编程操作。
#### 三、示例程序分析
下面是一个简单的示例程序,用于演示如何使用M68HC08进行Flash擦除与编程操作:
```assembly
WBF1 EQU $50 ; Working Buffer 1
WBF2 EQU $51 ; Working Buffer 2
COUNT EQU $52 ; Write Counter 1~128
WTME EQU $53 ; Wait Time (32MHz: 24, 16MHz: 12)
TMP EQU $54 DBUF EQU $100 ; Data to be written to Flash
CBUF EQU $180 FLCR EQU $FE08 FLSPR EQU $FF7E FLSH EQU $8000
FRGM: SEI ; Flash memory PGM Subroutine
CLRH CLRX
PRGM1: LDA EFLASH, X ; Erase Flash Code → RAM: CBUF
STA CBUF, X INCX
CPX #EFEND-EFLASH BLO PRGM1
LDHX #FLSH ; Erase Address
MOV #24, WTIME ; 32MHz
JSR CBUF ; Execute Flash erase
CLRX CLRH
PRGM2: LDA WFLASH, X ; Write Flash Code → RAM: CBUF
STA CBUF, X INCX
CPX #EFLASH-WFLASH BLO PRGM2
LDHX #FLSH ; Programming address
MOV #24, WTIME ; 32MHz
MOV #128, COUNT ; 128 Bytes
JSR CBUF ; Execute Flash Write
RTS
WFLASH: CLR WBF2 ; Entry: H:X Flash Address
LDA COUNT CMP #64 BLS WFLSH0
SUB $64 STA COUNT LDA #64 BRA WFLSH1
WFLSH0: CLRA WFLSH1:
PSH
ALDA #1 ; 1 → PGM
STA FLCR
LDA FLSPR ; Read Flash Protect Reg
STA, X
BSR P1DL10
LDA #9 ; 1 → HVEN
STA FLCR
BSR P1DL10
WFLSH2:
PSHH
PSHX
CLRH
LDX WBF2
LDA DBUF,X ; Read DATA
PULX
PULH
STA, X ; Write to Flash
BSR P1DL30
AIX #1
INC WBF2
DBNZ COUNT, WFLSH2 ; Loop 1 Page (1–64 Bytes)
LDA #8
STA FLCR
BSR P1DL10
LD
```
通过以上示例程序可以看到,整个擦除和编程过程非常严谨,涉及到多个步骤,包括但不限于初始化、擦除、编程、等待时间等。这对于理解和掌握M68HC08 Flash存储器的编程方法至关重要。