找回密码
 立即注册
查看: 52|回复: 3

stc32g12k128 仿真出现如下警告如何处理?

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2026-07-15 15:02:39
已绑定手机

3

主题

4

回帖

41

积分

新手上路

积分
41
发表于 7 天前 | 显示全部楼层 |阅读模式
源代码:
//测试工作频率为 12MHz
//#include "stc8h.h"
#include "stc32g.h" //头文件见下载软件
#include "intrins.h"
#define FOSC 12000000UL
#define HSCK_MCLK 0
#define HSCK_PLL 1
#define HSCK_SEL HSCK_PLL
#define PLL_96M 0
#define PLL_144M 1
#define PLL_SEL PLL_144M
#define CKMS 0x80
#define HSIOCK 0x40
#define MCK2SEL_MSK 0x0c
#define MCK2SEL_SEL1 0x00
#define MCK2SEL_PLL 0x04
#define MCK2SEL_PLLD2 0x08
#define MCK2SEL_IRC48 0x0c
#define MCKSEL_MSK 0x03
#define MCKSEL_HIRC 0x00
#define MCKSEL_XOSC 0x01
#define MCKSEL_X32K 0x02
#define MCKSEL_IRC32K 0x03
#define ENCKM 0x80
#define PCKI_MSK 0x60
#define PCKI_D1 0x00
#define PCKI_D2 0x20
#define PCKI_D4 0x40
#define PCKI_D8 0x60
sbit led = P7^5;
#define PWM1_0      0x00        //P:P1.0  N:P1.1
#define PWM1_1      0x01        //P:P2.0  N:P2.1
#define PWM1_2      0x02        //P:P6.0  N:P6.1

#define PWM2_0      0x00        //P:P1.2/P5.4  N:P1.3
#define PWM2_1      0x04        //P:P2.2  N:P2.3
#define PWM2_2      0x08        //P:P6.2  N:P6.3

#define PWM3_0      0x00        //P:P1.4  N:P1.5
#define PWM3_1      0x10        //P:P2.4  N:P2.5
#define PWM3_2      0x20        //P:P6.4  N:P6.5

#define PWM4_0      0x00        //P:P1.6  N:P1.7
#define PWM4_1      0x40        //P:P2.6  N:P2.7
#define PWM4_2      0x80        //P:P6.6  N:P6.7
#define PWM4_3      0xC0        //P:P3.4  N:P3.3

#define ENO1P       0x01
#define ENO1N       0x02
#define ENO2P       0x04
#define ENO2N       0x08
#define ENO3P       0x10
#define ENO3N       0x20
#define ENO4P       0x40
#define ENO4N       0x80

#define Timer0_Reload   (65536UL -(FOSC / 1000))
//typedef         unsigned char        u8;
//typedef         unsigned int        u16;
//typedef         unsigned long        u32;
u16 Period;
u8 msSecond;

bit B_1ms;          //1ms标志
bit PWM1_Flag;
void delay()
{
        int i;
        for (i=0; i<100; i++);
}
/*
char ReadPWMA(char addr)
{
        char dat;
        while (HSPWMA_ADR & 0x80); //等待前一个异步读写完成
        HSPWMA_ADR = addr | 0x80; //设置间接访问地址,只需要设置原 XFR 地址的低 7 位
        //HSPWMA_ADR 寄存器的最高位写 1,表示读数据
        while (HSPWMA_ADR & 0x80); //等待当前异步读取完成
        dat = HSPWMA_DAT; //读取异步数据
        return dat;
}
void WritePWMA(char addr, char dat)
{
        while (HSPWMA_ADR & 0x80); //等待前一个异步读写完成
        HSPWMA_DAT = dat; //准备需要写入的数据
        HSPWMA_ADR = addr & 0x7f; //设置间接访问地址,只需要设置原 XFR 地址的低 7 位
                                                                //HSPWMA_ADR 寄存器的最高位写 0,表示写数据
}
*/

