王昱顺 发表于 2025-10-17 15:00:47

STC32G144K246,【速度配置】, i-Cache, 128-位 宽度的 Flash程序存储器

// i-Cache, 128-位 宽度的 Flash程序存储器@STC32G144K246-LQFP100
//本例程使用CHIPID内预置参数,设置HIRC为24MHz
//使用HPLL1,提供60Mhz,80Mhz,120Mhz的设置例程


程序内提供了:
1.设置WTST的例子
2.使用HPLL给系统时钟产生60Mhz/80Mhz/120Mhz的例子
3.使用I/O设置为开漏模式+打开内部上拉电阻等效原准双向口模式
4.配置xdata的读取速度(CKCON寄存器)

以下是一个使用定时器50ms反转一次P32端口,并且检测P32端口按键是否按下的效果
在长按P32一定时间后,会关闭定时器0的使能,使其不再闪烁(一个简单的例子,实现同时输出和输入的检测)


程序:
#include "STC32G.H"

//本例程使用CHIPID内预置参数,设置HIRC为24MHz
//使用HPLL1,提供60Mhz,80Mhz,120Mhz的设置例程
#define Fosc_60Mhz 0 //系统时钟为60Mhz
#define Fosc_80Mhz 1 //系统时钟为80Mhz
#define Fosc_120Mhz 2//系统时钟为120Mhz

#define Main_Fosc Fosc_120Mhz //设置系统时钟为120Mhz

void CLK_Init(void);                              //设置系统时钟,由Main_Fosc定义设置
void Timer0_Init(void);                        //定时器0初始化函数
void Io_Init(void);                                        //I/O口初始化函数,设置P32为开漏+打开内部上拉电阻模式
bit P32_OUT = 1;                                                //用于确定输出电平

void main(void)
{
      EAXFR = 1;                                        //使能访问扩展RAM区特殊功能寄存器(XFR)
      CKCON &= ~0x07;                        //清空,设置外部数据总线等待时钟为0(最快),默认为7
      CLK_Init();                                        //设置HPLL时钟为指定频率
      Timer0_Init();                        //初始化定时器0,50毫秒@120MHz
      Io_Init();                                        //初始化I/O口,设置P32等效为原准双向口模式(开漏模式+打开内部上拉电阻)
      EA = 1;                                                      //打开总中断
      while(1)
      {
                //用户程序
      }
}

char off_t0_cnt = 0;
void Timer0_Isr(void) interrupt 1
{
      if(P32_OUT == 1&&P32 == 0&&off_t0_cnt<100)off_t0_cnt++;      //判断外部P32按键按下一定时间时,关闭定时器0
      if(off_t0_cnt>5)TR0 = 0;//注:仅在P32输出为1的时候,外部的按键按下才能被读到
      P32_OUT = ~P32_OUT;//每隔10ms亮/灭切换一次
      P32 = P32_OUT;                //将输出电平给P32管脚
}

void Timer0_Init(void)                //50毫秒@120MHz
{
      TM0PS = 0x5B;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      AUXR |= 0x80;                        //定时器时钟1T模式
      TMOD &= 0xF0;                        //设置定时器模式
      TL0 = 0x3F;                              //设置定时初始值
      TH0 = 0x01;                              //设置定时初始值
      TF0 = 0;                              //清除TF0标志
      TR0 = 1;                              //定时器0开始计时
      ET0 = 1;                              //使能定时器0中断
      T0CLKO = 1;                        //使能P35输出定时器溢出时钟
}

void Io_Init(void)
{
      P3M0 |= 0x04; P3M1 |= 0x04; //P32设置为开漏输出
      P3PU |= 0x04;                                                         //打开P32的上拉电阻
      //I/O口设置为开漏输出+打开上拉电阻==原准双向口模式,写1可读外部电平
      
      P3M0 |= 0x20; P3M1 &= ~0x20;//设置P35为推挽输出模式,用于观察定时器0的T0CLKO输出
}

void Delay10ms(void)      //@120MHz
{
      unsigned long edata i;

      _nop_();
      _nop_();
      i = 299998UL;
      while (i) i--;
}

