一键双雕外部时钟如何修改【已解决】
本帖最后由 firefly2k 于 2024-6-12 09:02 编辑使用的是一键双雕程序。现要测量外部频率信号,所以需要精度很高的外部晶振。我晶振选用的是22.1184M。主程序中增加下面代码,选择外部晶振。但实际外部晶振并没用,而一直用的是IRC
P_SW1 = 0x00;
P_SW2 = 0x80; //扩展寄存器(XFR)访问使能
XOSCCR = 0xc0; //启动外部晶振
while (!(XOSCCR & 1)); //等待时钟稳定
CLKDIV = 0x00; //时钟不分频
CKSEL = 1; //选择外部晶振(CKSEL = 1也试过了)
我测量晶振的两端是有22M的振荡信号的,也就是晶振起振了
程序运行中我读取CKSEL,发现读到的低2位是00(IRC),并不是设置的01(XOSC)。也就是不管咋改只能用IRC工作,而在程序中我并未找到哪里有修改CKSEL的地方,请问是什么原因?
问题已解决,上面设置没问题,程序中也没有地方修改CKSEL。
而是printf时是按字%x打印的,会输出为0x100(以为低字节为00);改为按字节%bx打印就没问题了,输出0x1
是clksel不是CKSEL吧 本帖最后由 firefly2k 于 2024-6-9 16:24 编辑
神农鼎 发表于 2024-6-9 16:01
我就是从官方例程复制下来的,但是如上我写的不行呀。
注:官方之前例程的头文件没有CLKSEL的定义,后来看文件里定义的是CKSEL(这个名称不影响结果)
#define CKSEL (*(unsigned char volatile xdata *)0xfe00)
#define MCK_IRC24M 0x00
#define MCK_XOSC 0x01
#define MCK_IRC32K 0x03
#define CLKDIV (*(unsigned char volatile xdata *)0xfe01)
#define IRC24MCR (*(unsigned char volatile xdata *)0xfe02)
#define ENIRC24M 0x80
#define IRC24MST 0x01
本帖最后由 firefly2k 于 2024-6-9 16:26 编辑
soma 发表于 2024-6-9 16:17
是clksel不是CKSEL吧
请见您楼下的说明,例程头文件没有定义CLKSEL,只定义了CKSEL。而且真像您说的那种问题,编译都不会通过的 firefly2k 发表于 2024-6-9 16:22
请见您楼下的说明,例程头文件没有定义CLKSEL,只定义了CKSEL。而且真像您说的那种问题,编译都不会通过的 ...
范例中这个问题我也碰到过,就只有这个范例是CKSEL,且头文件是独立于keil目录下,我查看了其他范例全都是CLKSEL。我也为了对一箭双雕官方范例改成外部晶振发现这个问题的。 soma 发表于 2024-6-9 17:58
范例中这个问题我也碰到过,就只有这个范例是CKSEL,且头文件是独立于keil目录下,我查看了其他范例全都 ...
您也改外部晶振了?请问怎么改的? 你用什么方式读取CKSEL内容的?
我用串口打印CKSEL,切换主频后是可以打印出CKSEL值产生变化的。
此外可以用主频分频输出方式进行验证,例如晶振22.1184M,烧录是IRC频率设置11.0592M,用示波器测量输出脚信号就可以判断主频是22.1184M还是11.0592M。
乘风飞扬 发表于 2024-6-11 11:26
你用什么方式读取CKSEL内容的?
我用串口打印CKSEL,切换主频后是可以打印出CKSEL值产生变化的。
此外可以 ...
我是用串口打印的CKSEL,跟您的方法一样。这个不会有问题的
因为我用的是一箭双雕的程序,我猜您用的应该不是这个程序。这个的IRC的频率会自动调整和设置。所以我不知道IRC自动调整时,哪里会修改CKSEL(我搜索不到哪里有修改)。甚至我把自动调整主频的部分屏蔽掉都不行,还是会修改CKSEL 改外部晶振,我用的那段代码跟你差不多,只是我没有分频( CLKDIV = 0x00;)。
我没有读取CKSEL,但感觉外部晶振能正常启动,找个时间也读取一下CKSEL看看。
页:
[1]
2