nrf5 16.0.0 mdk的几个问题

1 篇文章 0 订阅
1 篇文章 0 订阅

最近有一个小项目,需要使用nrf52832.几个月前用的15.3版本,不想昨天下载新的sdk的时候已经是16.0.0.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

问题1

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这次试用有几个问题。第一是Devicefamily原先的工程默认试用的是8.27.0版本,实际上keil的pack里面最新的是8.24.1版本。

此外,之前的软件默认试用cmisis的core。而这个cmsis的版本是4.5.0.事实上,目前cmsis的版本早已升级到了5.6.0,里面包含的core版本是5.3.0.

因此需要解决这个问题。

怎么办呐?下图这两个图标很重要。

第二个图标是select software packs,第一个图标是manage runtime evrionment。简单的来说就是第二个图标负责选择本工程(project)下试用那些包(packs);而第一个图标则是选择试用刚才列举的包(packs)中那些运行环境。每个包里面可能包含多个运行环境,你可以理解为每个包有多个子包。呐cmsis来说,cmsis-core就是cmsis的子包。

好了,那怎么修改呐?

首先重新选择最新的packs来分别替换老的cmsis和nRF_DeviceFamilyPack。

再这一步会出现零一个对话框提示你core和device的Startup的选择有问题。在这个对话框将这两项的对勾去掉(uncheck)。

然后按第一个按钮,在新的包中选择刚才uncheck的两项就可以了。

此时就解决了问题。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

问题2

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

另外一个可能的问题是找不到cmsis_cm4.h,这个也很好办。搜一下这个文件在sdk lib的那个部分,然后添加一下路径就ok了。

我的相对路径设置如下:..\..\..\..\..\..\components\toolchain\cmsis\include

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

问题3

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

第三个问题就是SDK的结构问题。

HAL我们一般是指Hardware Abstract Layer,硬件抽象层。但是在nRF5的库中HAL确实Hardware Access Layer硬件访问层

这两个意思区别就大了。STM32的HAL层是指用户直接调用的层,所以叫硬件抽象层。而它使用LL层(Low Layer)表示与硬件寄存器直接打交道的层。而nRF5 SDK中HAL是硬件访问层,意思就直接访问硬件底层寄存器的层。(等同于STM32中的LL层)

而nRF5 SDK的HAL上面一层叫做DRV层(The Driver Layer)。用户一般直接操作这一层。这一层实际等同于对底层封装一下更方便用户使用。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

问题4

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

nrfx是啥?

SDK的迁移文档中可以大致看到nrfx的含义。因为版本迁移,需要一个新的明明空间,所以引入了nrfx。

那么之前的就叫做The Legacy Layer,这个倒是容易理解。另外这些api后续版本可能会废弃。所以官方建议迁移到nrfx。

但是nrfx文档中说默认是不启用的,需要迁移:

The migration process depends on your application and the SDK version:

  • For new applications, consider to use the new nrfx API. 建议新的应用直接使用nrfx
  • For existing applications, make sure you do the following, in any order: 对于使用老的api的应用,需要做下面事情
    • rename used functions and types from nrf_drv_* to nrfx_*, 需要将函数和类型重命名为nrfx_(从nrf_drv_)
    • rename used macros from NRF_DRV_* to NRFX_*,  需要重命名宏从NRF_DRV_到NRFX_
    • [SDK v15.0.0] remove the old configuration entries related to the nrf_drv_* drivers from your sdk_config.h file,  [对于v15.0.0] 需要从sdk_config.h头文件中移除和nrf_drv_*相关的老的配置接口
    • [SDK v14.2.0 and older] replace the old configuration options contained in your sdk_config.h with their new versions by adding the NRFX_ prefix to their names.  [对于v14.2.0和之前版本] 需要替换sdk_config.h中老的属性的前缀为NRFX_

目前是v16.0.0.比较了两者的sdk,变化似乎不大。要求应该也一致。另外大部分示例从表面看似乎还是nrf_drv_开头,但是其实在对应模块的头文件里面已经强制转化为了nrfx_。如下:

 

nrfx定义

也就是说对于普通用户nrf_drv_就已经是nrfx_了。也就是不需要自己再强制迁移。但没有看到官方关于这部分的说明。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

问题5

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在工程的preprocessor Definitions里面经常可以看到NRF52_PAN_##(例如NRF52_PAN_74).但是在代码中却找不到相关的字段。

至今没找到官方关于NRF52_PAN_##的描述。但在官方论坛的确见到一些似乎靠谱的说法:PAN= Product ANomaly

翻译过来就是产品异常。而这个产品异常能够在官方的errata找到。尚不知道这一字段为何会被代码使用。对工程进行全盘搜索找不到NRF52_PAN_的宏定义或者其它东西。

这里提供一下:NRF528342的ERRATA RV2版本

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

问题6

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这个问题在使用最新的DeviceFamilyPack8.29.0之后出现的。会在编译的时候报一个错误,错误出现在nrf52832_erratas.h文件开头。

 

原因是__UNUSED找不到定义。出现这个错误的原因是compiler_abstraction.h和sdk的modules\nrfx\mdk目录下的同名文件冲突。而这个文件里面没有定义__UNUSED。可以通过删除MDK的索引目录:..\..\..\..\..\..\modules\nrfx\mdk

初次之外,这个头文件还会报106个错误。原因是头文件编写语法的问题。类似如下:

            switch(var)
            {
                case 0x03ul:
                    return true;
                case 0x04ul:
                    return false;
                case 0x05ul:
                    return false;
                case 0x06ul:
                    return false;
                default:
                    return false;
                break;

            }

break永远也到达不了。可以不修改,不影响语法功能。

考虑到keil经常遇到这种问题,可考虑使用SES(Segger Embedded Studio)开发NRF52。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

问题7

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

sdk的__WFE(),__SEV(),__WFI()等多个指令。这些指令的含义初看让人费解?

sdk中使用__ASM volatile("...")来调用ARM内核支持的几个汇编指令:wfi,wfe,sev等。这些指令实现了对事件、中断的等待和,事件的发送等。

 

 

【有问题请在下面留言 】

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值