/************* 发送脉冲函数 **************/
void TxPulse(u8 rep)
{
    if(rep == 0) return;
    rep -= 1;

    PWMA_RCR = rep;    //重复计数寄存器,计数 rep 个脉冲后产生更新事件
    PWMA_CR1 |= 0x89;  //使能ARR预装载,单脉冲模式,开始计时
}

/******************* PWM中断函数 ********************/
//void PWMA_ISR() interrupt 26
//{
//    if(PWMA_SR1 & 0X01)
//    {
//        PWMA_SR1 &=~0X01;    //清标志位
//    }
//}

//========================================================================
// 函数: UpdatePwm(void)
// 描述: 更新PWM周期占空比.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void UpdatePwm(void)
{
    PWMA_ARRH = (u8)(Period >> 8); //设置周期时间
    PWMA_ARRL = (u8)Period;
    PWMA_CCR1H = (u8)((Period >> 1) >> 8); //设置占空比时间: Period/2
    PWMA_CCR1L = (u8)((Period >> 1));
}
/********************** Timer0 1ms中断函数 ************************/
void timer0(void) interrupt 1
{
    B_1ms = 1;
    if(PWM1_Flag)
    {
        Period++;  //周期递增
        if(Period >= 0x1000) PWM1_Flag = 0;
    }
   /* else
    {
        Period--;  //周期递减
        if(Period <= 0x0100) PWM1_Flag = 1;
    }*/
    UpdatePwm();        //设置周期、占空比
}
void main()
{
       
        EAXFR = 1; //使能访问 XFR
        CKCON = 0x00;//设置外部数据总线速度为最快
        WTST = 0x00;
//        HIRCCR = 0x80; //启动内部高速 IRC
//while (!(HIRCCR & 1)); //等待时钟稳定
//CLKSEL = 0x00; //选择内部高速 HIRC
        //选择 PLL 输出时钟
        #if (PLL_SEL == PLL_96M)
        CLKSEL &= ~CKMS; //选择 PLL 的 96M 作为 PLL 的输出时钟
        #elif (PLL_SEL == PLL_144M)
        CLKSEL |= CKMS; //选择 PLL 的 144M 作为 PLL 的输出时钟
        #else
        CLKSEL &= ~CKMS; //默认选择 PLL 的 96M 作为 PLL 的输出时钟
        #endif
                                        //选择 PLL 输入时钟分频,保证输入时钟为 12M
        USBCLK &= ~PCKI_MSK;
        #if (FOSC == 12000000UL)
        USBCLK |= PCKI_D1; //PLL 输入时钟 1 分频
        #elif (FOSC == 24000000UL)
        USBCLK |= PCKI_D2; //PLL 输入时钟 2 分频
        #elif (FOSC == 48000000UL)
        USBCLK |= PCKI_D4; //PLL 输入时钟 4 分频
        #elif (FOSC == 96000000UL)
        USBCLK |= PCKI_D8; //PLL 输入时钟 8 分频
        #else
        USBCLK |= PCKI_D1; //默认 PLL 输入时钟 1 分频
        #endif

       

                                                        //启动 PLL
        USBCLK |= ENCKM; //使能 PLL 倍频
        delay(); //等待 PLL 锁频
        //选择 HSPWM/HSSPI 时钟
        /*#if (HSCK_SEL == HSCK_MCLK)
        CLKSEL &= ~HSIOCK; //HSPWM/HSSPI 选择主时钟为时钟源
        #elif (HSCK_SEL == HSCK_PLL)
        CLKSEL |= HSIOCK; //HSPWM/HSSPI 选择 PLL 输出时钟为时钟源
        #else
        CLKSEL &= ~HSIOCK; //默认 HSPWM/HSSPI 选择主时钟为时钟源
        #endif*/
        CLKSEL |= HSIOCK; //HSPWM/HSSPI 选择 PLL 输出时钟为时钟源
        HSCLKDIV = 0; //HSPWM/HSSPI 时钟源不分频
        HSPWMA_CFG = 0x03; //使能 PWMA 相关寄存器异步访问功能
        //通过异步方式设置 PWMA 的相关寄存器
       
           // 自动重装寄存器ARR高低字节赋值
    //PWMA_ARRH = arr_val >> 8;
    //PWMA_ARRL = arr_val & 0x00FF;

    // 比较寄存器CCR1高低字节赋值
   // PWMA_CCR1H = ccr_val >> 8;
    //PWMA_CCR1L = ccr_val & 0x00FF;
        /*
        if(count<10)
        {
        WritePWMA((char)&PWMA_CCER1, 0x00);
        WritePWMA((char)&PWMA_CCMR1, 0x00); //CC1 为输出模式
        WritePWMA((char)&PWMA_CCMR1, 0x60); //OC1REF 输出 PWM1(CNT<CCR 时输出有效电平 1)
        WritePWMA((char)&PWMA_CCER1, 0x05); //使能 CC1/CC1N 上的输出功能
        WritePWMA((char)&PWMA_ENO, 0x03); //使能 PWM 信号输出到端口
        WritePWMA((char)&PWMA_BKR, 0x80); //使能主输出
        WritePWMA((char)&PWMA_CCR1H, (70>>1) >> 8); //设置输出 PWM 的占空比
        WritePWMA((char)&PWMA_CCR1L, (70>>1));
        WritePWMA((char)&PWMA_ARRH, 70 >> 8);//WritePWMA((char)&PWMA_ARRH, 1000 >> 8); //设置输出 PWM 的周期
        WritePWMA((char)&PWMA_ARRL, 70);//WritePWMA((char)&PWMA_ARRL, 1000);
        WritePWMA((char)&PWMA_DTR, 10); //设置互补对称输出 PWM 的死区
        WritePWMA((char)&PWMA_CR1, 0x01); //开始 PWM 计数
        }
        count ++;
        if(count>9) count = 0;
       
        P2M0 = 0;
        P2M1 = 0;
        P3M0 = 0;
        P3M1 = 0;
        P2 = ReadPWMA((char)&PWMA_ARRH); //异步方式读取寄存器
        P3 = ReadPWMA((char)&PWMA_ARRL);
        */
       
        PWMA_ENO = 0x00;
    PWMA_ENO |= ENO1P; //使能输出

    PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
    PWMA_CCMR1 = 0x60; //设置 PWM1 模式1 输出
//    PWMA_CCER1 = 0x01; //使能 CC1E 通道, 高电平有效
    PWMA_CCER1 = 0x03; //使能 CC1E 通道, 低电平有效

    PWMA_CCMR1 |= 0x08; //开启PWMA_CCR1预转载功能(需要CC1E=1才可写)

    PWMA_PS = 0x00;    //高级 PWM 通道输出脚选择位
    PWMA_PS |= PWM1_2; //选择 PWM1_2 通道

    UpdatePwm();
    PWMA_BKR = 0x80;   //使能主输出
//    PWMA_CR1 |= 0x89;  //使能ARR预装载,单脉冲模式,开始计时
    //  Timer0初始化
    AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
    TH0 = (u8)(Timer0_Reload / 256);
    TL0 = (u8)(Timer0_Reload % 256);
    ET0 = 1;    //Timer0 interrupt enable
    TR0 = 1;    //Tiner0 run
PWM1_Flag = 1;
    EA = 1;     //打开总中断
        while (1)
    {
        if(B_1ms)
        {
                        led = ~led;
            B_1ms = 0;
            msSecond++;
            if(msSecond >= 10)  //10ms启动一次PWM输出
            {
                msSecond = 0;
                TxPulse(10);    //输出10个脉冲
            }
        }
    }
}

