Setting up console over SWD interface

Hello,

I am trying to compile a basic Hello World application for a custom PCB with a nRF52832 microcontroller. I am using VS Code and the nRF Connect SDK. I have completed the nRF Connect SDK Fundamentals course and received the certificate, and now I am trying to apply those lessons to my custom hardware.

My goal is to compile a Hello World example and see the message printed on the VS Code console. My custom hardware does not have a UART connection broken out. I am programming my custom hardware over SWD via a nRF52-DK PCA10040 board. I would like to receive logging messages over SWD as well.

When I connect a TagConnect cable to the P19 Debug Out connector and mate it with my custom board, I can see the Connected Devices tab update from NRF52832_xxAA_REV2 to NRF52832_xxAB_REV2, so I am fairly sure that I am programming my custom board and not the DK itself. 

Initially, I tried a simple printk statement, which builds and runs, but no messages are received in the terminal. After some digging in the Nordic forums, I realized that I want to use the SWD interface for console output, instead of a UART. So, I enabled logging as explained in the Fundamentals course Lesson 4 Exercise 2. I also tried changing my prj.conf to disable the UART console and enable the RTT_CONSOLE instead.

This builds and flashes without issue, but I am still not getting any of my debug messages.

How can I properly set up the SWD interface for Hello world, printk, and logging messages on a custom PCB?

main.c

