飞飞93 发表于 2024-12-31 20:43:46

millxhcx 发表于 2024-12-31 18:27
问题解决了米

没解决 乏了,最终结果楼下单独回复{:4_184:}

飞飞93 发表于 2024-12-31 20:51:31

新一款晶振回来了,优信上0.69一个 9pf的,想着能好一点,结果接上后不管换多少pf电容都不起振,还不如之前便宜的拉胯。于是又换回8*3圆柱晶振,换上后微调各种容值,勉强起振,有时还得手摸一下才能激励起振。而且还玄学起来认电源,只电脑电源有用能起振,别的USB电源起振不起来,猜测它还靠电源纹波才能激励起来。最终就这样吧,乏了,不研究了。。
希望stc官方推荐几个靠谱的晶振品牌,或者内置个寄存器可以补偿一下晶振的激励电压或负载电容。

晓飛飛 发表于 2024-12-31 22:45:01

敢不敢来个全身照,让我看看你新板子的晶振离单片机有多远,晶振的引脚拉了有多长
另外,用外部晶振的时候,相关引脚必须设置为浮空输入

vg2023 发表于 2025-1-1 04:07:37

可尝试:将与晶振直连和毗邻的引脚清理干净,确保高阻减少分布电容。

科学妞妞 发表于 2025-1-1 08:41:48


电容相连,,,

后,
联GND,,
不是,直接,联GND


看出不同了吗?
线要等长,中间点,接芯片的GED

为什么?摸一下,起振的,就是这原因,还有芯片电源的处理部分,要




飞飞93 发表于 2025-1-1 08:47:33

晓飛飛 发表于 2024-12-31 22:45
敢不敢来个全身照,让我看看你新板子的晶振离单片机有多远,晶振的引脚拉了有多长
另外,用外部晶振的时候 ...

这图

飞飞93 发表于 2025-1-1 08:50:08

以下是测试程序
#include <STC8051U.H> // 头文件见下载软件
#include "intrins.h"
#include "stdio.h"
#define MAIN_Fosc 22118400L
#define Baudrate 115200L
#define TM (65536 -(MAIN_Fosc/Baudrate+2)/4)
bit B1S_Flag;
void RTC_config(void);
void UartInit(void)
{
SCON = (SCON & 0x3f) | 0x40;
T2L = TM;
T2H = TM>>8;
S1BRT = 1;
T2x12 = 1;
T2R = 1;
}
void UartPutc(unsigned char dat)
{
SBUF = dat;
while(TI==0);
TI = 0;
}
char putchar(char c)
{
UartPutc(c);
return c;
}
void RTC_Isr() interrupt 13
{
if(RTCIF & 0x08) // 判断是 否 秒中断
{
RTCIF &= ~0x08; // 清中断标志
B1S_Flag = 1;
}
}
void main(void)
{
P_SW2 = 0X80; // 使能访问 XFR, 没有冲突不用关闭
CKCON = 0x00; // 设置外部数据总线速度为最快
WTST = 0x00; // 设置程序代码等待参数,
// 赋值为 0 可将 CPU 执行程序的速度设置为最快
P0M1 = 0; P0M0 = 0; // 设置为准双向口
P1M1 = 0; P1M0 = 0; // 设置为准双向口
P2M1 = 0; P2M0 = 0; // 设置为准双向口
P3M1 = 0; P3M0 = 0; // 设置为准双向口
P4M1 = 0; P4M0 = 0; // 设置为准双向口
P5M1 = 0; P5M0 = 0; // 设置为准双向口
UartInit();
RTC_config();
EA = 1;
printf("RTC Test Programme!\r\n"); //UART 发送一个字符串
while (1)
{
if(B1S_Flag)
{
B1S_Flag = 0;
        P01=!P01;//LED测试
       
printf("Year=20%bd ", YEAR);
printf("Month=%bd ", MONTH);
printf("Day=%bd ", DAY);
printf("Hour=%bd ", HOUR);
printf("Minute=%bd ", MIN);
printf("Second=%bd ", SEC);
printf("\r\n");
}
}
}
void RTC_config(void)
{
// 选择内部 低速 IRC
// IRC32KCR = 0x80; // 启动内部 低速 IRC 振荡器
// while (!(IRC32KCR & 0x01)); // 等待时钟稳定
// RTCCFG |= 0x02; // 选择内部 低速 IRC 作为 RTC 时钟源
// 选择外部 32K
X32KCR = 0xc0; // 启动外部 32K 晶振
while (!(X32KCR & 0x01)); // 等待时钟稳定
RTCCFG &= ~0x02; // 选择外部 32K 作为 RTC 时钟源
INIYEAR = 21; //Y:2021
INIMONTH = 12; //M:12
INIDAY = 31; //D:31
INIHOUR = 23; //H:23
INIMIN = 59; //M:59
INISEC = 50; //S:50
INISSEC = 0; //S/128:0
RTCIF = 0; // 清中断标志
RTCIEN = 0x08; // 使能 RTC 秒中断
RTCCR = 0x01; // RTC 使能
RTCCFG |= 0x01; // 触发 RTC 寄存器初始化
while(RTCCFG & 0x01); // 等待初始化完成 , 需要在 "RTC 使能 " 之后判断 .
// 设置 RTC 时间需要 32768Hz 的 1 个周期时间 ,
// 大约 30.5us. 由于同步 , 所以实际等待时间是 0~30.5us.
// 如果不等待设置完成就睡眠 , 则 RTC 会由于设置没
// 完成 , 停止计数 , 唤醒后才继续完成设置并继续计数 .
}
/*isr.asm
CSEG AT 0123H
JMP 006BH
END
*/

jmg 发表于 2025-1-1 09:03:12

The ESR of the crystal is important for starting, and lower CL crystals have more gain margin.

If the MCU gain settings still do not solve this, you can try this common approach experiment




The 10M should be inside the MCU, but the 300k can be 50-470k external you cna experiment with, on XTAL OUT pin.


飞飞93 发表于 2025-1-1 09:08:53

jmg 发表于 2025-1-1 09:03
The ESR of the crystal is important for starting, and lower CL crystals have more gain margin.

If t ...

厉害,是个硬件法子,不过得改板,以前在xn297芯片上见过这种外置电阻的晶振接法,不然也不起振{:4_167:}

飞飞93 发表于 2025-1-1 09:10:27

vg2023 发表于 2025-1-1 04:07
可尝试:将与晶振直连和毗邻的引脚清理干净,确保高阻减少分布电容。

我在思考以后32晶振周围是不是得加禁止敷铜{:4_177:}
页: 1 [2] 3
查看完整版本: 关于ai8051上的32768晶振停振这件事