32G12K128系列有128K程序空间, 在Keil环境下新建的项目程大小默认最大只能为64K, 下面详细讲解 在Keil中建立超64K程序大小的项目设置和注意事项 1、 新建项目,如下图 单片机型号请选择“STC MCU Database”中的“STC32G12K128 Series”
2、 项目设置,如下图 注: a) CPU模式必须配置为Source模式 b) Memory模式建议设置为Xsmall模式 c) 超64K的ROM模式必须设置为Huge模式 d) ROM配置保留了16K的EEPROM,程序空间从地址0xFE4000开始,大小为112K(0x1C000),用户可工具自己实际的需求进行修改
3、 设置HEX格式,如下图 超64K的HEX文件格式必须设置为Hex-386格式
4、 添加代码文件到项目中即可编译成功
5、 其它注意事项: a) 单个文件的代码大小必须小余64K。若大于或等于64K,则需要将代码分割为多个代码文件 b) 单个代码数据表格的数据量必须小余64K。若大于或等于64K,则需要将数据表格分割为多个数据表格 c) 使用code关键字定义的数据表格,Keil会强制分配到FF:0000H~FF:FFFFH区域(例如:char code CODE_STR[] ="64K地址范围内数\xfd据表格定义演示";)若需要定义超64K地址范围的数据表格,则需要使用ecode关键字,(例如:char ecode ECODE_STR[] = "超64K地址范围内数\xfd据表格定义演示";) 6、 ISP下载设置及测试结果
测试代码如下:
main.c
- #include "stc32g.h"
- #include "stdio.h"
-
- #define FOSC 11059200UL //定义系统工作频率,UL尾缀指定数据为无符号长整型
- #define BAUD (65536 - FOSC/4/115200)
-
- //汉字'数'在Keil会显示为乱码,需加\xfd修正
- char code CODE_STR[] = "64K地址范围内数\xfd据表格定义演示";
- char ecode ECODE_STR[] = "超64K地址范围内数\xfd据表格定义演示";
-
- extern char ecode HUGE_STR1[63*1024UL]; //声明外部表格数据
- extern char ecode HUGE_STR2[45*1024UL];
-
- void main()
- {
- WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- CKCON = 0; //提高访问XRAM速度
- EAXFR = 1; //扩展寄存器(XFR)访问使能
-
- P0M0 = 0x00; P0M1 = 0x00; //配置所有的I/O口为准双向口模式
- P1M0 = 0x00; P1M1 = 0x00;
- P2M0 = 0x00; P2M1 = 0x00;
- P3M0 = 0x00; P3M1 = 0x00;
- P4M0 = 0x00; P4M1 = 0x00;
- P5M0 = 0x00; P5M1 = 0x00;
- P6M0 = 0x00; P6M1 = 0x00;
- P7M0 = 0x00; P7M1 = 0x00;
-
- SCON = 0x52; //若要使用Keil的printf和默认的putchar函数,必须初始化串口的TI标志为1
- S1BRT = 0; //选择定时器1为串口1的波特率发生器
- T1x12 = 1; //设置定时器1为1T模式
- TMOD &= ~0xf0; //设置定时器1为模式0(16位自动重装载模式)
- TH1 = BAUD >> 8; //设置定时器1重装值
- TL1 = BAUD;
- TR1 = 1; //启动定时器1
-
- printf("STC32G超64K演示程序 !\n");
-
- printf("%s\n", CODE_STR);
- printf("%s\n", ECODE_STR);
- printf("%s\n", HUGE_STR1);
- printf("%s\n", HUGE_STR2);
-
- while (1);
- }
复制代码
table1.c
-
- char ecode HUGE_STR1[63*1024UL] = "定义大数\xfd据表格,单个表格数\xfd据大小必须小余64K";
复制代码
table2.c
-
- char ecode HUGE_STR2[45*1024UL] = "定义大数\xfd据表格,单个文件内的表格数\xfd据大小必须小余64K";
复制代码
|