仿真时告警如下:
Driver version   : V1.09
Adapter version  : 1.25 (6.55.45)
Load "C:\\Keil_v5\\C251\\project\\PWM脉冲可控\\Objects\\高速PWM可控"
*** WARNING: application uses framesize 4
                  target uses framesize 2 !
BS \main\254
BS \main\253

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2026-07-21 09:31:46

851

主题

1万

回帖

2万

积分

管理员

积分
24394
发表于 7 天前 | 显示全部楼层
截图202607151518175011.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2026-07-21 09:31:46

851

主题

1万

回帖

2万

积分

管理员

积分
24394
发表于 7 天前 | 显示全部楼层

您好!您提供的链接是 STC 论坛上的一个帖子(TID: 24914),标题为 "stc32g12k128 仿真出现如下警告如何处理?"

由于该帖子的完整内容(包括具体的警告信息文本和后续的回复)在读取时受到了长度限制,未能完整获取全部内容。不过,根据已读取到的部分信息,我可以为您做一些初步分析:


初步分析

从已获取的代码片段来看,您在使用 STC32G12K128 进行仿真,代码中配置了 高级 PWM定时器,并涉及 PLL 时钟配置(选择 144MHz PLL)。

仿真中常见的警告原因(供您排查)

对于 STC32G 系列单片机仿真时出现的警告,常见原因包括:

  1. 访问了仿真器不支持的 SFR/XFR 地址

    • 仿真器在单步/全速运行时,如果代码中操作了某些特殊功能寄存器(SFR)或扩展寄存器(XFR),而仿真器无法正确模拟该寄存器的行为,就会产生警告。
    • 您的代码中定义了大量的 PWM 相关宏和时钟选择宏,这些寄存器很多属于 XFR(扩展RAM区),仿真时如果未正确配置 P_SW2 |= 0x80;(使能 XFR 访问),或者仿真器对这些寄存器的仿真支持有限,就可能触发警告。
  2. PLL 时钟配置在仿真模式下不稳定

    • 您在代码中选择了 PLL_144M,PLL 的锁定需要一定时间,仿真环境下时钟切换可能导致仿真器时序不同步,产生警告。
  3. 头文件版本不匹配

    • 您使用的是 #include "stc32g.h",请确保该头文件与您使用的 STC-ISP 下载软件版本 以及 Keil C251 版本 匹配。建议使用最新版 STC-ISP 软件中提供的头文件。
  4. 仿真器设置问题

    • 使用 STC-USB Link1D 或 STC 仿真器时,需要在 STC-ISP 软件中正确设置 仿真芯片型号IRC 频率,确保与实际代码中的时钟配置一致。

