众所周知,基本上所有嵌入式入门的第一课都是跟灯有关,什么跑马灯、流水灯、点天灯等等.然而,在笔者看来第一课应该跟互联网的第一课一样,向世人宣布我来了,即Hello World.因此,红旭的Nordic 52840第一课也是一样.
在准备开始Hello World之前,我们还必须要有一个Nordic 52840的模板工程,这样我们才可以在工程模版的基础上进行以后一序列地开发.基本上,所有的模板工程就跟嵌入式硬件的最小系统一样,只保留最基本的配置文件,里面什么内容都没有,只有一个入口函数main(),至于如何在官方的SDK开发包裁剪出工程模板,这里不表.已经裁剪好的工程模版在这里(请点我).
有了工程模版之后,那么接下来进行我们今天的主题,即打印输出Hello World.那么通过什么方式打印呢?可以通过以下两种方式:
这个就是我们平常口中所说的串口,我们可以通过串口可以打印输出"Hello World"字符串.在此之前,我们看一下红旭无线开发板上USB转TTL所连接的是Nordic 52840的哪两个串口脚**.(注意:除了电源、地、烧录口以及USB接口之外,任意GPIO口均可以做为串口脚)**
实物接线示意图如下所示:
下图与上图的PIN脚分别是一一对应的
从上面两幅图可以看出,只需要将 USB_T & NRF52_R,USB_R & NRF52_T两两通过跳帽连接在一起即可.
我们在模板工程的基础上,添加驱动串口的相关函数.因为模板工程是纯净的,只有维持最小系统所需的一些文件.那么如何来操作呢?如下步骤所示:
上图就是要实现这次串口打印所需要的UART驱动函数,可能会问怎么需要这么多文件,因为这些文件集成了UART重映射以及接下来的RTT等功能,异常的强大.
同样,需要添加的头文件路径也有很多.那是因为官方的SDK将各个功能模块分得很细,不像我们自己写的程序一样所有的文件都放在一个文件夹,所以这个包含的头文件会很多.那么,这个时候问题来了?在SES上是如何添加头文件路径的呢?对于用惯了MDK以及IAR的工程师来说,肯定会一脸懵逼.不过幸好你们买了红旭的无线开发板,对于这些细活,肯定有详细的步骤告诉你的,如下所示:
在SES的项目浏览中选中整个工程并右击
->Edit Options…
->Common
->Build
->Project Macros
在打开Project Macros的设置中,添加SDK开发包的路径宏(小编的SDK包实际路径如下所示);
nRF52840_SDK_DIR=D:/Project/wireless_tech/wireless_tech_template
在SES的项目浏览中选中整个工程并右击
->Edit Options…
->Common
->Preprocessor
->User Include Directories
在User Include Directories添加头文件路径;
$(nRF52840_SDK_DIR)/components/toolchain/cmsis/include
$(nRF52840_SDK_DIR)/components/libraries/experimental_log
$(nRF52840_SDK_DIR)/components/libraries/util
$(nRF52840_SDK_DIR)/template_project/config
$(nRF52840_SDK_DIR)/modules/nrfx/mdk
$(nRF52840_SDK_DIR)/components/softdevice/s140/headers
$(nRF52840_SDK_DIR)/components/libraries/experimental_section_vars
$(nRF52840_SDK_DIR)/components/libraries/strerror
$(nRF52840_SDK_DIR)/components/libraries/experimental_log/src
$(nRF52840_SDK_DIR)/components/libraries/experimental_memobj
$(nRF52840_SDK_DIR)\components\libraries\balloc
$(nRF52840_SDK_DIR)\template_project\user_driver\include
$(nRF52840_SDK_DIR)\external\fprintf
$(nRF52840_SDK_DIR)\integration\nrfx\legacy
$(nRF52840_SDK_DIR)\modules\nrfx
$(nRF52840_SDK_DIR)\integration\nrfx
$(nRF52840_SDK_DIR)\modules\nrfx\drivers\include
$(nRF52840_SDK_DIR)\components\libraries\atomic
$(nRF52840_SDK_DIR)\components\libraries\delay
$(nRF52840_SDK_DIR)\external\segger_rtt
在sdk_config.h中找到NRF_LOG_BACKEND_UART_ENABLED、NRF_LOG_BACKEND_UART_TX_PIN以及NRF_LOG_BACKEND_RTT_ENABLED,并更改为以下所显示的值.
#ifndef NRF_LOG_BACKEND_RTT_ENABLED
#define NRF_LOG_BACKEND_RTT_ENABLED 0
#endif
#ifndef NRF_LOG_BACKEND_UART_ENABLED
#define NRF_LOG_BACKEND_UART_ENABLED 1
#endif
#ifndef NRF_LOG_BACKEND_UART_TX_PIN
#define NRF_LOG_BACKEND_UART_TX_PIN 8
#endif
#ifndef NRF_LOG_DEFERRED
#define NRF_LOG_DEFERRED 0
#endif
至此,就完成了UART函数以及头文件路径地添加,接下来要做的事情就是在main函数调用初始化函数和打印输出函数,最后编译下载即可.
RTT全称是 “Real Time Transfer”,是SEGGER公司发明的基于Jlink的一门新技术,如果想要更加了解RTT请点击如下链接:
RTT更多详情.
要实现RTT的功能,其实只有手上有Jlink即可实现这个功能,并不用再需要额外的一些外设硬件来搭配使用.你只需要将Jlink的SWD引脚分别一一对应接到目标设备的SWD接口即可,它比UART的好处就是不占用硬件设备的UART外设.
其实这里所要做的事情跟UART中的基本一致.只需要将RTT的使能宏打开并关闭UART的使能宏即可.
#ifndef NRF_LOG_BACKEND_RTT_ENABLED
#define NRF_LOG_BACKEND_RTT_ENABLED 1
#endif
#ifndef NRF_LOG_BACKEND_UART_ENABLED
#define NRF_LOG_BACKEND_UART_ENABLED 0
#endif
#ifndef NRF_LOG_DEFERRED
#define NRF_LOG_DEFERRED 0
#endif
至此就完成了RTT的配置工作了,接下来要做的事情就是在main函数调用初始化函数和打印输出函数,最后编译下载即可.
上面已经完成了大部分的工作,这里只要在main函数,调用以下几个函数即可.
/**
* Copyright (c) 2014 - 2018, Nordic Semiconductor ASA
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form, except as embedded into a Nordic
* Semiconductor ASA integrated circuit in a product or a software update for
* such product, must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* 4. This software, with or without modification, must only be used with a
* Nordic Semiconductor ASA integrated circuit.
*
* 5. Any software provided in binary form under this license must not be reverse
* engineered, decompiled, modified and/or disassembled.
*
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
/* =================================================================================
由于是在官方的基础上更改,故上面的说明不敢更改,从而保持下来
=================================================================================*/
/**
* @file main.c
* @brief 用户应用程序入口
* @details 用户应用程序的入口文件,用户所有要实现的功能逻辑均是从该文件开始或者处理
* @author Helon_Chan
* @par Copyright (c):
* 红旭无线开发团队
* @par History:
* Ver0.0.1:
Helon_Chan, 2018/06/09, 初始化版本\n
*/
/* =============
头文件包含
=============*/
#include
#include
#include
#include "user_log.h"
/**
* 应用程序的函数入口
* @param[in] NULL
* @retval NULL
* @par 修改日志
* Ver0.0.1:
Helon_Chan, 2018/06/09, 初始化版本\n
*/
int main(void)
{
/* log函数初始化 */
log_init();
NRF_LOG_INFO("/******************************************************************************/\n");
NRF_LOG_INFO(" Welcome to wireless-tech world \n");
NRF_LOG_INFO(" website :bbs.wireless-tech.cn \n");
NRF_LOG_INFO(" QQ Group:671139854 \n");
NRF_LOG_INFO("/******************************************************************************/\n");
}
历经千辛万苦最终来到观看结果的这一环节了,很快大家就会看到打印信息了.但是,在此之前我们还需要做最后一个设置.即配置协议栈的路径.如下所示:
在SES的项目浏览中选中整个工程并右击
->Edit Options…
->Common
->Debug
->Loader
->Additional Load File[0]
,在打开的设置中添加协议的绝对路径(以下是小编的协议栈实际路径).
D:/Project/wireless_tech/wireless_tech_template/components/softdevice/s140/hex/s140_nrf52_6.0.0_softdevice.hex
小编是使用 SecureCRT来显示串口打印,至于如何设置以及下载SecureCRT,我们这里不表.不废话直接看效果.
RTT的效果查看,相对于UART来说会麻烦一些.但是也只是首次要配置下,以后直接用即可.步骤如下所示:
文件
->快速连接
->选择协议
->IP地址
->端口号
->点连接
该教程对应的源码,放在红旭无线开发板的github代码仓,热烈欢迎各行业大佬斧正,鄙人虚心接受任何批评以及赞扬.
红旭无线Github
红旭无线技术交流论坛
本文原创,转载请注明出处