找回密码
 立即注册
查看: 3648|回复: 7

STC32G12K128系列超64K程序演示

[复制链接]
  • TA的每日心情
    开心
    昨天 10:31
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    16

    主题

    711

    回帖

    2526

    积分

    超级版主

    积分
    2526
    发表于 2023-4-5 19:53:34 | 显示全部楼层 |阅读模式
    本帖最后由 zhp 于 2023-4-6 09:17 编辑

    STC32G12K128系列有128K程序空间,在Keil环境下新建的项目程大小默认最大只能为64K
    下面详细讲解在Keil中建立超64K程序大小的项目设置和注意事项
    1、 新建项目,如下图
    STC32G12K128系列超64K程序演示-1.png
    单片机型号请选择“STC MCU Database”中的“STC32G12K128 Series”


    2、 项目设置,如下图
    STC32G12K128系列超64K程序演示-2.png
    注:
    a)   CPU模式必须配置为Source模式
    b)   Memory模式建议设置为Xsmall模式
    c)    超64K的ROM模式必须设置为Huge模式
    d)    ROM配置保留了16K的EEPROM,程序空间从地址0xFE4000开始,大小为112K(0x1C000),用户可工具自己实际的需求进行修改


    3、 设置HEX格式,如下图
    STC32G12K128系列超64K程序演示-3.png
    超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下载设置及测试结果
    STC32G12K128系列超64K程序演示-4.png

    STC32G12K128系列超64K程序演示-5.png

    测试代码如下:
    main.c
    1. #include "stc32g.h"
    2. #include "stdio.h"
    3. #define FOSC        11059200UL              //定义系统工作频率,UL尾缀指定数据为无符号长整型
    4. #define BAUD        (65536 - FOSC/4/115200)
    5.                                             //汉字'数'在Keil会显示为乱码,需加\xfd修正
    6. char  code CODE_STR[] = "64K地址范围内数\xfd据表格定义演示";
    7. char ecode ECODE_STR[] = "超64K地址范围内数\xfd据表格定义演示";
    8. extern char ecode HUGE_STR1[63*1024UL];     //声明外部表格数据
    9. extern char ecode HUGE_STR2[45*1024UL];
    10. void main()
    11. {
    12.     WTST = 0;                               //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    13.     CKCON = 0;                              //提高访问XRAM速度
    14.     EAXFR = 1;                              //扩展寄存器(XFR)访问使能
    15.     P0M0 = 0x00; P0M1 = 0x00;               //配置所有的I/O口为准双向口模式
    16.     P1M0 = 0x00; P1M1 = 0x00;
    17.     P2M0 = 0x00; P2M1 = 0x00;
    18.     P3M0 = 0x00; P3M1 = 0x00;
    19.     P4M0 = 0x00; P4M1 = 0x00;
    20.     P5M0 = 0x00; P5M1 = 0x00;
    21.     P6M0 = 0x00; P6M1 = 0x00;
    22.     P7M0 = 0x00; P7M1 = 0x00;
    23.    
    24.     SCON = 0x52;                            //若要使用Keil的printf和默认的putchar函数,必须初始化串口的TI标志为1
    25.     S1BRT = 0;                              //选择定时器1为串口1的波特率发生器
    26.     T1x12 = 1;                              //设置定时器1为1T模式
    27.     TMOD &= ~0xf0;                          //设置定时器1为模式0(16位自动重装载模式)
    28.     TH1 = BAUD >> 8;                        //设置定时器1重装值
    29.     TL1 = BAUD;
    30.     TR1 = 1;                                //启动定时器1
    31.    
    32.     printf("STC32G超64K演示程序 !\n");
    33.    
    34.     printf("%s\n", CODE_STR);
    35.     printf("%s\n", ECODE_STR);
    36.     printf("%s\n", HUGE_STR1);
    37.     printf("%s\n", HUGE_STR2);
    38.    
    39.     while (1);
    40. }
    复制代码


    table1.c
    1. char ecode HUGE_STR1[63*1024UL] = "定义大数\xfd据表格,单个表格数\xfd据大小必须小余64K";
    复制代码


    table2.c
    1. char ecode HUGE_STR2[45*1024UL] = "定义大数\xfd据表格,单个文件内的表格数\xfd据大小必须小余64K";
    复制代码



    STC32G12K128系列超64K程序演示.zip

    73.44 KB, 下载次数: 160

    回复 送花

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 08:06
  • 签到天数: 133 天

    [LV.7]常住居民III

    17

    主题

    528

    回帖

    1209

    积分

    金牌会员

    积分
    1209
    发表于 2023-4-5 20:58:48 | 显示全部楼层
    强!!!
    不停地学习
    回复 送花

    使用道具 举报

    该用户从未签到

    7

    主题

    31

    回帖

    132

    积分

    注册会员

    积分
    132
    发表于 2023-4-28 23:14:32 | 显示全部楼层
    回复 送花

    使用道具 举报

    该用户从未签到

    3

    主题

    7

    回帖

    85

    积分

    注册会员

    积分
    85
    发表于 2023-5-10 23:00:58 | 显示全部楼层
    正为之所困!非常感谢!!!
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    31

    主题

    45

    回帖

    362

    积分

    中级会员

    积分
    362
    发表于 2023-5-29 09:18:31 | 显示全部楼层
    请教:为什么不使用默认的定时器2?

    点评

    zhp
    串口1的波特率发生器选择定时器1或者定时器2都可以 范例选择定时器1仅仅是个人习惯而已  详情 回复 发表于 2023-5-29 09:35
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:31
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    16

    主题

    711

    回帖

    2526

    积分

    超级版主

    积分
    2526
     楼主| 发表于 2023-5-29 09:35:29 | 显示全部楼层
    yzqlpc 发表于 2023-5-29 09:18
    请教:为什么不使用默认的定时器2?

    串口1的波特率发生器选择定时器1或者定时器2都可以
    范例选择定时器1仅仅是个人习惯而已
    回复 支持 1 反对 0 送花

    使用道具 举报

    该用户从未签到

    31

    主题

    45

    回帖

    362

    积分

    中级会员

    积分
    362
    发表于 2023-5-29 10:19:27 | 显示全部楼层
    zhp 发表于 2023-5-29 09:35
    串口1的波特率发生器选择定时器1或者定时器2都可以
    范例选择定时器1仅仅是个人习惯而已 ...

    好的,谢谢。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 22:51
  • 签到天数: 47 天

    [LV.5]常住居民I

    8

    主题

    74

    回帖

    396

    积分

    中级会员

    积分
    396
    发表于 2024-4-9 18:30:57 | 显示全部楼层
    感谢楼主分享,帮助很多
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-30 03:28 , Processed in 0.069277 second(s), 60 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表