/*
 * Copyright (c) 2012-2014 Wind River Systems, Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>


LOG_MODULE_REGISTER(NixieLogs,LOG_LEVEL_DBG);

int main(void)
{
	while(true){
		printk("Hello World! %s\n", CONFIG_BOARD);
		LOG_INF("nRF Connect SDK Fundamentals");
		LOG_DBG("A log message in debug level");
		LOG_WRN("A log message in warning level!");
		LOG_ERR("A log message in Error level!");
	}
	return 0;
}

prj.conf

# nothing here

CONFIG_LOG=y

CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
CONFIG_UART_CONSOLE=n

CMakeLists.txt

# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.20.0)
list(APPEND BOARD_ROOT ${CMAKE_CURRENT_SOURCE_DIR})

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(hello_world)

target_sources(app PRIVATE src/main.c)

Custom PCB board defconfig

# SPDX-License-Identifier: Apache-2.0

CONFIG_SOC_SERIES_NRF52X=y
CONFIG_SOC_NRF52832_QFAA=y
CONFIG_BOARD_NIXIE_CLOCK_BOARD=y

# Enable MPU
CONFIG_ARM_MPU=y

# Enable hardware stack protection
CONFIG_HW_STACK_PROTECTION=y

# Enable RTT
CONFIG_USE_SEGGER_RTT=y

# enable GPIO
CONFIG_GPIO=y

# enable uart driver
CONFIG_SERIAL=y

# enable console
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y

# additional board options
CONFIG_GPIO_AS_PINRESET=y

CONFIG_PINCTRL=y

Custom board DTS file

/*
 * Copyright (c) 2017 Shawn Nock <[email protected]>
 * Copyright (c) 2017 Linaro Limited
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/dts-v1/;
#include <nordic/nrf52832_qfaa.dtsi>
#include "nixie_clock_board-pinctrl.dtsi"

/ {
	model = "Chris Fernandez Nixie Clock Board";
	compatible = "chrisfernandez,nixie_clock_board";

	chosen {
		zephyr,console = &uart0;
		zephyr,shell-uart = &uart0;
		zephyr,uart-mcumgr = &uart0;
		zephyr,bt-mon-uart = &uart0;
		zephyr,bt-c2h-uart = &uart0;
		zephyr,sram = &sram0;
		zephyr,flash = &flash0;
		zephyr,code-partition = &slot0_partition;
	};

	leds {
		compatible = "gpio-leds";
		led0: led_0 {
			gpios = <&gpio0 17 GPIO_ACTIVE_LOW>;
			label = "Green LED 0";
		};
		led1: led_1 {
			gpios = <&gpio0 18 GPIO_ACTIVE_LOW>;
			label = "Green LED 1";
		};
		led2: led_2 {
			gpios = <&gpio0 19 GPIO_ACTIVE_LOW>;
			label = "Green LED 2";
		};
		led3: led_3 {
			gpios = <&gpio0 20 GPIO_ACTIVE_LOW>;
			label = "Green LED 3";
		};
	};

	pwmleds {
		compatible = "pwm-leds";
		pwm_led0: pwm_led_0 {
			pwms = <&pwm0 0 PWM_MSEC(20) PWM_POLARITY_INVERTED>;
		};
	};

	buttons {
		compatible = "gpio-keys";
		button0: button_0 {
			gpios = <&gpio0 13 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "Push button switch 0";
		};
		button1: button_1 {
			gpios = <&gpio0 14 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "Push button switch 1";
		};
		button2: button_2 {
			gpios = <&gpio0 15 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "Push button switch 2";
		};
		button3: button_3 {
			gpios = <&gpio0 16 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "Push button switch 3";
		};
	};

	arduino_header: connector {
		compatible = "arduino-header-r3";
		#gpio-cells = <2>;
		gpio-map-mask = <0xffffffff 0xffffffc0>;
		gpio-map-pass-thru = <0 0x3f>;
		gpio-map = <0 0 &gpio0 3 0>,	/* A0 */
			   <1 0 &gpio0 4 0>,	/* A1 */
			   <2 0 &gpio0 28 0>,	/* A2 */
			   <3 0 &gpio0 29 0>,	/* A3 */
			   <4 0 &gpio0 30 0>,	/* A4 */
			   <5 0 &gpio0 31 0>,	/* A5 */
			   <6 0 &gpio0 11 0>,	/* D0 */
			   <7 0 &gpio0 12 0>,	/* D1 */
			   <8 0 &gpio0 13 0>,	/* D2 */
			   <9 0 &gpio0 14 0>,	/* D3 */
			   <10 0 &gpio0 15 0>,	/* D4 */
			   <11 0 &gpio0 16 0>,	/* D5 */
			   <12 0 &gpio0 17 0>,	/* D6 */
			   <13 0 &gpio0 18 0>,	/* D7 */
			   <14 0 &gpio0 19 0>,	/* D8 */
			   <15 0 &gpio0 20 0>,	/* D9 */
			   <16 0 &gpio0 22 0>,	/* D10 */
			   <17 0 &gpio0 23 0>,	/* D11 */
			   <18 0 &gpio0 24 0>,	/* D12 */
			   <19 0 &gpio0 25 0>,	/* D13 */
			   <20 0 &gpio0 26 0>,	/* D14 */
			   <21 0 &gpio0 27 0>;	/* D15 */
	};

	arduino_adc: analog-connector {
		compatible = "arduino,uno-adc";
		#io-channel-cells = <1>;
		io-channel-map = <0 &adc 1>,	/* A0 = P0.3 = AIN1 */
				 <1 &adc 2>,	/* A1 = P0.4 = AIN2 */
				 <2 &adc 4>,	/* A2 = P0.28 = AIN4 */
				 <3 &adc 5>,	/* A3 = P0.29 = AIN5 */
				 <4 &adc 6>,	/* A4 = P0.30 = AIN6 */
				 <5 &adc 7>;	/* A5 = P0.31 = AIN7 */
	};

	/* These aliases are provided for compatibility with samples */
	aliases {
		led0 = &led0;
		led1 = &led1;
		led2 = &led2;
		led3 = &led3;
		pwm-led0 = &pwm_led0;
		sw0 = &button0;
		sw1 = &button1;
		sw2 = &button2;
		sw3 = &button3;
		bootloader-led0 = &led0;
		mcuboot-button0 = &button0;
		mcuboot-led0 = &led0;
		watchdog0 = &wdt0;
	};
};

&adc {
	status = "okay";
};

&gpiote {
	status = "okay";
};

&gpio0 {
	status = "okay";
};

arduino_serial: &uart0 {
	status = "okay";
	compatible = "nordic,nrf-uarte";
	current-speed = <115200>;
	pinctrl-0 = <&uart0_default>;
	pinctrl-1 = <&uart0_sleep>;
	pinctrl-names = "default", "sleep";
};

