hawkjt2002 发表于 7 天前

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

源代码:
//测试工作频率为 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.0N:P1.1
#define PWM1_1      0x01        //P:P2.0N:P2.1
#define PWM1_2      0x02        //P:P6.0N:P6.1

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

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

#define PWM4_0      0x00        //P:P1.6N:P1.7
#define PWM4_1      0x40        //P:P2.6N:P2.7
#define PWM4_2      0x80        //P:P6.6N:P6.7
#define PWM4_3      0xC0        //P:P3.4N: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

神农鼎 发表于 7 天前


神农鼎 发表于 7 天前

<p>您好!您提供的链接是 STC 论坛上的一个帖子(TID: 24914),标题为 <strong>&quot;stc32g12k128 仿真出现如下警告如何处理?&quot;</strong>。</p>
<p>由于该帖子的完整内容(包括具体的警告信息文本和后续的回复)在读取时受到了长度限制,未能完整获取全部内容。不过,根据已读取到的部分信息,我可以为您做一些初步分析:</p>
<hr />
<h2>初步分析</h2>
<p>从已获取的代码片段来看,您在使用 <strong>STC32G12K128</strong> 进行仿真,代码中配置了 <strong>高级 PWM</strong> 和 <strong>定时器</strong>,并涉及 <strong>PLL 时钟配置</strong>(选择 144MHz PLL)。</p>
<h3>仿真中常见的警告原因(供您排查)</h3>
<p>对于 STC32G 系列单片机仿真时出现的警告,常见原因包括:</p>
<ol>
<li>
<p><strong>访问了仿真器不支持的 SFR/XFR 地址</strong></p>
<ul>
<li>仿真器在单步/全速运行时,如果代码中操作了某些特殊功能寄存器(SFR)或扩展寄存器(XFR),而仿真器无法正确模拟该寄存器的行为,就会产生警告。</li>
<li>您的代码中定义了大量的 PWM 相关宏和时钟选择宏,这些寄存器很多属于 <strong>XFR(扩展RAM区)</strong>,仿真时如果未正确配置 <code>P_SW2 |= 0x80;</code>(使能 XFR 访问),或者仿真器对这些寄存器的仿真支持有限,就可能触发警告。</li>
</ul>
</li>
<li>
<p><strong>PLL 时钟配置在仿真模式下不稳定</strong></p>
<ul>
<li>您在代码中选择了 <code>PLL_144M</code>,PLL 的锁定需要一定时间,仿真环境下时钟切换可能导致仿真器时序不同步,产生警告。</li>
</ul>
</li>
<li>
<p><strong>头文件版本不匹配</strong></p>
<ul>
<li>您使用的是 <code>#include &quot;stc32g.h&quot;</code>,请确保该头文件与您使用的 <strong>STC-ISP 下载软件版本</strong> 以及 <strong>Keil C251 版本</strong> 匹配。建议使用最新版 STC-ISP 软件中提供的头文件。</li>
</ul>
</li>
<li>
<p><strong>仿真器设置问题</strong></p>
<ul>
<li>使用 STC-USB Link1D 或 STC 仿真器时,需要在 STC-ISP 软件中正确设置 <strong>仿真芯片型号</strong> 和 <strong>IRC 频率</strong>,确保与实际代码中的时钟配置一致。</li>
</ul>
</li>
</ol>
<hr />
<h2>建议您补充以下信息</h2>
<p>为了更准确地帮您定位问题,请您补充:</p>
<ol>
<li><strong>具体的警告信息是什么?</strong>(请完整贴出警告文本,例如 <code>Warning: ... at address 0x...</code>)</li>
<li><strong>您使用的 STC-ISP 下载软件版本?</strong></li>
<li><strong>您使用的仿真器型号?</strong>(如 STC-USB Link1D 等)</li>
<li><strong>您是否在代码中正确添加了 <code>P_SW2 |= 0x80;</code> 来使能 XFR 访问?</strong></li>
</ol>
<hr />
<h2>参考手册信息</h2>
<p>根据 <strong>STC32G 系列数据手册</strong>(文件 F12)中的相关章节:</p>
<ul>
<li><strong>第12章 特殊功能寄存器,EAXFR允许访问XFR</strong>:明确指出访问扩展寄存器(XFR)前必须设置 <code>P_SW2 |= 0x80;</code>。</li>
<li><strong>第7章 时钟管理</strong>:详细说明了 PLL 时钟的配置方法和注意事项。</li>
<li><strong>第26章 16位高级PWM定时器</strong>:PWM 相关寄存器属于 XFR 区域。</li>
</ul>
<p>如果您能提供完整的警告信息,我可以进一步结合手册和论坛案例为您给出具体的解决方案。</p>
<hr />
<p><a href="https://www.stcaimcu.com/plugin.php?id=twpx_xunsearch&amp;mod=forum&amp;q=%E8%AF%B7%E6%8F%90%E4%BE%9B%E9%9C%80%E8%A6%81%E6%8F%90%E5%8F%96%E5%85%B3%E9%94%AE%E8%AF%8D%E7%9A%84%E6%96%87%E6%9C%AC%E5%86%85%E5%AE%B9%EF%BC%8C%E4%BB%A5%E4%BE%BF%E6%A0%B9%E6%8D%AE%E8%A7%84%E5%88%99%E6%8F%90%E5%8F%96%E6%90%9C%E7%B4%A2%E5%85%B3%E9%94%AE%E8%AF%8D%E3%80%82&amp;f=_all&amp;m=yes&amp;syn=yes&amp;s=relevance&amp;fid=0">🔍 搜索 &quot;请提供需要提取关键词的文本内容,以便根据规则提取搜索关键词。&quot;</a></p>
<p>⏱️ 查找用时 16.4s | 总回答用时 25.5s</p>

AI芯 发表于 7 天前

参考如下两个帖子的讨论
请教:仿真时报“WARNING: application uses framesize 4target uses framesize 2 !
https://www.stcaimcu.com/thread-17464-1-1.html
(出处: 国芯人工智能技术交流网站)

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



页: [1]
查看完整版本: stc32g12k128 仿真出现如下警告如何处理?