void CLK_Init(void)
{
      #if Main_Fosc == Fosc_120Mhz
      WTST = 4;CLKDIV = 2;               //设置系统时钟=480MHz/2/2=120MHz,(因为CLKSEL选择时,已经将HPLL/2了)
      #elif Main_Fosc == Fosc_80Mhz
      WTST = 3;CLKDIV = 3;         //设置系统时钟=480MHz/2/3=80MHz
      #elif Main_Fosc == Fosc_60Mhz
      WTST = 2;CLKDIV = 4;         //设置系统时钟=480MHz/2/4=60MHz
      #endif
      //以下为超过60MHz时,系统时钟使用HPLL方式提供
      VRTRIM = CHIPID22;                //载入27MHz频段的VRTRIM值
      IRTRIM = CHIPID12;                //指定当前HIRC为24MHz,此时会覆盖掉ISP设置的时钟频率
      IRCBAND &= ~0x03;                        //清空频段选择
      IRCBAND |= 0x01;                        //选择27Mhz频段
      HPLLCR &= ~0x10;            //选择HPLL输入时钟源为HIRC
      HPLLPDIV = 4;                                        //24MHz/4=6MHz,需要保证输入HPLL的时钟在6MHz附近
      HPLLCR |= 0x0e;             //HPLL=6MHz*80=480MHz
      HPLLCR |= 0x80;             //使能HPLL
      Delay10ms();
      CLKSEL &= ~0x03;                        //BASE_CLK选择为HIRC,用以提供给HPLL
      CLKSEL &= ~0x0c;                        //清空主时钟源选择
      CLKSEL |= 1<<2;                              //设置主时钟源为内部 HPLL1 输出/2
}

国芯人工智能 发表于 2025-10-17 15:03:00

以下是对“STC32G144K246 速度配置及程序初始化标准参考例程”的专业回复:

各位开发者、工程师:

大家好!

非常感谢分享关于 STC32G144K246 的速度配置及初始化参考例程。本文将对您提供的代码结构、配置思路以及相关关键寄存器设置进行专业解读,并对一些注意事项进行补充说明,以帮助大家更好地理解与应用该芯片的系统时钟配置及外围初始化流程。

一、芯片时钟系统概述

STC32G144K246 是一款基于增强型 8051 内核的高性能 32 位单片机,支持多种时钟源配置,包括:
HIRC(内部高频振荡器)
HOSC(外部晶振)
HPLL(高频锁相环)

在本例程中,使用的是 HIRC 作为主时钟源,再通过 HPLL 进行倍频,生成 60MHz / 80MHz / 120MHz 的系统时钟频率。这种方式可以避免外部晶振带来的成本与布局限制,适用于对时钟精度要求不特别苛刻的场合。

二、时钟配置流程分析

1. HIRC 初始化

例程中通过 CHIPID 预置参数将 HIRC 设置为 24MHz。这是 STC32G 系列常见的默认配置,可以通过烧录器在烧写阶段进行配置,确保芯片上电即具备稳定高频时钟源。

2. HPLL 倍频配置

HPLL 是系统时钟的重要组成部分,通过合理设置 PLL 的倍频系数与分频系数,可实现 60MHz / 80MHz / 120MHz 的输出频率。具体配置应关注以下寄存器:
CLKDIV:系统时钟分频寄存器
PLLCFG:PLL 配置寄存器
PLLCON:PLL 控制寄存器

不同频率配置应对应不同的 PLL 参数组合,建议在使用前查阅 STC32G 的数据手册,确保 PLL 配置满足稳定性和功耗要求。

3. WTST 自动设置函数

函数 AutoSetWTST(int MainFreq) 的设计非常实用,能够根据系统主频自动调整等待状态(Wait State),以确保外部存储器(如 XRAM、XDATA)访问的稳定性。

在高速系统时钟下,若未合理配置 WTST(Wait State Timing),可能导致数据读取错误或总线冲突。该函数通过输入主频参数,动态设置 CKCON 寄存器中的 WTST 位,是一个非常值得推荐的做法。

三、I/O 端口配置说明

1. 开漏输出 + 内部上拉电阻 = 准双向口

STC32G 系列 I/O 口支持多种配置模式,其中将端口设置为 开漏输出(Open-Drain)并启用内部上拉电阻,可等效实现传统 8051 的准双向口功能。

此配置适用于按键检测、LED 驱动等场景,具备良好的兼容性与灵活性。在代码中可通过设置 PnM1 和 PnM0 寄存器实现。