arduino_i2c: &i2c0 {
	compatible = "nordic,nrf-twi";
	status = "okay";
	pinctrl-0 = <&i2c0_default>;
	pinctrl-1 = <&i2c0_sleep>;
	pinctrl-names = "default", "sleep";
};

&i2c1 {
	compatible = "nordic,nrf-twi";
	/* Cannot be used together with spi1. */
	/* status = "okay"; */
	pinctrl-0 = <&i2c1_default>;
	pinctrl-1 = <&i2c1_sleep>;
	pinctrl-names = "default", "sleep";
};

&pwm0 {
	status = "okay";
	pinctrl-0 = <&pwm0_default>;
	pinctrl-1 = <&pwm0_sleep>;
	pinctrl-names = "default", "sleep";
};

&spi0 {
	compatible = "nordic,nrf-spi";
	/* Cannot be used together with i2c0. */
	/* status = "okay"; */
	pinctrl-0 = <&spi0_default>;
	pinctrl-1 = <&spi0_sleep>;
	pinctrl-names = "default", "sleep";
};

&spi1 {
	compatible = "nordic,nrf-spi";
	status = "okay";
	pinctrl-0 = <&spi1_default>;
	pinctrl-1 = <&spi1_sleep>;
	pinctrl-names = "default", "sleep";
};

arduino_spi: &spi2 {
	compatible = "nordic,nrf-spi";
	status = "okay";
	cs-gpios = <&arduino_header 16 GPIO_ACTIVE_LOW>; /* D10 */
	pinctrl-0 = <&spi2_default>;
	pinctrl-1 = <&spi2_sleep>;
	pinctrl-names = "default", "sleep";
};

&flash0 {

	partitions {
		compatible = "fixed-partitions";
		#address-cells = <1>;
		#size-cells = <1>;

		boot_partition: partition@0 {
			label = "mcuboot";
			reg = <0x00000000 0xc000>;
		};
		slot0_partition: partition@c000 {
			label = "image-0";
			reg = <0x0000C000 0x37000>;
		};
		slot1_partition: partition@43000 {
			label = "image-1";
			reg = <0x00043000 0x37000>;
		};
		storage_partition: partition@7a000 {
			label = "storage";
			reg = <0x0007a000 0x00006000>;
		};
	};
};

Custom PCB board.cmake

# SPDX-License-Identifier: Apache-2.0

board_runner_args(jlink "--device=nRF52832_xxAA" "--speed=4000")
board_runner_args(pyocd "--target=nrf52832" "--frequency=4000000")
set(OPENOCD_NRF5_SUBFAMILY "nrf52")
include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake)
include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake)
include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)
include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake)
include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake)

