目前新定义芯片的 Flash ROM 大小为 16Kbytes~128Kbytes,SRAM 分为内部 RAM 以及外部 RAM,内
部 RAM 大小为 256bytes,外部 RAM 大小不等,具体数据请查看芯片对应规格书,当 Flash ROM 大于 64K
时,需要进行 bank 操作,分 bank 操作可查看《新定义 128K 单片机分 Bank 应用说明》以及参考“新定义
128K 单片机分 Bank 应用例程”。
此文档主要对 ROM 和 RAM 使用过程中常见的问题以及相关注意事项进行说明,包含以下几个内容:
1 ROM 和 RAM 使用注意事项;
2 芯片是否有唯一 ID 码;
3 编译提示 DATA 溢出;
4 堆栈存放位置;
5 数据存储方式是大端模式还是小端模式;
以下为具体内容,请用户根据需求自行查阅:
1、ROM 和 RAM 使用注意事项:
1) RD8G403 系列芯片 ROM 的前 256bytes,即 0x0000-0x00FF,禁止 MOVC 寻址;因此用户自定义的数据不能存放在该区域;用户可在 Keil 中将代码区域设置在 0X100 之后;如需开放该区域使用,需要把全局变量,不可变类型数据(code 类型数据)定义在 Flash ROM 起始的 256bytes 地址之后,具体操作可从新定义网站(http://www.rdsmcu.com),下载《新定义 RD8G403 系列 MCU 应用指南》查看“C 语言开发,MOVC 指令”章节;
2) 芯片内部 RAM 为 256bytes,地址范围为 00H~FFH,其中高 128bytes(地址 80H~FFH)只能间接寻址,低 128bytes(地址 00H~7FH)可直接寻址也可间接寻址,在 keil 中编译时,默认数据为 data类型,编译到低 128bytes 地址,要使用高 128byts 的地址,需要将变量类型定义为 idata;
3) 因为芯片上电时 RAM 为随机值,如在程序中 STARTUP.A51 文件中未对 RAM 进行上电清零,且程序中定义变量时未赋初值,有可能会因为该变量初值为随机值而导致芯片功能异常;建议在STARTUP.A51 文件中对所有 RAM 进行上电清零,根据芯片 RAM 的各区域的大小进行相关设置,如图,是将 RAM 的 IDATA 区的 256Byte 和 XDATA 区的 256Byte 的数据清零:
4) 当程序调用子函数以及需要执行中断服务函数时,需要进行堆栈,芯片内部 RAM 除程序占用的空间以外都是堆栈区,用户在程序设计时需要注意预留足够的空间用于堆栈;
5) 使用数组时需要注意调用的数组长度不能超出数组定义范围,否则会导致数组访问越界,获取错误的 数据值,导致程序执行出错;
2、芯片是否有唯一 ID 码: 1) RD8G403 系列芯片,无唯一 ID 码,可在烧录时使用序列号功能,将设置的 32bits 序列号烧录到芯 片 Flash ROM 中作为滚码使用; 2) RD8X05、RD8X36/37 系列的芯片,提供了一个独立的 Unique ID 区域,出厂前会预烧一个 96bits 的 唯一码,以确保该芯片的唯一性。用户获得 Unique ID 的唯一方式是通过 IAP 指令读取相对地址(01) 0260H~026BH 来获取。地址(01)0260H~026BH 括号里的“01”表示拓展地址,由 IAPADE 寄存器 设定,具体操作方法请查看规格书 Unique ID 相关说明;
3、编译提示 DATA 溢出: 1) 在 Option for Targe- Targe-Memory Model 选择 Small:varables in DATA 模式后,如果定义变量的 时候不加 idata (内部 RAM 高 128byte) 或 xdata (外部 RAM) 关键字,Keil 会默认将变量放到内部 RAM 的低 128byte,所以编译后 data 变量超过 128byte 就会报错,提示 DATA 溢出;解决方法是将 一部分变量手动定义到 idata 或 xdata 区域; 2) Keil C51 环境中,需要放到 ROM 的常量要使用关键字 code 进行定义,如果使用关键字 const 定义 会编译到 RAM,有可能导致 data 变量超出引起报错;
4、堆栈存放位置: 堆栈空间存放在内部 RAM 区域,程序中使用的函数嵌套层数没有限制,将 RAM 堆栈空间留够即可;
5、数据存储方式是大端模式还是小端模式: 新定义芯片的编译环境是 Keil C51,编译器的数据存储方式默认为大端模式,不可更改
|