32G12K128系列超64K程序演示
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修正
charcode CODE_STR[] = "64K地址范围内数\xfd据表格定义演示";
char ecode ECODE_STR[] = "超64K地址范围内数\xfd据表格定义演示";
extern char ecode HUGE_STR1; //声明外部表格数据
extern char ecode HUGE_STR2;
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 = "定义大数\xfd据表格,单个表格数\xfd据大小必须小余64K";
table2.c
char ecode HUGE_STR2 = "定义大数\xfd据表格,单个文件内的表格数\xfd据大小必须小余64K";
强!!!{:4_250:} {:4_165:}{:4_165:}{:4_165:} 正为之所困!非常感谢!!! 请教:为什么不使用默认的定时器2? yzqlpc 发表于 2023-5-29 09:18
请教:为什么不使用默认的定时器2?
串口1的波特率发生器选择定时器1或者定时器2都可以
范例选择定时器1仅仅是个人习惯而已 zhp 发表于 2023-5-29 09:35
串口1的波特率发生器选择定时器1或者定时器2都可以
范例选择定时器1仅仅是个人习惯而已 ...
好的,谢谢。 感谢楼主分享,帮助很多{:4_196:}{:4_196:}{:4_196:} 谢谢分享,学习了 请教一下我这个是什么问题"C:\Users\26628\Desktop\stc\Snipaste_2024-09-03_18-35-43.png"