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
<p>您好!您提供的链接是 STC 论坛上的一个帖子(TID: 24914),标题为 <strong>"stc32g12k128 仿真出现如下警告如何处理?"</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 "stc32g.h"</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&mod=forum&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&f=_all&m=yes&syn=yes&s=relevance&fid=0">🔍 搜索 "请提供需要提取关键词的文本内容,以便根据规则提取搜索关键词。"</a></p>
<p>⏱️ 查找用时 16.4s | 总回答用时 25.5s</p>
参考如下两个帖子的讨论
请教:仿真时报“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]