zhp 发表于 2023-4-5 19:53:34

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";



WHX 发表于 2023-4-5 20:58:48

强!!!{:4_250:}

伽马刀 发表于 2023-4-28 23:14:32

{:4_165:}{:4_165:}{:4_165:}

wadz 发表于 2023-5-10 23:00:58

正为之所困!非常感谢!!!

yzqlpc 发表于 2023-5-29 09:18:31

请教:为什么不使用默认的定时器2?

zhp 发表于 2023-5-29 09:35:29

yzqlpc 发表于 2023-5-29 09:18
请教:为什么不使用默认的定时器2?

串口1的波特率发生器选择定时器1或者定时器2都可以
范例选择定时器1仅仅是个人习惯而已

yzqlpc 发表于 2023-5-29 10:19:27

zhp 发表于 2023-5-29 09:35
串口1的波特率发生器选择定时器1或者定时器2都可以
范例选择定时器1仅仅是个人习惯而已 ...

好的,谢谢。

JimOrange 发表于 2024-4-9 18:30:57

感谢楼主分享,帮助很多{:4_196:}{:4_196:}{:4_196:}

mozh 发表于 2024-5-2 11:46:44

谢谢分享,学习了

li_93 发表于 2024-9-3 18:36:51

请教一下我这个是什么问题"C:\Users\26628\Desktop\stc\Snipaste_2024-09-03_18-35-43.png"
页: [1] 2 3
查看完整版本: 32G12K128系列超64K程序演示