找回密码
 立即注册
查看: 635|回复: 13

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-30 20:18:10

11

主题

45

回帖

236

积分

中级会员

积分
236
发表于 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
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15648
发表于 2024-6-9 16:01:17 | 显示全部楼层
截图202406091600396970.jpg


截图202406091601133042.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-04 00:16:27
已绑定手机

19

主题

3191

回帖

4930

积分

论坛元老

积分
4930
发表于 2024-6-9 16:17:07 来自手机 | 显示全部楼层
是clksel不是CKSEL吧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-30 20:18:10

11

主题

45

回帖

236

积分

中级会员

积分
236
发表于 2024-6-9 16:20:05 | 显示全部楼层
本帖最后由 firefly2k 于 2024-6-9 16:24 编辑

我就是从官方例程复制下来的,但是如上我写的不行呀。
注:官方之前例程的头文件没有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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-30 20:18:10

11

主题

45

回帖

236

积分

中级会员

积分
236
发表于 2024-6-9 16:22:38 | 显示全部楼层
本帖最后由 firefly2k 于 2024-6-9 16:26 编辑
so*** 发表于 2024-6-9 16:17
是clksel不是CKSEL吧

请见您楼下的说明,例程头文件没有定义CLKSEL,只定义了CKSEL。而且真像您说的那种问题,编译都不会通过的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-04 00:16:27
已绑定手机

19

主题

3191

回帖

4930

积分

论坛元老

积分
4930
发表于 2024-6-9 17:58:13 来自手机 | 显示全部楼层
firefly2k 发表于 2024-6-9 16:22
请见您楼下的说明,例程头文件没有定义CLKSEL,只定义了CKSEL。而且真像您说的那种问题,编译都不会通过的 ...

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-30 20:18:10

11

主题

45

回帖

236

积分

中级会员

积分
236
发表于 2024-6-9 19:19:37 | 显示全部楼层
so*** 发表于 2024-6-9 17:58
范例中这个问题我也碰到过,就只有这个范例是CKSEL,且头文件是独立于keil目录下,我查看了其他范例全都 ...

您也改外部晶振了?请问怎么改的?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6845

积分

论坛元老

积分
6845
发表于 2024-6-11 11:26:41 | 显示全部楼层
你用什么方式读取CKSEL内容的?
我用串口打印CKSEL,切换主频后是可以打印出CKSEL值产生变化的。
此外可以用主频分频输出方式进行验证,例如晶振22.1184M,烧录是IRC频率设置11.0592M,用示波器测量输出脚信号就可以判断主频是22.1184M还是11.0592M。
截图202406111106049637.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-03-30 20:18:10

11

主题

45

回帖

236

积分

中级会员

积分
236
发表于 2024-6-11 13:17:23 | 显示全部楼层
乘风*** 发表于 2024-6-11 11:26
你用什么方式读取CKSEL内容的?
我用串口打印CKSEL,切换主频后是可以打印出CKSEL值产生变化的。
此外可以 ...

我是用串口打印的CKSEL,跟您的方法一样。这个不会有问题的
因为我用的是一箭双雕的程序,我猜您用的应该不是这个程序。这个的IRC的频率会自动调整和设置。所以我不知道IRC自动调整时,哪里会修改CKSEL(我搜索不到哪里有修改)。甚至我把自动调整主频的部分屏蔽掉都不行,还是会修改CKSEL
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1901

回帖

5220

积分

论坛元老

积分
5220
发表于 2024-6-11 14:54:40 | 显示全部楼层
改外部晶振,我用的那段代码跟你差不多,只是我没有分频( CLKDIV = 0x00;)。
我没有读取CKSEL,但感觉外部晶振能正常启动,找个时间也读取一下CKSEL看看。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 07:41 , Processed in 0.145209 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表