Parents
  • Hello,

    If I understand correctly, you want to see the print and log output only on the RTT logger not on serial terminal. 

    You have disabled UART in config file using this CONFIG_UART_CONSOLE=n but you have enabled this again on-board config file.

    Try this:
    In prj.conf file, add this 
    CONFIG_LOG=y
    CONFIG_LOG_PRINTK = y
    In the board config file, you can write this:
    # SPDX-License-Identifier: Apache-2.0
    
    CONFIG_SOC_SERIES_NRF52X=y
    CONFIG_SOC_NRF52832_QFAA=y
    (your board file config)
    
    # Enable MPU
    CONFIG_ARM_MPU=y
    
    # Enable hardware stack protection
    CONFIG_HW_STACK_PROTECTION=y
    
    # Enable RTT
    CONFIG_USE_SEGGER_RTT=y
    
    # enable GPIO
    CONFIG_GPIO=y
    
    # enable uart driver
    CONFIG_SERIAL=y
    
    # enable console
    CONFIG_CONSOLE=y
    CONFIG_UART_CONSOLE=n
    
    # additional board options
    CONFIG_GPIO_AS_PINRESET=y
    
    CONFIG_PINCTRL=y
    
    Try this and let me know if it works.
    Thanks.
    BR
    kazi
     
  • Hi Kazi, thanks for the response. 

    I have made your recommended changes. The application builds and installs, but I am still not seeing any of my debug message output on the terminal. I have checked VCOM0 (set to /dev/ttyACM0 at 115200, 8n1, rtscts:off) and the RTT connected device (unsure if RTT is the right device to check?)

    Do you have any suggestions for what else could be wrong? To be clear, I am setting up a custom board in VS Code for the first time, so it's possible that I have other errors elsewhere. I am not sure where to check, but I am happy to share any other files that could be useful in debugging.

  • Hello, 

    RTT is the right device to connect as you set this to see the output message on that terminal and unset the UART terminal. 

    ''The application builds and installs, but I am still not seeing any of my debug message output on the terminal.''

    Can I look at the error log?

  • Hi Kazi,

    I am not seeing any errors during the build or run steps. I'm just not receiving any of my debugging log messages.

     Here is the build output:

    Building hello_world
    /bin/sh -c west build --build-dir /media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/build /media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world
    
    ninja: no work to do.
     *  Terminal will be reused by tasks, press any key to close it. 
    
     *  Executing task: nRF Connect: Build [pristine]: hello_world/build (active) 
    
    Building hello_world
    /bin/sh -c west build --build-dir /media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/build /media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world --pristine --board nixie_clock_board --no-sysbuild -- -DNCS_TOOLCHAIN_VERSION:STRING="NONE" -DBOARD_ROOT:STRING="/media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world" -DCONF_FILE:STRING="/media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/prj.conf"
    
    -- west build: generating a build system
    Loading Zephyr default modules (Zephyr base).
    -- Application: /media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world
    -- CMake version: 3.20.5
    -- Found Python3: /home/chris/ncs/toolchains/1f9b40e71a/usr/local/bin/python3.8 (found suitable exact version "3.8.2") found components: Interpreter 
    -- Cache files will be written to: /home/chris/.cache/zephyr
    -- Zephyr version: 3.4.99 (/home/chris/ncs/zephyr)
    -- Found west (found suitable version "1.0.0", minimum required is "0.14.0")
    -- Board: nixie_clock_board
    -- Found host-tools: zephyr 0.16.0 (/home/chris/ncs/toolchains/1f9b40e71a/opt/zephyr-sdk)
    -- Found toolchain: zephyr 0.16.0 (/home/chris/ncs/toolchains/1f9b40e71a/opt/zephyr-sdk)
    -- Found Dtc: /home/chris/ncs/toolchains/1f9b40e71a/usr/bin/dtc (found suitable version "1.4.7", minimum required is "1.4.6") 
    -- Found BOARD.dts: /media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/boards/arm/nixie_clock_board/nixie_clock_board.dts
    -- Generated zephyr.dts: /media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/build/zephyr/zephyr.dts
    -- Generated devicetree_generated.h: /media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/build/zephyr/include/generated/devicetree_generated.h
    -- Including generated dts.cmake file: /media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/build/zephyr/dts.cmake
    Parsing /home/chris/ncs/zephyr/Kconfig
    Loaded configuration '/media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/boards/arm/nixie_clock_board/nixie_clock_board_defconfig'
    Merged configuration '/media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/prj.conf'
    Configuration saved to '/media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/build/zephyr/.config'
    Kconfig header saved to '/media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/build/zephyr/include/generated/autoconf.h'
    -- Found GnuLd: /home/chris/ncs/toolchains/1f9b40e71a/opt/zephyr-sdk/arm-zephyr-eabi/bin/../lib/gcc/arm-zephyr-eabi/12.2.0/../../../../arm-zephyr-eabi/bin/ld.bfd (found version "2.38") 
    -- The C compiler identification is GNU 12.2.0
    -- The CXX compiler identification is GNU 12.2.0
    -- The ASM compiler identification is GNU
    -- Found assembler: /home/chris/ncs/toolchains/1f9b40e71a/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gcc
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /media/chris/Data/Documents/Projects/Nixie_clock/repos/nixie_clock_firmware/hello_world/build
    -- west build: building application
    [1/173] Preparing syscall dependency handling
    
    [2/173] Generating ../../zephyr/include/generated/ncs_version.h
    [3/173] Generating include/generated/version.h
    -- Zephyr version: 3.4.99 (/home/chris/ncs/zephyr), build: v3.3.99-ncs1-2977-gb9253f60e83c
    [4/173] Generating misc/generated/syscalls_subdirs.trigger
    [5/173] Generating misc/generated/syscalls.json, misc/generated/struct_tags.json
    [6/173] Generating include/generated/kobj-types-enum.h, include/generated/otype-to-str.h, include/generated/otype-to-size.h
    [7/173] Generating include/generated/driver-validation.h
    [8/173] Generating include/generated/syscall_dispatch.c, include/generated/syscall_list.h
    [9/173] Building C object zephyr/CMakeFiles/offsets.dir/arch/arm/core/offsets/offsets.c.obj
    [10/173] Generating include/generated/offsets.h
    [11/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/dec.c.obj
    [12/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/hex.c.obj
    [13/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/timeutil.c.obj
    [14/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/rb.c.obj
    [15/173] Building C object CMakeFiles/app.dir/src/main.c.obj
    [16/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/cbprintf_packaged.c.obj
    [17/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/fdtable.c.obj
    [18/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/sem.c.obj
    [19/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/thread_entry.c.obj
    [20/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/heap.c.obj
    [21/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/multi_heap.c.obj
    [22/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/printk.c.obj
    [23/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/heap-validate.c.obj
    [24/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/bitarray.c.obj
    [25/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/onoff.c.obj
    [26/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/crc32c_sw.c.obj
    [27/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/crc32_sw.c.obj
    [28/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/crc16_sw.c.obj
    [29/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/notify.c.obj
    [30/173] Linking C static library app/libapp.a
    [31/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/crc8_sw.c.obj
    [32/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/crc7_sw.c.obj
    [33/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/cbprintf_complete.c.obj
    [34/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/cbprintf.c.obj
    [35/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/assert.c.obj
    [36/173] Building C object zephyr/CMakeFiles/zephyr.dir/misc/generated/configs.c.obj
    [37/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/mpsc_pbuf.c.obj
    [38/173] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/reboot.c.obj
    [39/173] Building ASM object zephyr/CMakeFiles/zephyr.dir/soc/arm/nordic_nrf/common/soc_nrf_common.S.obj
    [40/173] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/logging/log_cache.c.obj
    [41/173] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/logging/log_core.c.obj
    [42/173] Building C object zephyr/CMakeFiles/zephyr.dir/soc/arm/nordic_nrf/validate_enabled_instances.c.obj
    [43/173] Building C object zephyr/CMakeFiles/zephyr.dir/soc/arm/nordic_nrf/validate_base_addresses.c.obj
    [44/173] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/tracing/tracing_none.c.obj
    [45/173] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/logging/log_mgmt.c.obj
    [46/173] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/logging/log_msg.c.obj
    [47/173] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/logging/log_output.c.obj
    [48/173] Building ASM object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/cpu_idle.S.obj
    [49/173] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/logging/backends/log_backend_rtt.c.obj
    [50/173] Building C object zephyr/soc/arm/nordic_nrf/nrf52/CMakeFiles/soc__arm__nordic_nrf__nrf52.dir/soc.c.obj
    [51/173] Building C object zephyr/arch/common/CMakeFiles/arch__common.dir/sw_isr_common.c.obj
    [52/173] Building C object zephyr/arch/common/CMakeFiles/isr_tables.dir/isr_tables.c.obj
    [53/173] Building ASM object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/nmi_on_reset.S.obj
    [54/173] Generating linker_zephyr_pre0.cmd
    [55/173] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/fatal.c.obj
    [56/173] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/irq_manage.c.obj
    [57/173] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/nmi.c.obj
    [58/173] Generating linker_zephyr_pre1.cmd
    [59/173] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/swap.c.obj
    [60/173] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/thread.c.obj
    [61/173] Building ASM object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/reset.S.obj
    [62/173] Building ASM object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/fault_s.S.obj
    [63/173] Linking C static library zephyr/arch/common/libisr_tables.a
    [64/173] Building ASM object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/swap_helper.S.obj
    [65/173] Building ASM object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/isr_wrapper.S.obj
    [66/173] Building C object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/fault.c.obj
    [67/173] Building C object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/irq_init.c.obj
    [68/173] Building C object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/fpu.c.obj
    [69/173] Building ASM object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/vector_table.S.obj
    [70/173] Building ASM object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/exc_exit.S.obj
    [71/173] Building C object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/thread_abort.c.obj
    [72/173] Linking C static library zephyr/arch/common/libarch__common.a
    [73/173] Building C object zephyr/lib/libc/common/CMakeFiles/lib__libc__common.dir/source/string/strnlen.c.obj
    [74/173] Building C object zephyr/lib/libc/common/CMakeFiles/lib__libc__common.dir/source/stdlib/abort.c.obj
    [75/173] Building C object zephyr/soc/arm/common/cortex_m/CMakeFiles/soc__arm__common__cortex_m.dir/arm_mpu_regions.c.obj
    [76/173] Building C object zephyr/drivers/clock_control/CMakeFiles/drivers__clock_control.dir/clock_control_nrf.c.obj
    [77/173] Linking C static library zephyr/soc/arm/nordic_nrf/nrf52/libsoc__arm__nordic_nrf__nrf52.a
    [78/173] Generating ../../../include/generated/libc/minimal/strerror_table.h
    [79/173] Building C object zephyr/drivers/console/CMakeFiles/drivers__console.dir/rtt_console.c.obj
    [80/173] Building C object zephyr/drivers/pinctrl/CMakeFiles/drivers__pinctrl.dir/common.c.obj
    [81/173] Building C object zephyr/drivers/gpio/CMakeFiles/drivers__gpio.dir/gpio_nrfx.c.obj
    [82/173] Building C object zephyr/drivers/pinctrl/CMakeFiles/drivers__pinctrl.dir/pinctrl_nrf.c.obj
    [83/173] Building C object zephyr/CMakeFiles/zephyr_pre0.dir/misc/empty_file.c.obj
    [84/173] Linking C static library zephyr/soc/arm/common/cortex_m/libsoc__arm__common__cortex_m.a
    [85/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/atoi.c.obj
    [86/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/strtol.c.obj
    [87/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/strtoul.c.obj
    [88/173] Linking C static library zephyr/drivers/clock_control/libdrivers__clock_control.a
    [89/173] Building C object zephyr/drivers/serial/CMakeFiles/drivers__serial.dir/uart_nrfx_uarte.c.obj
    [90/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/strtoll.c.obj
    [91/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/strtoull.c.obj
    [92/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/bsearch.c.obj
    [93/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/qsort.c.obj
    [94/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/exit.c.obj
    [95/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/string/strncasecmp.c.obj
    [96/173] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/prep_c.c.obj
    [97/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/string/strstr.c.obj
    [98/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/string/string.c.obj
    [99/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/string/strspn.c.obj
    [100/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/math/sqrtf.c.obj
    [101/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdout/stdout_console.c.obj
    [102/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdout/sprintf.c.obj
    [103/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdout/fprintf.c.obj
    [104/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/math/sqrt.c.obj
    [105/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/time/gmtime.c.obj
    [106/173] Building C object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/scb.c.obj
    [107/173] Linking C static library zephyr/drivers/console/libdrivers__console.a
    [108/173] Linking C static library zephyr/libzephyr.a
    [109/173] Linking C static library zephyr/drivers/gpio/libdrivers__gpio.a
    [110/173] Linking C static library zephyr/drivers/pinctrl/libdrivers__pinctrl.a
    [111/173] Building C object zephyr/drivers/timer/CMakeFiles/drivers__timer.dir/nrf_rtc_timer.c.obj
    [112/173] Linking C static library zephyr/drivers/serial/libdrivers__serial.a
    [113/173] Building C object zephyr/drivers/timer/CMakeFiles/drivers__timer.dir/sys_clock_init.c.obj
    [114/173] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/home/chris/ncs/modules/hal/nordic/nrfx/mdk/system_nrf52.c.obj
    [115/173] Building C object zephyr/arch/arch/arm/core/aarch32/mpu/CMakeFiles/arch__arm__core__aarch32__mpu.dir/arm_core_mpu.c.obj
    [116/173] Building C object zephyr/lib/libc/common/CMakeFiles/lib__libc__common.dir/source/stdlib/malloc.c.obj
    [117/173] Linking C static library zephyr/arch/arch/arm/core/aarch32/libarch__arm__core__aarch32.a
    [118/173] Building C object modules/nrf/lib/fatal_error/CMakeFiles/..__nrf__lib__fatal_error.dir/fatal_error.c.obj
    [119/173] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/nrfx_glue.c.obj
    [120/173] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/home/chris/ncs/modules/hal/nordic/nrfx/helpers/nrfx_gppi_ppi.c.obj
    [121/173] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/home/chris/ncs/modules/hal/nordic/nrfx/helpers/nrfx_flag32_allocator.c.obj
    [122/173] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/home/chris/ncs/modules/hal/nordic/nrfx/drivers/src/nrfx_ppi.c.obj
    [123/173] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/home/chris/ncs/modules/hal/nordic/nrfx/drivers/src/nrfx_clock.c.obj
    [124/173] Linking C static library zephyr/drivers/timer/libdrivers__timer.a
    [125/173] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/home/chris/ncs/modules/hal/nordic/nrfx/drivers/src/nrfx_gpiote.c.obj
    [126/173] Building C object modules/segger/CMakeFiles/modules__segger.dir/home/chris/ncs/modules/debug/segger/SEGGER/SEGGER_RTT.c.obj
    [127/173] Building C object modules/segger/CMakeFiles/modules__segger.dir/SEGGER_RTT_zephyr.c.obj
    [128/173] Building C object zephyr/arch/arch/arm/core/aarch32/mpu/CMakeFiles/arch__arm__core__aarch32__mpu.dir/arm_mpu.c.obj
    [129/173] Linking C static library zephyr/lib/libc/common/liblib__libc__common.a
    [130/173] Linking C static library modules/nrf/lib/fatal_error/lib..__nrf__lib__fatal_error.a
    [131/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/main_weak.c.obj
    [132/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/device.c.obj
    [133/173] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/string/strerror.c.obj
    [134/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/banner.c.obj
    [135/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/errno.c.obj
    [136/173] Linking C static library zephyr/arch/arch/arm/core/aarch32/cortex_m/libarch__arm__core__aarch32__cortex_m.a
    [137/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/fatal.c.obj
    [138/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/init.c.obj
    [139/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/kheap.c.obj
    [140/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mem_slab.c.obj
    [141/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/version.c.obj
    [142/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/thread.c.obj
    [143/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/idle.c.obj
    [144/173] Linking C static library modules/segger/libmodules__segger.a
    [145/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mailbox.c.obj
    [146/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/msg_q.c.obj
    [147/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mutex.c.obj
    [148/173] Linking C static library zephyr/arch/arch/arm/core/aarch32/mpu/libarch__arm__core__aarch32__mpu.a
    [149/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/queue.c.obj
    [150/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/sem.c.obj
    [151/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/stack.c.obj
    [152/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/system_work_q.c.obj
    [153/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/work.c.obj
    [154/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/condvar.c.obj
    [155/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/sched.c.obj
    [156/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/xip.c.obj
    [157/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/timeout.c.obj
    [158/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/timer.c.obj
    [159/173] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mempool.c.obj
    [160/173] Linking C static library modules/hal_nordic/nrfx/libmodules__hal_nordic__nrfx.a
    [161/173] Linking C static library zephyr/lib/libc/minimal/liblib__libc__minimal.a
    [162/173] Linking C static library zephyr/kernel/libkernel.a
    [163/173] Linking C executable zephyr/zephyr_pre0.elf
    
    [164/173] Generating dev_handles.c
    [165/173] Building C object zephyr/CMakeFiles/zephyr_pre1.dir/misc/empty_file.c.obj
    [166/173] Building C object zephyr/CMakeFiles/zephyr_pre1.dir/dev_handles.c.obj
    [167/173] Linking C executable zephyr/zephyr_pre1.elf
    
    [168/173] Generating linker.cmd
    [169/173] Generating isr_tables.c, isrList.bin
    [170/173] Building C object zephyr/CMakeFiles/zephyr_final.dir/misc/empty_file.c.obj
    [171/173] Building C object zephyr/CMakeFiles/zephyr_final.dir/dev_handles.c.obj
    [172/173] Building C object zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
    [173/173] Linking C executable zephyr/zephyr.elf
    Memory region         Used Size  Region Size  %age Used
               FLASH:       31172 B       512 KB      5.95%
                 RAM:        7744 B        64 KB     11.82%
            IDT_LIST:          0 GB         2 KB      0.00%
     *  Terminal will be reused by tasks, press any key to close it. 
    

    Here is what I see when connected to RTT. Just a brief message that it connected, without my application's log messages: 

    SEGGER J-Link V7.88j - Real time terminal output
    SEGGER J-Link (unknown) V1.0, SN=682046847
    Process: JLinkExe
    
    


    I'm also attaching my project as a zip file, in case it is helpful in debugging. It includes the Hello World application code (with some minor edits to add extra log messages) and the custom board files as well.

    nixie_clock_firmware.zip


    Finally, here is the schematic for my custom hardware:

     Nixie_Clock_Schematics.pdf

    I am hoping you can help me find a simple configuration error or some other silly mistake. I'm new to the NCS ecosystem so it is very possible that I am missing something basic with my setup. 

    Is there anything that needs to be enabled at the board device tree level to enable RTT logging?

  • I was able to get printk messages and log messages from my custom board. I am going to write out the changes I made in the hopes that this helps someone in the future.

    In the defconfig file for my custom board:

    CONFIG_UART_CONSOLE=n

    In my application's prj.conf file:

    CONFIG_LOG=y
    
    CONFIG_LOG_PRINTK=y
    
    CONFIG_USE_SEGGER_RTT=y
    
    CONFIG_RTT_CONSOLE=y
    
    CONFIG_UART_CONSOLE=n

    main.c

    #include <zephyr/kernel.h>
    #include <zephyr/device.h>
    #include <zephyr/devicetree.h>
    #include <zephyr/logging/log.h>
    
    
    LOG_MODULE_REGISTER(NixieLogs,LOG_LEVEL_DBG);
    
    
    #define SLEEP_TIME_MS		1000
    
    
    int main(void)
    {
    	printk("Hello World! %s\n", CONFIG_BOARD);
    	LOG_INF("nixie log info");
    	LOG_DBG("nixie log debug");
    	LOG_WRN("nixie log warning");
    	LOG_ERR("nixie log error");
    
    	while (1) {
            k_msleep(SLEEP_TIME_MS); 
    	}
    	return 0;
    }

    project.code-workspace: a new 'settings' list showed up, listing nrf-connect.applications.

    {
        "folders": [
            {
                "path": "hello_world"
            }
        ],
        "settings": {
            "nrf-connect.applications": [],
        }
    }

    I also switched my programmer from a nRF52-DK PCA10040 board to a nRF5340-DK PCA10095 board. I made this switch because I was concerned that there may have been confusion between the nRF52832 on my programmer, and the nRF52832 on my custom hardware. I am not sure if this made a difference or not.

    When I plugged in my nRF5340-DK, I was prompted in VS Code to update the firmware on the device. I followed the prompt and a firmware update was installed. Unsure if that is relevant. 

    Note: the RTT/SWD interface is shared by the flashing operation and RTT logging. It seems that reflashing the board causes the RTT logs to freeze up. I need to manually kill the RTT terminal and reopen it every time I flash. But, I am getting my printk's and log messages now.

    Thank you to Kazi for helping me.

  • Just as a quick test, I switched back to my original nRF52-DK PCA10040 board and reflashed my application. I am still getting logs. So, it seems that switching the programming board was irrelevant.

Reply Children
No Data
Related