HCS08的FLASH模拟EEPROM
S0814Freescale HCS08单片机FLASH编程应用
12.2 FLASH功能及寄存器
• 块保护:
当允许块保护时,块保护区域从任意一个512字节边界到FLASH的最末地 址处$FFFF。 FPS位用来设定未保护区域最末地址的高位地址,此最末地址值由 FPS7:FPS1后接9位1构成
把NVPROT设置为%11101110,保护FLASH的$F000~$FFFF区域的 汇编代码如下: ORG $FFBD ; NVPROT寄存器地址 DC.B $EE ; FLASH的$F000~$FFFF空间设为保护区域
Slide 4
Copyright © Yang Ming. 2011. Electronics and Information Engineering Department of Huazhong University of Science and Technology Wuhan, Hubei 430074, P.R. China
12.2 FLASH功能及寄存器
• 在高页寄存器空间,共有6个和FLASH模块功能相关的8位寄存
器:
FLASH保护寄存器(FPROT,FLASH Protection Register) FLASH选项寄存器(FOPT, FLASH Options Register) FLASH时钟分频寄存器(FCDIV,FLASH Clock Divider Register) FLASH配置寄存器(FCNFG,FLASH Configuration Register) FLASH命令寄存器(FCMD,FLASH Command Register) FLASH状态寄存器(FSTAT,FLASH Status Register)
12.2 FLASH功能及寄存器
• 加密:
S08系列MCU内部含有加密电路,用于防止对Flash和RAM存储空间未经 授权的非法访问。 在保密的存储器内执行的程序能够正常访问任何MCU存储器空间和资源 。通过非加密存储空间或背景调试接口执行的程序去访问加密存储空间, 都会被阻止(写操作被忽略,读操作返回全0)。 通过寄存器FOPT控制
第2章 Freescale HC(S)08系列单片机概述
第2章Freescale HC08/S08/RS08 MCU概述Freescale的08系列单片机由于其稳定性高、开发周期短、成本低、型号多种多样、兼容性好而被广泛应用。
本章概要介绍08系列单片机的类型、基本结构,并从总体上阐述其性能特点。
主要内容有:在介绍08系列单片机的命名规则和资源状况的基础上,分别以MC908GP32、MC9S08GB60及MC9RS08KA2为例讲述HC08系列、HCS08系列及RS08系列单片机的基本结构和特点。
了解这些基本知识,不仅可以为实际开发应用中的单片机选型提供参考,也对后续章节的学习有很大的帮助。
本书以GP32为主要芯片阐述嵌入式系统基本硬件与软件原理,2.2节讨论的GP32引脚功能、硬件最小系统及GP32的存储器框图是重点掌握的内容。
硬件最小系统是芯片运行的基本条件,应该对此有清晰的理解。
对于GP32不具备的功能,本书将使用其他芯片进行阐述,但编程语言体系是相同的。
2.1 08系列单片机简介目前,Freescale的08系列单片机主要有HC08、HCS08和RS08三种类型。
HC08是1999年开始推出的产品,种类也比较多,针对不同场合的应用都可以选到合适的型号。
HCS08是2004年左右推出的8位MCU,资源丰富,功耗低,性价比很高,是08系列单片机的发展趋势。
HC08与HCS08的最大区别是调试方法不同与最高频率的变化。
RS08是HCS08架构的简化版本,于2006年推出,其内核体积比传统的内核小30%,带有精简指令集,满足用户对体积更小、更加经济高效的解决方案的需求。
RAM及Flash 空间大小差异、封装形式不同、温度范围不同、频率不同、I/O资源差异等形成了不同型号,为嵌入式应用产品的开发提供了丰富的选型。
2.1.1 Freescale单片机的命名规则Freescale单片机的型号庞大,但同一系列的CPU是相同的,也就是说具有相同的指令系统,多种型号只是为了适用于不同的场合。
飞思卡尔HC(S)08系列单片机开发及C语言编程简介
1.CodeWarrior中建立新项目运行CodeWarrior(CW)集成开发平台,如图1-1所示在File菜单下点击New,弹出建立新项目的模板对话框,见图1-2。
一般的简便做法是在图1-2对话框左面的选择列表中选择“HC(S)08 New Project Wizard”,然后在右面的项目名“Project Name”输入条中,输入你要建立的新项目名字,再在“Location”一栏中用确定项目存放的文件夹路经,完成后按“OK”进入下一步。
你也可以在图1-2对话框左侧列表中选择“Empty Project”,这样生成的项目不包含任何文件,你必须在CodeWarrior中自己添加所有相关的文件内容。
我想除非有特殊理由,实际项目开发过程中很少采用这种麻烦的方式来建立自己的项目。
接下去是选择项目开发所用的编程语言,见图1-3。
最常用的当然是C语言编程。
有时因具体项目要求,除了C编程外还需要编写独立的汇编语言模块,那就再加选汇编工具(Assembly)。
C++编程在免费版和标准版CW下都不支持,只有在专业版下才可以使用。
编程语言选择完毕后按“Next”。
图1-1图1-2图1-3这时将出现如图1-4的对话框,让你选择项目开发对应的MCU 型号。
在CW5.x 版本下支持几乎所有的HC08和大部分HCS08单片机型号。
在最新的CW6.x 中,增加了飞思卡尔最低端的8位机(RS08系列)和低端32位处理器(Coldfire V1系列)的支持,但HC08系列的有些型号没有被包含在内。
由于HC08为比较老的产品系列,已经不推荐在新项目设计中选用,因此影响不会太大。
对于新用户来说,请尽量直接安装CW6.x 或以后推出的更新版本。
以典型的9S08系列为例,当你选择了一个MCU 型号后,在图1-4右侧会显示出所有针对该型号芯片可用的项目调试场景。
其中:∙ “Full Chip Simulator ”是芯片全功能模拟仿真,即无需任何目标系统的硬件资源,直接在你的PC 机上模拟运行单片机的程序,在模拟运行过程中可以观察调试程序的各项控制和运行流程,分析代码运行的时间,观察各种变量,等等。
飞思卡尔8位单片机—飞思卡尔8位单片机基础知识
7〉 管脚的复用
注意: 0、管脚功能复用时的优先 级见右表,高优先级接管管 脚时,对低优先级模块会产 生杂乱信号,因此切换前应 先停止不使用的功能。 1、PTA5作为只能输入管脚 而言,输入电压不能超过 VDD。 2、IIC使用的端口可以通过 设置SOPT2 寄存器中的 IICPS位重新定位到PTB6和 PTB7,复位时缺省使用 PTA2 and PTA3。 3、如果ACMP和ADC被同 时使能,管脚PTA0和PTA1 可同时使用。
管脚及其功能
6〉 管脚控制寄存器
位于高页面的管脚控制寄存器,可以独立设置每个管 脚的输出驱动强度、输出信号变化速度、输入脚的内部 上拉允许等。内部上拉的设置有些时候自动失效,比如 管脚设为输出、管脚被外设使用、管脚作为模拟电路使 用等。如果管脚被用于键盘中断KBI模块,,并设置上升 沿触发,则允许上拉时实际是配置了下拉电阻。 对输出管脚设置了输出变化速度控制后,可以减少 EMC辐射,变化速度控制对输入脚无效。 输出管脚的输出驱动强度控制,可以选择更大的驱 动电流,虽然每个输出管脚都可以设置成大电流驱动, 但总电流不能超出芯片的工作范围。同时大驱动电流对 EMC辐射也会有一定影响。
• EPROM
EPROM(Erasable Programmable ROM,可擦除可编 程ROM)芯片可重复擦除和写入,。EPROM芯片在其正 面的陶瓷封装上,开有一个玻璃窗口,透过该窗口,可以 看到其内部的集成电路, 紫外线透过该孔照射内部芯片 就可以擦除其内的数据,完成芯片擦除的操作要用到 EPROM擦除器。EPROM内资料的写入要用专用的编程 器,并且往芯片中写 内容时必须要加一定的编程电压( VPP=12—24V,随不同的芯片型号而定)。EPROM的型 号是以27开头的,如27C020(8*256K)是一片 2M Bits容 量的EPROM芯片。EPROM芯片在写入资料后,还要以 不透光的贴纸或胶布把窗口封住,以免受到周围的紫外线 照射而使资料受损
FreescaleHC(s)08系列单片机概述
为3V或5V操作;非法指令码检测复位;非法地址检测复位。
具有PDIP40、SDIP42和QFP44封装形式。 优化用于控制应用;优化支持C语言。
7
《嵌入式技术基础与实践》
2.2.2 内部结构简图与引脚功能
→ PTA7/
GP32内部有以下主要部分
CPU08 存储器 时钟发生模块及锁相环电路 低电压禁止模块 复位与中断模块 监控模块MON 系统设置模块
10
《嵌入式技术基础与实践》
2.2.3 GP32最小系统
硬件结构,但仅有一个MCU是无法工作的,它必须与上节讲述 了以MC908GP32单片机为原型的HC08系列MCU的其他相应的外 围电路一起,才能构成一个最小系统。
11
《嵌入式技术基础与实践》
MC908GP32芯片(以脚封装为例)最小系统的外围支撑 电路包括电源与滤波电路、晶振电路和复位电路,其中 各个部分的功能如下:
理解GP32存储器组织
5
《嵌入式技术基础与实践》
2.2.1 MC68HC908GP32单片机性能概述
MC68HC908GP32有40脚、42脚、44脚三种封装形式; MC68HC908GP32的主要特点概述如下:
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吸流和放流能
HCS08微控制器上有关内存分配的几个问题
HCS08微控制器上有关内存分配的几个问题师英,shylion@ 这里讨论HCS08微控制器上的几个有关内存分配的问题,提及其存储器编址模型;数据对齐;Tiny和Small两种内存模型的差异;以及堆和栈的分配。
指正错误与讨论其中细节,请电邮到shylion@。
谢谢。
目录:HCS08微控制器上有关内存分配的几个问题..............................................- 1 -1.1. HCS08的存储器映射...............................................................................- 2 -1.1外设寄存器.........................................................................................- 2 -1.2 RAM....................................................................................................- 5 -1.3 FLASH................................................................................................- 5 -1.4 向量(Vectors)................................................................................- 6 -1.2. 数据对齐....................................................................................................- 7 -1.3. HCS08的存储器模型:Tiny和Small....................................................- 9 -1.4. 堆(heap segment) (12)1.5. 栈(stack segment) (13)1.1. HCS08的存储器映射每个HCS08微控制器的存储器映射(Memory Map )都不一样,但是它们都有相同的分配结构——一个线性的统一编址的16bit (总共64K )寻址空间。
HCS08系列微控制器参考手册(中文)
HCS08系列微控制器参考手册第一册苏州大学飞思卡尔嵌入式系统研发中心翻译 2009年11月目录第一章通用信息与结构框图 (1)1.1HCS08系列微控制器介绍 (1)1.2HCS08CPU编程模型 (2)1.3外设模块 (2)1.4MC9S08GB60的特点 (3)1.4.1 HCS08系列的共性 (3)1.4.2 MC9S08GB60的特点 (3)1.5MC9S08GB60的结构框图 (4)第二章引脚及其连接 (5)2.1简介 (5)2.2推荐的系统连接 (5)2.2.1 电源 (7)2.2.2 MC9S08GB60振荡器 (7)2.2.3 复位 (8)2.2.4 背景/模式选择(BKGD/MS) (8)2.2.5 通用I/O及外设端口 (8)第三章工作模式 (10)3.1简介 (10)3.2特征 (10)3.3运行模式 (10)3.4背景调试模式 (11)3.5等待模式 (12)3.6停止模式 (12)3.6.1 Stop1模式 (13)3.6.2 Stop2模式 (13)3.6.3 Stop3模式 (14)3.6.4 停止模式下激活BDM使能 (14)3.6.5 设置OSCSTEN位 (15)3.6.6 停止模式下LVD使能 (15)3.6.7 停止模式下的片上外设模块 (15)3.6.8 系统选择寄存器(SOPT) (17)3.6.9 系统电源管理状态和控制寄存器1(SPMSC1) (18)3.6.10 系统电源管理状态和控制寄存器2(SPMSC2) (19)第四章片上存储器 (21)4.1简介 (21)4.2HCS08核定义的存储器组织 (21)4.2.1 HCS08存储器组织 (21)4.2.2 MC9S08GB60存储映像 (22)4.2.3 复位和中断向量表 (23)4.3寄存器地址和位分配 (24)4.4RAM (29)4.560K字节的FLASH (29)4.5.1 特征 (30)4.5.2 写入、擦除和空白检测命令 (30)4.5.3 命令时间和突发模式写入 (32)4.5.3.1 行和FLASH的组织结构 (32)4.5.3.2 程序命令时序 (33)4.5.4 访问错误 (34)4.5.5 向量重定向 (34)4.5.6 FLASH块保护(MC9S08GB60) (34)4.6MC9S08GB60的安全性 (35)4.7MC9S08GB60的FLASH寄存器和控制位 (36)4.7.1 FLASH时钟分频寄存器(FCDIV) (36)4.7.2 FLASH选项寄存器(FOPT和NVOPT) (37)4.7.3 FLASH配置寄存器(FCNFG) (38)4.7.4 FLASH保护寄存器(FPROT和NVPROT) (38)4.7.5 FLASH状态寄存器(FSTAT) (39)4.7.6 FLASH命令寄存器(FCMD) (40)4.8FLASH存储器应用实例 (41)4.8.1 FLASH模块时钟的初始化 (41)4.8.2 擦除FLASH的一页(512字节) (42)4.8.3 DoOnStack子程序 (43)4.8.4 SpSub子程序 (45)4.8.5 FLASH的字节编程 (46)第五章复位和中断 (47)5.1简介 (47)5.2MC9S08GB60复位和中断的特征 (47)5.4计算机正常操作监控模块(COP)看门狗 (48)5.5中断 (48)5.5.1 中断堆栈结构 (49)5.5.2 外部中断请求(IRQ)引脚 (50)5.5.2.1 引脚配置选项 (50)5.5.2.2 边沿/电平触发 (50)5.5.3 中断向量、中断源和局部屏蔽 (51)5.6低电压检测系统(LVD) (52)5.6.1 上电复位操作 (52)5.6.2 LVD复位操作 (52)5.6.3 LVD中断操作 (53)5.6.4 低电压警告(LVW) (53)5.7实时中断(RTI) (53)5.8复位、中断以及系统控制寄存器和控制位 (53)5.8.1 中断请求状态和控制寄存器(IRQSC) (54)5.8.2 系统复位状态寄存器(SRS) (55)5.8.3 系统背景调试强制复位寄存器(SBDFR) (56)5.8.4 系统选项寄存器(SOPT) (56)5.8.5 系统设备识别寄存器(SDIDH、SDIDL) (57)5.8.6 系统实时中断状态和控制寄存器(SRTISC) (57)5.8.7 系统电源管理状态控制寄存器1(SPMSC1) (58)5.8.8 系统电源管理状态和控制寄存器2(SPMSC2) (59)第六章中央处理单元 (61)6.1简介 (61)6.2编程结构和CPU寄存器 (61)6.2.1 累加器(A) (62)6.2.2 变址寄存器(H:X) (63)6.2.3 堆栈指针(SP) (64)6.2.4 程序计数器(PC) (66)6.2.5 条件码寄存器(CCR) (66)6.3寻址方式 (70)6.3.1 隐含寻址方式(INH) (71)6.3.2 相对寻址方式(REL) (71)6.3.3 立即寻址方式(IMM) (72)6.3.4 直接寻址方式(DIR) (72)6.3.5 扩展寻址方式(EXT) (72)6.3.6.1 无偏移量变址方式(IX) (73)6.3.6.2 无偏移量变址、变址加1寻址方式(IX+) (73)6.3.6.3 8位偏移量变址方式(IX1) (73)6.3.6.4 8位偏移量变址、变址加1寻址方式(IX1+) (73)6.3.6.5 16位偏移量变址方式(IX2) (73)6.3.6.6 8位偏移量堆栈寻址方式(SP1) (74)6.3.6.7 16位偏移量堆栈寻址方式(SP2) (74)6.4特殊操作 (75)6.4.1 复位序列 (75)6.4.2 中断 (76)6.4.3 等待模式 (76)6.4.4 停止模式 (76)6.4.5 背景模式 (77)6.4.6 总线周期的用户观点 (77)6.5通过指令类别进行指令集描述 (78)6.5.1 数据传送指令 (78)6.5.1.1 加载与存储 (78)6.5.1.2 位的置位与清零 (81)6.5.1.3 存储器到存储器的传送 (82)6.5.1.4 寄存器传输和半字节交换 (82)6.5.2 算术运算指令 (83)6.5.2.1 加、减、乘和除指令 (83)6.5.2.2 加一、减一、清零和求补 (88)6.5.2.3 比较和测试 (88)6.5.2.4 BCD的计算 (88)6.5.3 逻辑操作指令 (89)6.5.3.1 与、或、异或与求补 (90)6.5.3.2 位测试指令 (91)6.5.4 移位类指令 (91)6.5.5 跳转、转移和循环控制指令 (93)6.5.5.1 无条件跳转和转移指令 (94)6.5.5.2 简单转移 (95)6.5.5.3 有符号转移 (95)6.5.5.4 无符号转移 (95)6.5.5.5 位条件转移 (96)6.5.5.6 循环控制 (96)6.5.6 相关堆栈指令 (97)6.6指令简表 (102)6.7汇编语言指南 (114)6.7.1 列表行 (115)6.7.2 汇编指令 (116)6.7.2.1 BASE——设定编译器的缺省数进制 (116)6.7.2.2 INCLUDE——指定附加源文件 (116)6.7.2.3 NOLIST/LIST——关闭或打开程序列表 (116)6.7.2.4 ORG——设置程序的起始位置 (117)6.7.2.5 EQU——把一个标号和一个数值相关联 (118)6.7.2.6 dc.b——定义存储器中字节化常量 (119)6.7.2.7 dc.w——在存储器中定义16位(字)常量 (119)6.7.2.8 ds.b——定义存储(保留)内存变量字节 (120)6.7.3 标号 (121)6.7.4 表达式 (122)6.7.5 通用文件协议 (123)6.7.6 目标代码(S19)文件 (125)第七章开发支持 (129)7.1介绍 (129)7.2特点 (130)7.3背景调试控制器(BDC) (130)7.3.1 BKGD引脚描述 (131)7.3.2 通信细节 (132)7.3.2.1 BDC通信速率考虑事项 (132)7.3.2.2 位时序细节 (133)7.3.3 BDC寄存器和控制位 (135)7.3.3.1 BDC状态和控制寄存器 (135)7.3.3.2 BDC断点匹配寄存器 (137)7.3.4 BDC命令 (137)7.3.4.1 SYNC——要求时序参考脉冲 (138)7.3.4.2 ACK_ENABLE (139)7.3.4.3 ACK_DISABLE (139)7.3.4.4 BACKGROUND (139)7.3.4.5 READ_STATUS (140)7.3.4.6 WRITE_CONTROL (140)7.3.4.7 READ_BYTE (141)7.3.4.8 READ_BYTE_WS (142)7.3.4.10 WRITE_BYTE (143)7.3.4.11 WRITE_BYTE_WS (143)7.3.4.12 READ_BKPT (144)7.3.4.13 WRITE_BKPT (144)7.3.4.14 GO (144)7.3.4.15 TRACE1 (145)7.3.4.16 TAGGO (145)7.3.4.17 READ_A (145)7.3.4.18 READ_CCR (145)7.3.4.19 READ_PC (146)7.3.4.20 READ_HX (146)7.3.4.21 READ_SP (147)7.3.4.22 READ_NEXT (147)7.3.4.23 READ_NEXT_WS (148)7.3.4.24 WRITE_A (148)7.3.4.25 WRITE_CCR (148)7.3.4.26 WRITE_PC (149)7.3.4.27 WRITE_HX (149)7.3.4.28 WRITE_SP (149)7.3.4.29 WRITE_NEXT (149)7.3.4.30 WRITE_ NEXT_WS (150)7.3.5 串行接口硬件握手协议 (150)7.3.6 取消握手协议 (152)7.3.7 BDC硬件断点 (155)7.3.8 与M68HC12BDM的不同之处 (155)7.3.8.1 8位体系结构 (156)7.3.8.2 命令格式 (156)7.3.8.3 状态位的读写 (156)7.3.8.4 BDM与停止和等待模式 (157)7.3.8.5 SYNC指令 (157)7.3.8.6 硬件断点 (157)7.4标识部分和BDC强制复位 (158)7.4.1 系统设备识别寄存器(SDIDH:SDIDL) (158)7.4.2 系统背景调试强制复位寄存器 (158)7.5片上调试系统(DBG) (159)7.5.1 比较器A和B (159)7.5.2总线信息捕捉和FIFO操作 (160)7.5.4 标记与强制断点和触发器 (161)7.5.5 CPU断点请求 (162)7.5.6 触发模式 (162)7.5.6.1 单独A触发模式 (163)7.5.6.2 A或B触发模式 (163)7.5.6.3 A然后B触发模式 (163)7.5.6.4 事件B触发模式(存储数据) (163)7.5.6.5 A然后事件B触发模式(存储数据) (163)7.5.6.6 A和B数据触发(全模式) (164)7.5.6.7 A与非B数据触发(全模式) (164)7.5.6.8 触发范围内:A≤地址≤B (164)7.5.6.9 触发范围外:地址<A 或者地址>B (164)7.5.7 DBG寄存器和控制位 (165)7.5.7.1 调试比较器A的高地址页寄存器(DBGCAH) (165)7.5.7.2 调试比较器A的低位寄存器(DBGCAL) (165)7.5.7.3 调试比较器B的高地址页寄存器(DBGCAH) (165)7.5.7.4 调试比较器B的低位寄存器(DBGCAL) (165)7.5.7.5 调试FIFO高地址页寄存器(DBGFH) (165)7.5.7.6 调试FIFO低位寄存器(DBGFL) (165)7.5.7.7 调试控制寄存器(DBGC) (166)7.5.7.8 调试触发寄存器(DBGT) (167)7.5.7.9 调试状态寄存器(DBGS) (168)7.5.8 应用信息与举例 (169)7.5.8.1 定向的调试器例子 (171)7.5.8.2 例1:终止对地址A的处理 (171)7.5.8.3 例2:终止对地址A指令的处理 (172)7.5.8.4 例3:终止在地址A或B上的指令处理 (172)7.5.8.5 例4:开始跟踪在地址A的指令 (173)7.5.8.6 例5:A到B顺序后停止的尾部跟踪 (173)7.5.8.7 例6:起始跟踪数据B写入地址A (174)7.5.8.8 例7:从地址B中读取被捕获的首八位数据 (174)7.5.8.9 例8:捕获在读地址A后写入到地址B的值 (175)7.5.8.10 例9:在一个例程中触发所有的执行命令 (175)7.5.8.11 例10:通过触发来试图处理外部FLASH (176)7.5.9 硬件断点和ROM修补 (176)附录A 指令集详述 (177)A.2命名规则 (177)A.3规范定义 (180)A.4指令集 (180)ADC Add with Carry(带进位位加) (180)ADD Add without Carry(无进位位加) (181)AIS Add Immediate Value to Stack Pointer(立即数加到SP) (182)AIX Add Immediate Value to Index Register(立即数加到HX) (182)AND Logical AND(逻辑与) (183)ASL Arithmetic Shift Left(算术左移) (184)ASR Arithmetic Shift Right(算术右移) (184)BCC Branch if Carry Bit Clear(C为0则转移) (185)BCLR n Clear Bit n in Memory(内存单元n位清零) (185)BCS Branch if Carry Bit Set(C为1则转移) (186)BEQ Branch if Equal(等于则转移) (187)BGE Branch if Greater Than or Equal To(大于或等于则转移) (187)BGND Background(进入背景调试模式) (188)BGT Branch if Greater Than(大于则转移) (188)BHCC Branch if Half Carry Bit Clear(H为0则转移) (189)BHCS Branch if Half Carry Bit Set(H为1则转移) (189)BHI Branch if Higher(大于则转移) (190)BHS Branch if Higher or Same(大于或等于则转移) (191)BIH Branch if IRQ Pin High(引脚IRQ为1则转移) (191)BIL Branch if IRQ Pin Low(引脚IRQ为0则转移) (192)BIT Bit Test(位测试) (192)BLE Branch if Less Than or Equal To(小于或等于则转移) (193)BLO Branch if Lower(小于则转移) (193)BLS Branch if Lower or Same(小于或等于则转移) (194)BLT Branch if Less Than(小于则转移) (195)BMC Branch if Interrupt Mask Clear(I为0则转移) (195)BMI Branch if Minus(结果为负则转移) (196)BMS Branch if Interrupt Mask Set(I为1则转移) (196)BNE Branch if Not Equal(不等于则转移) (197)BPL Branch if Plus(结果为正则转移) (197)BRA Branch Always(无条件短转移) (198)BRCLR n Branch if Bit n in Memory Clear(M位n为0则转移) (199)BRN Branch Never(三个总线周期的空操作) (200)BRSET n Branch if Bit n in Memory Set(M位n为1则转移) (200)BSET n Set Bit n in Memory(M位n置1) (201)BSR Branch to Subroutine(转移到子程序) (201)CBEQ Compare and Branch if Equal(比较,等于则转移) (202)CLC Clear Carry Bit(进位位C清零) (203)CLI Clear Interrupt Mask Bit(中断屏蔽位I清零) (203)CLR Clear(清零) (204)CMP Compare Accumulator with Memory(A与M比较) (204)COM Complement(按位取反) (205)CPHX Compare Index Register with Memory(HX与M比较) (206)CPX Compare X with Memory(X与M比较) (207)DAA Decimal Adjust Accumulator(A十进制调整) (208)DBNZ Decrement and Branch if Not Zero(减1不为0则转移) (209)DEC Decrement(自减1) (209)DIV Divide(无符号除法) (210)EOR Exclusive-OR Memory with Accumulator(M与A异或) (211)INC Increment(自加1) (211)JMP Jump(无条件跳转) (212)JSR Jump to Subroutine(跳转到子程序) (213)LDA Load Accumulator form Memory(取M内容到A) (213)LDHX Load Index Register form Memory(取M内容到HX) (214)LDX Load X from Memory(取M内容到X) (215)LSL Logical Shift Left(逻辑左移) (215)LSR Logical Shift Right(逻辑右移) (216)MOV Move(M单元间数据传送) (217)MUL Unsigned Multiply(无符号数乘法) (218)NEG Negate(Two’s Complement) (求补) (218)NOP No Operation(空操作) (219)NSA Nibble Swap Accumulator(A的高低4位对调) (219)ORA Inclusive-OR Accumulator and Memory(逻辑或) (220)PSHA Push Accumulator onto Stack(A进栈) (220)PSHH Push H onto Stack(H进栈) (221)PSHX Push X onto Stack(X进栈) (221)PULA Pull Accumulator from Stack(A出栈) (222)PULH Pull H from Stack(H出栈) (222)PULX Pull X from Stack(X出栈) (223)ROL Rotate Left through Carry(带进位位的循环左移) (223)ROR Rotate Right through Carry(带进位位的循环右移) (224)RSP Reset Stack Pointer(堆栈指针置$FF) (224)RTI Return from interrupt(中断返回) (225)RTS Return from Subroutine(子程序返回) (226)SBC Subtract with Carry(带借位减法) (226)SEC Set Carry Bit(进位位置位) (227)SEI Set Interrupt Mask Bit(中断屏蔽位置位) (227)STA Store Accumulator in Memory(A存入M) (228)STHX Store Index Register(HX存入M) (229)STOP Enable IRQ Pin, Stop Processing(停机) (229)STX Store X in Memory(X存入M) (230)SUB Subtract(无借位减法) (231)SWI Software Interrupt(软件中断) (231)TAP Transfer Accumulator to Processor Status Byte(写CCR) (232)TAX Transfer Accumulator to X(A复制到X) (233)TPA Transfer Processor Status Byte to Accumulator(读CCR) (233)TST Test for Negative or Zero(小于或等于0测试) (234)TSX Transfer Stack Pointer to index Register(复制SP到HX) (235)TXA Transfer X to Accumulator(复制X到A) (235)TXS Transfer Index Register Low to Stack Pointer(HX-1写入SP) (235)WAIT Enable Interrupts; Stop Processor(待机) (236)附录B 通用文件规范 (237)B.1引言 (237)B.2存储映射区域划分 (238)B.3中断向量定义 (238)B.4位定义的两种方式 (239)B.5MC9S08GB60完整的通用文件 (240)第一章通用信息与结构框图1.1 HCS08系列微控制器介绍新型的FreescaleHCS08系列微控制器,尽管包含新指令,可以执行快速调试和开发功能,但仍然和旧的M68HC08系列完全兼容。
单元一(1)HC08单片机介绍及Codewarrior使用
单元一(1)HC08单片机介绍及Codewarrior使用一、单片机基本概念1.何谓单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。
在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。
而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。
PC中的CPU一块就要卖几百块钱,这么多东西做在一起,是不是很贵?说这块芯片体积是不是很大呢?恰恰相反,单片机的价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68,84,100引脚,功能少的10多个或20多个引脚,有的甚至只有8个引脚。
为什么会这样呢?因为功能有强弱。
比如,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。
另外这种芯片的生产量很大,技术也很成熟,如51系列的单片机已经做了十几年,所以价格就很低了。
单片机的功能肯定不强,干吗要学它呢?实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用,是否有很好的性能价格比。
所以8051出来十多年,依然没有被淘汰,还在不断的发展中。
2.常用的单片机(1)51系列51系列单片机是Intel公司在20世纪80年代初研制出来的,很快就在我国得到推广和广泛的应用。
20多年来,51系列单片机在教学、工业控制、仪器仪表和信息通信中发挥着重要的作用,并在交通、航运和家用电器等领域取得了大量的应用成果。
20世纪80年代中期以后,Intel公司以专利转让的形式把8051内核给了许多半导体厂家,如Arotel、Philps、Ananog Devlces和Dallas等。
单元一(1)HC08单片机介绍及Codewarrior使用
单元一(1)HC08单片机介绍及Codewarrior使用一、单片机基本概念1.何谓单片机一台能够工作的计算机要有这样几个部份构成:CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:串行口、并行输出口等)。
在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。
而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。
PC中的CPU一块就要卖几百块钱,这么多东西做在一起,是不是很贵?说这块芯片体积是不是很大呢?恰恰相反,单片机的价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68,84,100引脚,功能少的10多个或20多个引脚,有的甚至只有8个引脚。
为什么会这样呢?因为功能有强弱。
比如,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。
另外这种芯片的生产量很大,技术也很成熟,如51系列的单片机已经做了十几年,所以价格就很低了。
单片机的功能肯定不强,干吗要学它呢?实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?应用的关键是看是否够用,是否有很好的性能价格比。
所以8051出来十多年,依然没有被淘汰,还在不断的发展中。
2.常用的单片机(1)51系列51系列单片机是Intel公司在20世纪80年代初研制出来的,很快就在我国得到推广和广泛的应用。
20多年来,51系列单片机在教学、工业控制、仪器仪表和信息通信中发挥着重要的作用,并在交通、航运和家用电器等领域取得了大量的应用成果。
20世纪80年代中期以后,Intel公司以专利转让的形式把8051内核给了许多半导体厂家,如Arotel、Philps、Ananog Devlces和Dallas等。
第13章课后习题答案
第 13 章 Flash 存储器
练习题
【基础题】 1.简述 Flash 存储器的特点。 解答: (1)编程速度快及可靠性高。(2)单一电源电压供电。(3)支持在线编程,允许单片机内部 运行的程序区改写 Flash 存储内容。(4)存储密度高(5)低功耗(6)成本低 2.M68HC08 系列单片机的 Flash 存储器有哪两种编程模式,两种模式有什么区别,分 别在什么条件下进行? 解答: (1)M68HC08 单片机有:监控模式与用户模式两种 (2)两者的区别:监控模式需要外部硬件支持,但不需要单片机内部程序的存在,所以 适合对新出厂芯片进行变成写入, 或是对芯片进行整体擦出或写入; 用户模式可以在单片机 正常工作时进入, 所以常用在程序运行过程中对部分 Flash 存储器的一些单元内容进行修改, 特别适合于目标系统的动态程序更新和运行数据的存储。 目前监控模式常被仿真器和编程器 采用,而在实际工程运用中,开发者往往只需要考虑和实现用户模式下的 Flash 存储器在线 编程。 (3)Flash 存储器工作于监控模式的条件: ①复位向量 ($FFFE‐$FFFF) 内容为 “空” ($FFFF) ②单片机复位是在 IRQ 引脚上加上高电压(1.4~2Vdd) ,并给某些 IO 脚置合适值(与芯 片型号有关,设计时参考芯片手册) Flash 存储器工作于用户模式的条件:MC68HC908 系列单片机的 Flash 存储器工作于用 户模式不需要特别的条件,在单片机正常工作的过程中,程序可以随时转入对 Flash 存储器 进行编程操作。这种情况下对 Flash 存储器的擦除与写入不需要用户提供其他外部硬件条件 3.对 MC908GP32 单片机进行 Flash 在线编程时应注意哪些问题? 解答: 使用 Flash 在线编程技术可以省去 EEPROM,不仅简化了电路设计,也提高了系统的稳 定性。但是 Flash 在线编程的技术文献资料比较少,特别是实用程序目前还较少见到,涉及 Flash 在线编程的技术细节应仔细斟酌。由于擦除与写入子程序是复制到 RAM 中执行,我们 给出的两个子程序已经包含了复制并转入 RAM 执行的程序过程, 正是由于这个特殊的过程, 根据实际编程调试与项目开发过程中积累的经验,提出以下注意点,供读者参考: (1) RAM 中要留有足够的缓冲区, 以便存放复制到 RAM 中的子程序, 具体值是取擦除与 写入子程序中的大者即可。它们的大小可在编译后.LST 文件中查得。 (2) 擦除及写入子程序中要调用的延时子程序均随其后,以便同时复制到 RAM 中,最 后一个标号是为复制方便而加入, 否则复制时要用其它方法得到结束地址, 编程变得不规范。 (3) 擦除及写入子程序中对延时子程序的调用必需使用 “BSR 子程序名” ,而不能使用 “JSR 子程序名”,因为这里的子程序是复制到 RAM 中执行,程序地址已经发生了变化,只 能用相对调用。 (4)擦除子程序与写入子程序及其中的延时子程序,若含有跳转语句,不能使用“JMP 地
飞思卡尔单片机机器码文件烧写方法
飞思卡尔单片机机器码文件烧写方法第一步:将飞思卡尔编程器(BDM)与需要烧写的PCB板连接,其中BDM中GND引脚要与空调控制器GND引脚对准,之后将飞思卡尔编程器(BDM)的USB接口插上电脑。
第二步:找到ST008-CW_MCUs_V6_3软件的安装目录,打开安装软件的文件夹。
第三步:打开prog文件夹第四步:在prog文件夹下打开hiwave.exe文件第五步:打开component-set connection第六步:打开后会看到这样一个页面,在processor中选择HCS08,在connection中选择P&E Multilink/cyclone pro,选择完后点击OK。
第七步:点击OK后会看到PEMICRO connection manager框,在PEMICRO connection manager中点击Connect(Reset)第八步:选择MultilinkCyclonePro-Load,要是编程器没有与电脑连接成功,会出现No communication框,若是连接成功,会显示Load executable file 框。
第九步:选择文件类型为Motorolala S-Record(*.s?*)第十步:选择机器码文件(S19文件),找到需要下载的机器码文件,之后选中文件。
第十一步:将verify memory image after loading code和Run after successful load项打勾,之后点击Load Code。
第十二步:点击Load Code后会出现Erase and program flash?框,点击YES即可下载机器码文件(S19文件).第十三步:机器码文件(S19文件)正在下载中……。
Freescale HCS08单片机原理及应用-汇编程序设计
体值,而无需用户自己计算。
由于复位矢量位于Flash空间,并且每个复位/中断矢量占用2字节的Flash空间,因此用DC.W伪指令定义。
注意不能用DS伪指令定义Flash常量。
对于有中断服务子程序的源程序,为了在发生中断时能够响应中断进入相应的中断服务子程序,和填写复位向量类似,只需将中断服务子程序的入口地址填入对应的中断复位向量区即可。
3.6.3汇编程序设计3.6.3.1算术/逻辑运算程序设计MCU主要用于控制目的,其数据运算、处理的能力并不强。
但由于HCS08系列MCU具有相应的算术、逻辑指令,因此它可以完成一些简单的算术/逻辑运算功能。
[例3.1] 若字变量Data1和Data2分别存放着两个16位无符号数,编写求这两个数之和的子程序,并将和存放到Sum字节存储空间中。
两个16位无符号数相加,和为17位,至少需要3个字节的存储空间,和按照从高位到低位的顺序依次存放在以Sum为首地址的字节存储单元中。
Add_Pro:CLC ; 清进位标志位LDA Data1+1ADD Data2+1 ; 两数低八位相加STA Sum+2 ; 存低八位之和LDA Data1ADC Data2 ; 高八位带低八位进位加STA Sum+1 ; 存高八位之和ROLAAND #01HSTA Sum ; 存高八位进位位RTS3.6.3.2查表和散转程序HCS08具有变址寻址方式,实现查表操作非常方便。
利用查表可以实现转换、计算等各种功能。
散转是指根据输入数据的不同跳转到不同的程序入口进行处理。
[例3.2] 单字节变量Hex_Byte中存放了一十六进制数,编写子程序将其转换为两位ASCII码,并将结果存至以Result开首的字节存储单元中。
例如4AH的ASCII码为3441H,$F9的ASCII码为4639H。
……ORG 0070H ; 用户变量一定要定位在Ram区域Hex_Byte DS.B 1Result DS.B 2……ORG 0870HASCII_Table DC.B ‘0123456789ABCDEFG’; 常数表格、代码一定要定位在Flash区域……Hex_To_Ascii:LDA Hex_ByteAND #$F0 ; 取出高4位NSA ; (A[3:0]:A[7:4])→ATAX ; A→XLDA ASCII_Table,X ; 查表,得高4位的ASCII码STA Result ; 存高4位的ASCII码LDA Hex_ByteAND #$0F ; 取出低4位TAX ; A→XLDA ASCII_Table,X ; 查表,得低4位的ASCII码STA Result+1 ; 存低4位的ASCII码RTS[例3.3] 设字节变量Num存放在Ram的0070H单元,取值范围为0T~9T,编写查表子程序,查出变量的立方值,并存入Cube字节变量中。
s0806freescale hcs08单片机adc编程应用【freescale 单片机原理及应用
6.2 功能描述
• ADC时钟选择和分频控制
可以选用四种时钟源中的一种来作为ADC模块的时钟。然后再把这个时 钟源分频后产生转换器的输入时钟ADCK。四种时钟源的选择通过 ADICLK位的设定来完成。分频系数通过ADIV位被设成1、2、4或8。
Slide 14
Copyright © Yang Ming. 2010. Electronics and Information Engineering Department of Huazhong University of Science and Technology Wuhan, Hubei 430074, P.R. China
• 外部信号管脚
ADC模块支持高达28个独立的模拟输 入,它还有4个电源/参考/地连接管脚
6.1 概述
模拟供电电源(VDDAD)
> ADC模块使用VDDAD管脚供电, 只需要把VDDAD管脚连接到 VDD管脚,建议在VDDAD管脚 连接退耦电容。在有些封装中, VDDAD管脚内部连接到VDD。
Slide 10
Copyright © Yang Ming. 2010. Electronics and Information Engineering Department of Huazhong University of Science and Technology Wuhan, Hubei 430074, P.R. China
• 内部结构
6.2 功能描述
Slide 9
Copyright © Yang Ming. 2010. Electronics and Information Engineering Department of Huazhong University of Science and Technology Wuhan, Hubei 430074, P.R. China
8位飞思卡尔单片机
飞思卡尔8位单片机概述----飞思卡尔8位单片机系列主要包括RS08类、HCS08类、HC08类、HC08汽车类、HCS08汽车类。
下面每个类型都将挑选一典型产品进行介绍,更多产品介绍敬请登陆飞思卡尔官方网站。
1、RS088位微控制器正逐渐向小型化应用发展。
在这些小型应用中,也许并不需要使用完整的HC08或S08所具备的丰富功能。
RS08内核是非常流行的SO8中央处理器(CPU)的精简版,它被精心打造为效率更高、成本更低并适合小容量内存的微控制器。
RS08是一些新兴应用的理想解决方案,例如完全用固态电路实现的简单机电设备,或小型便携设备甚至一次性便携设备。
飞思卡尔的工程师将小型化应用不需要的功能从S08内核中去除,而对其余的运算进行了增强,从而提高了超小型控制器的使用效率。
这些控制器的芯片面积非常小,您甚至可以将它们从胡椒罐中摇出来。
RS08内核的尺寸比S08小30%。
为了减小面积,RS08将计数器和地址总线宽度限制为14位,使用一个全局中断标志寄存器取代了矢量中断功能,同时还取消了以下功能:堆栈指针和H:X寄存器及其相关指令和寻址模式乘法、除法以及BCD码指令算术逻辑移位运算(保留了逻辑移位和旋转)条件码寄存器中的若干位以及相关条件分支指令这些被取消的功能由更为简单的结构所代替,这些结构保证了在内存低于16K且引脚数目很少的器件上,可以用非常简洁高效的代码实现大多数嵌入式应用。
为了进一步提高运算效率,飞思卡尔增加了如下内容:屏蔽程序计数器,用于更为高效的子程序调用简短微小的寻址模式,允许对最常用的变量和寄存器进行更为有效地访问和操作内存分页方案,能够更充分地利用直接寻址模式和新型的简短微小的寻址模式RS08内核深化了飞思卡尔8位产品系列,在发展可以共享外围设备和通用开发工具、并且引脚兼容的8位/32位器件的过程中,迈出了第一步。
它将使机械和电子产品开发者开发出史无前例、独具匠心、节约成本的电子应用产品和功能非常先进的一次性产品。
S08在线编程
Flash命令寄存器 FCMD
地址0x1826,对Flash进行访问的命令 字节 0x05——空白检测 0x20——写入一个字节的数据 0x25——批量模式下写入一个字节的数 据 0x40——页擦除 0x45——整体擦除
Flash编程的步骤
1、初始化,设置Flash时钟,复位后FCDIV_DIVLD =1才可对Flash擦写 2、清除错误标识为,只有FSTAT_FACCERR=0才 能继续对Flash操作。 3、等待Flash命令缓冲区空,直到 FSTAT_FCBEF=1可以写入新的命令。 4、向Flash地址写入数据。 5、向FCMD中写入命令字。 6、检测错误信息,FSTAT的FPVIOL与FACCERR 7、Flash命令完成标志,FSTAT_FCCF=1结束
附:AD采集基本操作
• S08与AD相关的寄存器有10个,支持28路 AD,与AD相关的I/O口有16个,还可以设 置比较函数 • 可选择8位或10位的AD采集,选择10位采 集相应寄存器高8位的后两位才有意义 • 这里使用最基本的操作,查询方式采集, 代码如下
附: AD基本操作源代码
飞思卡尔HC08
飞思卡尔HC08第一篇:飞思卡尔HC08HC08/S08单片机学习心得看了这篇学习心得,感觉不错,和大家分享一下。
MC9S08QG8和MC9S08AW60,以及和其他单片机之间的横向对比看惯了AVR/PIC/51的手册,刚开始看HC08的数据手册感觉不太习惯,很多地方的风格都不太一样,有个适应过程。
不过只从单片机硬件结构来看,基本组成和功能都是类似的,只是个别地方有自己的独特之处。
HC08单片机硬件上和其他单片机是类似的,都分为ADC、定时器、IO、串行通信(包括串口、SPI、I2C等)、中断等几大部分,都是通过寄存器来启动、设置、关闭相应的功能模块。
只是HC08单片机分得很细,寄存器非常的多,如果只看数据手册,一下可能会感到头晕的。
最好是先看模块的主要介绍,再看每个模块详细的,不要想一次全部看完。
很多时候都是先看大概的,具体应用时知道哪里找就行了。
软件开发基本都是使用FreeScale自己的CodeWarrior,它有特别版、标准版、完全版等几种版本。
特别版的个别功能有限制(主要是PE)和代码大小有限制,而标准版则没有代码大小限制。
特别版对于HC08单片机代码限制是32K,一般情况下都是足够了。
开始使用时,使用Code Warrior的PE(Processor Expert)专家,基本就是用鼠标点几下,就可以生成程序代码和框架,比较简单快速。
不过这样生成的程序比较大,文件数比较多(基本一个功能模块产生2个文件,1个C文件和一个H文件),子程序调用比较多。
好处是容易上手,可以很快熟悉开发流程。
但是使用多了,会觉得如果PE操作再简单一些,不要过多的参数选择,会更适合于对单片机初学的人;如果功能再强一些,可以完全不用写代码,象PSoc express 那样图形方式编程就更好了,适合于不了解单片机的人。
除了PE外,还有一个很有用的功能是DI(Device Initialization)设备初始化,用图形方式设置好参数后自动产生初始化的代码,但是不产生程序框架文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FLASH模拟EEPROM本程序利用S08系列单片机的片内Flash模拟EEPROM。
解决部分8位机没有EEPROM导致在运用上的局限。
本程序提供一个初始化函数和三个功能函数。
用户必须在调用功能函数前调用调用初始化函数。
三个功能函数分别是字节写入、字节读取、EEPROM全擦除。
用户必须保证调用功能函数前有至少30Bate 的栈空间。
本程序参考飞思卡尔公司提供的《在HCS08 微控制器上使用FLASH 存储器模拟EEPROM》。
并在源程序的基础上精简了部分功能,减少了RAM使用量。
并尝试使用分页机制确定EEPROM地址。
接口函数的EEPROM地址寻址由页地址和页内偏移量组成。
即把用户定义的EEPROM分为若干个大小为256字节的页。
其地址与FLASH地址的换算关系为:FLASH真实地址=EEPROM空间起始地址+页地址×256+页内偏移地址用户在使用EEPROM是只用确定数据保存在EEPROM的相对地址即可。
接口函数原型为:EEPROM_WRITE_DATA(数据,页地址, 页内偏移地址);Char EEPROM_READ_DATA(页地址, 页内偏移地址);1. 程序流程分析与设计。
由于S08系列单片机在Flash写入时序中不能进行任何的Flash读操作,Flash 写入指令必须放到RAM中执行并关闭所有可屏蔽中断。
程序流程如图13-1-?。
字节写入/.全擦除程序流程字节读取程序流程图13-1-?2.程序源代码。
此程序在CodeWarrior 6.0继承编译环境中编译通过/*****************************************************///河南工业大学Freescale MCU&DSP联合实验室// 文件名:flash_program.h// CPU :MC9S08AW60// 版本:v1.0// 日期:2008年8月12日// 调试环境:CodeWarrior 6.0// 作者:曾滔// 描述: 头文件,用于保存初始化EEPROM设定、用户定制参数、编译器参数等信息。
/*****************************************************/#include <hidef.h>#include "derivative.h"#include <stdio.h>/*************flash编程指令(请勿改动)*****************/#define BLACK_CHECK 0x05 //查空指令#define BITE_PROGRAM 0x20 //字节编程指令#define BURST_PROGRAM 0x25 //快速编程指令#define PAGE_ERASE 0x40 //页擦除指令(1页=512字节)#define MASS_ERASE 0x41 //全擦除指令/******用户定制参数(根据单片机型号和用户flash使用情况定制)**********/#define EEPROM_START_ADDRESS 0xE000 //EEPROM区起始地址。
512B的倍数#define EEPROM_PAGE_NUM 8 //EEPROM页数。
1page=256B #define BUS_FREQUENCY 2000 //总线频率。
单位(KHz)/********************编译器相关参数**************************/#define INT8U unsigned char //无符号字节变量。
根据编译器更改。
默认CodeWarrior 6.0#define INT16U unsigned short int //无符号字变量。
根据编译器更改。
默认CodeWarrior 6.0/***********EEPROM API函数原型***********///初始化程序。
此函数必须在使用EEPROM前调用。
建议用户在系统初始化是调用。
void INIT_EEPROM(void);//EEPROM擦除函数。
擦除所有EEPROM数据。
void EEPROM_ERASE(void);//EEPROM字节写入函数。
写入一个字节到EEPROM指定区域。
void EEPROM_WRITE_DATA(INT8U data,INT8U EEPROM_page,INT8U offset_address)//EEPROM读出函数。
读出一个指定的区域所保存的字节的到函数返回值。
char EEPROM_READ_DATA(INT8U EEPROM_page,INT8U offset_address); /****************************END************************************//*****************************************************///河南工业大学Freescale MCU&DSP联合实验室// 文件名:flash_program.c// C P U :MC9S08AW60// 版本:v1.0// 日期:2008年8月12日// 调试环境:CodeWarrior 6.0// 作者:曾滔// 描述:提供了一个初始化函数和三个功能函数供用户调用,没有可更改参数。
/*****************************************************/#include "flash_program.h"const INT8U FLASH_CODE[]={ // ; flash操作代码0x45, 0x18, 0x26, // LDHX #$1826 ; FCMD地址写入H:X0xA6, 0x00, // LDA #$00 ; 0x00为命令占位符0xF7, // STA ,X ; 将命令写入FCMD命令缓存器0x5A, // DECX ; 指针指向FSTAT0xF6, // LDA ,X ;0xAA, 0x80, // ORA #$80 ;0xF7, // STA ,X ; 置位FSTAT_FCBEF。
启动flash写入命令0xF6, // LDA ,X ; 等待3个时钟周期(请勿删除此代码)0xF6, // LDA ,X ; 读取FSTAT0xA5, 0x30, // BIT #$300x26, 0x05, // BNE *+6 ; 错误则返回//LOOP0xF6, // LDA ,X ; 等待写操作结束0xA5, 0x40, // BIT #$400x27, 0xFB, // BEQ *-3 ; 跳转到LOOP//EXIT:0X81 //RTS ; 返回};/*********************初始化函数**********************************/#if BUS_FREQUENCY >= 12000void INIT_EEPROM(void){FCDIV=(((BUS_FREQUENCY/(8*175)))|0x40)-1;} #endif#if BUS_FREQUENCY < 12000void INIT_EEPROM(void){FCDIV=(BUS_FREQUENCY/175)-1;}#endif/***********************EEPROM字节写入函数****************************/void EEPROM_WRITE_DATA(INT8U data,INT8U EEPROM_page,INT8U offset_address){INT16U address; //存放写入地址INT8U code_space[23]; //初始化代码空间if(EEPROM_page>=EEPROM_PAGE_NUM)return; //地址错误返回,保护用户代码address=offset_address+EEPROM_page*256+EEPROM_START_ADDRESS; //地址转化(void)memcpy(code_space,FLASH_CODE,23); //复制flash操作代码到RAMcode_space[4] = BITE_PROGRAM; //修改命令占位符为写入命令DisableInterrupts; //关中断if (FSTAT&0x10){ //清错误标志FSTAT = FSTAT|0x10;}_asm{ //写入初始化LDHX address;LDA data;STA ,X; //写入缓存TSX;JSR 2,x; //跳入RAM执行}EnableInterrupts; //开中断__RESET_WATCHDOG();}/********************EEPROM字读取入函数********************************/char EEPROM_READ_DATA(INT8U EEPROM_page,INT8U offset_address){ unsigned short int address; //地址变量char rusult; //数据变量address=offset_address+EEPROM_page*0x100+EEPROM_START_ADDRE SS; //地址转换asm{LDHX address;LDA ,X; //读取地址到数据变量STA rusult;}__RESET_WATCHDOG();return(rusult); //返回}/**********************EEPROM擦除函数********************************/void EEPROM_ERASE(void){INT16U address;INT8U i; //循环变量INT8U code_space[23];for(i=0;i<(EEPROM_PAGE_NUM/2);i++){ //分页擦除address=i*0x200+EEPROM_START_ADDRESS;(void)memcpy(code_space,FLASH_CODE,23); //复制flash操作代码到RAMcode_space[4] = PAGE_ERASE; //修改命令占位符为擦除命令DisableInterrupts; //关中断if (FSTAT&0x10){ //清错误标志FSTAT = FSTAT | 0x10;}_asm{LDHX address; //擦除地址写入缓存STA ,X;TSX;JSR 3,x; //跳入RAM执行}EnableInterrupts; //开中断__RESET_WATCHDOG();}}/****************************END************************************//*****************************************************/// 版权所有(c)河南工业大学// 文件名:mian.c// C P U :MC9S08AW60// 版本:v1.0// 日期:2008年8月12日// 调试环境:CodeWarrior 6.0// 作者:曾滔// 描述: 测试Flash模拟EEPROM程序。