先开IDE,打开Hello World的示例工程.在我这边是选nrf52840的DK板.
先按F7编译一遍,编译完成后,在刚刚打开项目的那个窗口上指定的Build Directory目录就会被创建.在build_nrf52840dk_nrf52840\zephyr\这个文件夹里会有一个zephyr.dts文件.
这个zephyr.dts文件是这个项目编译时生成的这个项目的设备树文件.目前我们主要关心的是他的上游,这个文件是由一个板子名称命名的.dts文件和一个由我们自己创建的板子命名的.overlay文件共同决定的.类似下图.
因为我用的不是nrf52840的官方DK板子,这个hello world程序又用到了串口,我的板子的串口与官方DK板的IO口不一样,所以需要改一下最终zephyr.dts里生成的串口IO定义.
顺便一提,查看dts文件,目前我的方法是在vscode里有一个叫DeviceTree for the Zephyr Project的插件(试过那个DeviceTree插件了,就是个简单的高亮而已).
安装完插件后打开dts文件后可以在编辑区域上方有个简单的节点导航,比如说我要改的串口0就在/soc/uart,别名是uart0.
设备树的文本格式可以参考这篇博客文章:
https://blog.csdn.net/dzw19911024/article/details/82115101
要改的是tx-pin跟rx-pin.那么,在项目目录建一个对应板子名字的overlay文件.
然后里面内容改为这样(修改了uart0的tx rx引脚):
然后保存文件.这个时候IDE里是没有这个文件overlay文件的.类似这样:
我们需要重新cmake一下,在菜单栏的Project里有一个Run Cmake,点一下.会弹个窗,转个等待的动画,然后结束后.就可以看到文件已经在dts files里了.
然后再重新编译,再去看zephyr.dts里关于uart0的内容.其中tx rx pin的部分就会被覆盖.说明修改完成.
然后是设置板子的时钟,官方的52840DK板上有32k外部晶振,我的板子上没有,所以需要配置一下使用内部32k RC.这部分配置是由Kconfig管的,类似于之前老SDK的sdk_config.h文件,Kconfig的机制跟上面的DeviceTree挺像,先发个图出来.
图上的Kconfig可以理解为是整个SDK中各种配置的一个默认配置文件,每个工程最终用到的是autoconf.h文件,而autoconf.h文件又是由.conf生成的,但是.conf文件又是取决于Kconfig的内容与prj.conf的内容.这里的prj.conf就有点类似上面的那个overlay,也是每个项目有个自己的,可以去替换覆盖Kconfig里的默认设置,只针对本项目.
现在开始把配置改成内部32k RC.
首先在IDE的菜单栏project里的configure nRF Connect SDK Project,打开后会弹出一个对话框.我要改32k时钟的部分,就在右上角的Filter里搜索"32k"
看红框中灰色字体中显示的这个配置文件的目录,在drivers/clock_control/Kconfig.nrf里.然后我们找到那个文件.
然后打开他,在上面那个窗口灰色字体提示的那几行可以看到这些内容.
看上去我们只需要让CLOCK_CONTROL_NRF_K32SRC_XTAL关掉并让CLOCK_CONTROL_NRF_K32SRC_RC打开就可以了.现在修改prj.conf,在工程目录下,将其内容替换为如下:
然后先看下目前.config里的这两个设置是这样的.
然后我们再在IDE里重新cmake一下.(菜单栏的Project里有一个Run Cmake,点一下.会弹个窗,转个等待的动画,然后等结束就可以了).然后重新看.config文件,就已经修改过来了.
build一下,菜单栏的Target里Conenct J-link后再Download Zephyr/Zephyr.elf就可以观察到现象了.
Comments | 4 条评论
博主 jia
作者你好,请问一下,MCUboot的32k晶振是否也可以配置成外部晶振呢
博主 AAC
@jia 你好,正常的MCUboot的DFU示例工程用的就是外部32k晶振,如果你说的是如何让MCUboot用内部低速RC时钟的话,直接按博文上的在prj.conf里增加CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=n
CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y即可,我这边在NRF52840开发板上验证过了.
博主 F._
作者你好,我发现XTAL=n RC=y 可以正常运行hello word
而XTAL=y RC=n 就没有输出。
难道亿百特的52840没有外部晶振只有内部RC?或者是我的晶振坏了?
因为2.4G的gazell demo应该是依赖XTAL来发射的,所以仅仅RC无法满足我的要求。
博主 AAC
@F._ 我这边是用nordic官方的DK板子去测是OK的,我不太清楚亿佰特的模组内部的情况,如果需要验证的话你可以用NRF52 SDK去测一下,我记得如果没有晶振的话NRF52 SDK在初始化时钟的时候会有报错.另外可以量一下32K引脚是否有输出(如果模块有封装出来的话).