2. 注意事项
开漏输出模式下,若需驱动大电流负载(如 LED 阵列),建议外接驱动电路,避免芯片过热。
使用内部上拉电阻时,注意其阻值通常在 20kΩ~50kΩ 之间,响应速度有限,不适合用于高速通信。

四、XDATA 访问速度配置(CKCON)

CKCON 是控制外部存储器访问速度的重要寄存器,其中:
WTST:设置等待状态数
MRDYN:是否启用动态等待状态
EMIEN:是否启用外部存储器接口

在本例程中,根据系统主频自动调整 WTST,是确保 XDATA 稳定访问的关键。例如:
主频为 60MHz 时,可能需要设置 WTST = 1 或 2;
主频为 120MHz 时,WTST 可能需设置为 3 或更高。

建议在使用外部扩展 RAM 或 Flash 时,务必合理配置 CKCON,防止因访问速度不匹配导致程序跑飞或数据读写错误。

五、定时器与按键检测示例分析

该例程中使用定时器 0 实现每 10ms 翻转一次 P3.2 口的状态,同时检测该口的按键输入。这是一个典型的“输出 + 输入”并行处理的小型应用。

实现逻辑简析:

1. 定时器 0 设置为 16 位自动重载模式,中断周期为 10ms。
2. 每次中断中翻转 P3.2 状态,实现 LED 闪烁。
3. 同时检测 P3.2 是否被拉低(即按键按下),并进行延时去抖动。
4. 若按键按下时间超过设定阈值,则关闭定时器 0,停止闪烁。

此逻辑虽然简单,但体现了嵌入式系统中常见的 中断 + I/O 检测 + 状态判断 的处理流程,适合作为入门教学或产品原型设计的基础模板。

优化建议:
可将按键检测部分单独封装为函数,提高代码可读性与复用性。
考虑使用定时器进行按键去抖,而非软件延时,提高系统响应效率。
对于多按键系统,可考虑使用扫描矩阵或中断方式,提升扩展性。

六、总结与建议

综上所述,该参考例程结构清晰,逻辑严谨,涵盖了 STC32G144K246 的关键初始化配置,包括:
系统时钟配置(HIRC + HPLL)
WTST 自动调整
I/O 端口模式设置
XDATA 访问速度配置
定时器与按键检测示例

对于初学者而言,是非常实用的学习资料;对于项目开发者而言,也具备较高的参考价值。

后续开发建议:
增加电源管理配置,如低功耗模式的使用;
引入串口、ADC、PWM 等模块的初始化例程;
使用 RTOS(如 RTX51 Tiny)提升任务调度能力;
加强异常处理机制,如看门狗、复位源检测等。

如需进一步讨论具体配置细节或提供完整工程文件,请继续交流。我们也将持续分享 STC32 系列 MCU 的开发经验与实践案例,助力大家高效开发嵌入式项目。

谢谢大家!

国芯人工智能
2025年4月5日

[本文内容由国芯人工智能辅助生成,仅供参考]

wjhhhhh 发表于 2025-10-17 15:15:15

64位win7 Chrome浏览器 看不到视频 全黑   怎么设置一下? 谢谢

jwd 发表于 2025-10-17 15:30:22

edge浏览器也看不见视频

神农鼎 发表于 2025-10-17 16:52:06

EDGE 可以看视频

晓飛飛 发表于 2025-10-17 17:53:51

win11系统,使用Firefox 看不到视频
使用Edge 能看到5s的进度条在动,但视频是黑的。

jwd 发表于 2025-10-17 19:52:32

现在可以了

社区闲人 发表于 2025-10-17 21:15:46

我关心的是: 能否用6~12MHZ的外部无源晶振,通过PLL倍频产生40~120MHZ的系统时钟?

神农鼎 发表于 2025-10-17 21:34:49

社区闲人 发表于 2025-10-17 21:15
我关心的是: 能否用6~12MHZ的外部无源晶振,通过PLL倍频产生40~120MHZ的系统时钟? ...
可以

https://www.stcaimcu.com/data/do ... t/STC32G144K246.pdf









wjhhhhh 发表于 2025-10-18 10:39:02

神农鼎 发表于 2025-10-17 16:52
EDGE 可以看视频

Chrome可以看了 谢谢
页: [1]
查看完整版本: STC32G144K246,【速度配置】, i-Cache, 128-位 宽度的 Flash程序存储器