firefly2k 发表于 2024-6-9 15:53:42

一键双雕外部时钟如何修改【已解决】

本帖最后由 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

神农鼎 发表于 2024-6-9 16:01:17






soma 发表于 2024-6-9 16:17:07

是clksel不是CKSEL吧

firefly2k 发表于 2024-6-9 16:20:05

本帖最后由 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:22:38

本帖最后由 firefly2k 于 2024-6-9 16:26 编辑

soma 发表于 2024-6-9 16:17
是clksel不是CKSEL吧
请见您楼下的说明,例程头文件没有定义CLKSEL,只定义了CKSEL。而且真像您说的那种问题,编译都不会通过的

soma 发表于 2024-6-9 17:58:13

firefly2k 发表于 2024-6-9 16:22
请见您楼下的说明,例程头文件没有定义CLKSEL,只定义了CKSEL。而且真像您说的那种问题,编译都不会通过的 ...

范例中这个问题我也碰到过,就只有这个范例是CKSEL,且头文件是独立于keil目录下,我查看了其他范例全都是CLKSEL。我也为了对一箭双雕官方范例改成外部晶振发现这个问题的。

firefly2k 发表于 2024-6-9 19:19:37

soma 发表于 2024-6-9 17:58
范例中这个问题我也碰到过,就只有这个范例是CKSEL,且头文件是独立于keil目录下,我查看了其他范例全都 ...

您也改外部晶振了?请问怎么改的?

乘风飞扬 发表于 2024-6-11 11:26:41

你用什么方式读取CKSEL内容的?
我用串口打印CKSEL,切换主频后是可以打印出CKSEL值产生变化的。
此外可以用主频分频输出方式进行验证,例如晶振22.1184M,烧录是IRC频率设置11.0592M,用示波器测量输出脚信号就可以判断主频是22.1184M还是11.0592M。

firefly2k 发表于 2024-6-11 13:17:23

乘风飞扬 发表于 2024-6-11 11:26
你用什么方式读取CKSEL内容的?
我用串口打印CKSEL,切换主频后是可以打印出CKSEL值产生变化的。
此外可以 ...
我是用串口打印的CKSEL,跟您的方法一样。这个不会有问题的
因为我用的是一箭双雕的程序,我猜您用的应该不是这个程序。这个的IRC的频率会自动调整和设置。所以我不知道IRC自动调整时,哪里会修改CKSEL(我搜索不到哪里有修改)。甚至我把自动调整主频的部分屏蔽掉都不行,还是会修改CKSEL

xxkj2010 发表于 2024-6-11 14:54:40

改外部晶振,我用的那段代码跟你差不多,只是我没有分频( CLKDIV = 0x00;)。
我没有读取CKSEL,但感觉外部晶振能正常启动,找个时间也读取一下CKSEL看看。
页: [1] 2
查看完整版本: 一键双雕外部时钟如何修改【已解决】