建议您补充以下信息

为了更准确地帮您定位问题,请您补充:

  1. 具体的警告信息是什么?(请完整贴出警告文本,例如 Warning: ... at address 0x...
  2. 您使用的 STC-ISP 下载软件版本?
  3. 您使用的仿真器型号?(如 STC-USB Link1D 等)
  4. 您是否在代码中正确添加了 P_SW2 |= 0x80; 来使能 XFR 访问?

参考手册信息

根据 STC32G 系列数据手册(文件 F12)中的相关章节:

  • 第12章 特殊功能寄存器,EAXFR允许访问XFR:明确指出访问扩展寄存器(XFR)前必须设置 P_SW2 |= 0x80;
  • 第7章 时钟管理:详细说明了 PLL 时钟的配置方法和注意事项。
  • 第26章 16位高级PWM定时器:PWM 相关寄存器属于 XFR 区域。

如果您能提供完整的警告信息,我可以进一步结合手册和论坛案例为您给出具体的解决方案。


🔍 搜索 "请提供需要提取关键词的文本内容,以便根据规则提取搜索关键词。"

⏱️ 查找用时 16.4s | 总回答用时 25.5s

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:344
  • 最近打卡:2026-07-22 10:08:37

16

主题

866

回帖

3999

积分

超级版主

积分
3999
发表于 7 天前 | 显示全部楼层
参考如下两个帖子的讨论
请教:仿真时报“WARNING: application uses framesize 4  target uses framesize 2 !
https://www.stcaimcu.com/thread-17464-1-1.html
(出处: 国芯人工智能技术交流网站)

32G12K128仿真时出现警告
https://www.stcaimcu.com/thread-17033-1-1.html
(出处: 国芯人工智能技术交流网站)



回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-22 10:32 , Processed in 0.074836 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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