nRF52840 interrupt causing reset

Hello guys,

I'm trying to run uart example from https://github.com/andenore/NordicSnippets/blob/master/examples/uart/main.c extended by interrupts call after transmission end on nRF52840 Dongle. I'm not able to successfully make CPU to call an interrupt handler. Bypassing "NVIC_SetVector", causes handler to not be called at all. And when I call "NVIC_SetVector" on configuration step and point to my interrupt handler, cpu restart after interrupt is enabled. I read that the interrupts are managed by the MBR that my board has, is this require some special configuration? I'm using an nRF Connect Programmer to upload hex file.

Programmer v3.0.0

I tried with and without softdevice, with handler name "UART0_IRQHandler" and "UARTE0_UART0_IRQHandler", with different interrupt priorities and different interrupts enabled. It's always same effect, restart or no reaction at all. As far I can tell without debugger, interrupt routine is never called. I will appreciate the help very much. I just started with nRF52 and I'm already pulling my hair out ;)

I'm using Visual Studio Code 1.68.1, with nRF Connect for VS Code Extension Pack v2022.5.1, project use nRF SDK in version 1.9.1.

uart.c

#include "uart.h"

#define RING_BUF_SIZE 4096
uint8_t txRingBufferData[RING_BUF_SIZE];
struct ring_buf txRingBuffer;
static uint8_t txBuffer[30];

void UART0_IRQHandler(void){
    if (NRF_UARTE0->EVENTS_ENDTX) {
        if (!ring_buf_is_empty(&txRingBuffer)) {
            uint32_t dataSize = ring_buf_get(&txRingBuffer, txBuffer, sizeof(txBuffer));
            NRF_UARTE0->TXD.PTR = (uint32_t)&txBuffer;
            NRF_UARTE0->TXD.MAXCNT = dataSize;
            NRF_UARTE0->TASKS_STARTTX = 1;
        }

        NRF_UARTE0->EVENTS_ENDTX = 0;
    }
}

void uart_init(uint32_t txPin, uint32_t rxPin, uint32_t baudrate) {
    // Disable UART
    NRF_UARTE0->ENABLE = (UARTE_ENABLE_ENABLE_Disabled << UARTE_ENABLE_ENABLE_Pos);
    
    // Configure the UARTE with no flow control, one parity bit and 115200 baud rate
	NRF_UARTE0->CONFIG = (UART_CONFIG_HWFC_Disabled << UART_CONFIG_HWFC_Pos) | (UARTE_CONFIG_PARITY_Excluded << UART_CONFIG_PARITY_Pos); 
	NRF_UARTE0->BAUDRATE = baudrate;
	
	// Select TX and RX pins
	NRF_UARTE0->PSEL.TXD = (txPin << UARTE_PSEL_TXD_PIN_Pos) & UARTE_PSEL_TXD_PIN_Msk;
	NRF_UARTE0->PSEL.RXD = (rxPin << UARTE_PSEL_RXD_PIN_Pos) & UARTE_PSEL_RXD_PIN_Msk;

    ring_buf_init(&txRingBuffer, sizeof(txRingBufferData), txRingBufferData);

    // Enable the UART (starts using the TX/RX pins)
	NRF_UARTE0->ENABLE = UARTE_ENABLE_ENABLE_Enabled << UARTE_ENABLE_ENABLE_Pos;

    // Enable UART TX End interrupt only
    NRF_UARTE0->INTENSET = (UARTE_INTENSET_ENDTX_Set << UARTE_INTENSET_ENDTX_Pos);

    NVIC_SetVector(UARTE0_UART0_IRQn, (uint32_t)UART0_IRQHandler);

    NVIC_SetPriority(UARTE0_UART0_IRQn, 6);
    NVIC_ClearPendingIRQ(UARTE0_UART0_IRQn);
    NVIC_EnableIRQ(UARTE0_UART0_IRQn);
}

void uart_send(const uint8_t *data, uint32_t size) {
    int rb_len = ring_buf_put(&txRingBuffer, data, size);
    // // if (rb_len < size) {
    // //     LOG_ERR("Drop %u bytes", size - rb_len);
    // // }

    uint32_t dataSize = ring_buf_get(&txRingBuffer, txBuffer, sizeof(txBuffer));
    NRF_UARTE0->TXD.PTR = (uint32_t)&txBuffer;
    NRF_UARTE0->TXD.MAXCNT = dataSize;
    NRF_UARTE0->EVENTS_ENDTX = 0;
    NRF_UARTE0->TASKS_STARTTX = 1;
}

main.c

#include "nrf.h"
#include "uart.h"

#define PIN_LED_STATUS (6UL)
#define PIN_LED_GREEN  (9UL)
#define PIN_LED_RED    (8UL)
#define PIN_LED_BLUE   (12UL)
#define PIN_TXD        (29)
#define PIN_RXD        (31)

void main(void) {
	NRF_P0->PIN_CNF[PIN_LED_STATUS] = (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos) |
                                (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
                                (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
                                (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
                                (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
	NRF_P0->PIN_CNF[PIN_LED_RED] = (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos) |
                                (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
                                (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
                                (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
                                (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
	NRF_P0->PIN_CNF[PIN_LED_BLUE] = (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos) |
                                (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
                                (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
                                (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
                                (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
  
	NRF_P1->PIN_CNF[PIN_LED_GREEN] = (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos) |
                                (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
                                (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
                                (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
                                (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
  
	NRF_P0->OUTSET = (1UL << PIN_LED_STATUS);
	NRF_P0->OUTSET = (1UL << PIN_LED_BLUE);
	NRF_P0->OUTCLR = (1UL << PIN_LED_RED);
	NRF_P1->OUTSET = (1UL << PIN_LED_GREEN);

	// Enable HF clock
	NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
	NRF_CLOCK->TASKS_HFCLKSTART = 1;
	while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) {}

	// Enable LF clock
	NRF_CLOCK->LFCLKSRC = CLOCK_LFCLKSRC_SRC_Xtal;
	NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
    NRF_CLOCK->TASKS_LFCLKSTART = 1;
    while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) {}

	NRF_P0->OUTSET = (1UL << PIN_LED_RED);
	NRF_P0->OUTCLR = (1UL << PIN_LED_STATUS);
	
	uart_init(PIN_TXD, PIN_RXD, UARTE_BAUDRATE_BAUDRATE_Baud115200);
	
	while (1) {
		uint8_t buf1[] = "Foo baz, some entry.\r\n";
		uart_send(buf1, sizeof(buf1));

		uint32_t volatile tmo = 5000000;
    	//while (tmo--);

		// uint8_t buf2[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse aliquet placerat nunc vitae luctus.\r\n";
		// uart_send(buf2, sizeof(buf2));

		tmo = 10000000;
    	while (tmo--);
	}

}

Build log:

> Executing task: nRF Connect: Build: radio_module/build (active) <

Building radio_module
west build --build-dir e:\nRF52\Projects\radio_module\build e:\nRF52\Projects\radio_module

[0/1] Re-running CMake...
Including boilerplate (Zephyr base (cached)): C:/Users/Marek/ncs/v1.9.1/zephyr/cmake/app/boilerplate.cmake
-- Application: E:/nRF52/Projects/radio_module
-- Zephyr version: 2.7.99 (C:/Users/Marek/ncs/v1.9.1/zephyr), build: v2.7.99-ncs1-1
-- Found west (found suitable version "0.12.0", minimum required is "0.7.1")
-- Board: nrf52840dongle_nrf52840
-- Cache files will be written to: C:/Users/Marek/ncs/v1.9.1/zephyr/.cache
-- Found dtc: C:/Users/Marek/ncs/v1.9.1/toolchain/opt/bin/dtc.exe (found suitable version "1.4.7", minimum required is "1.4.6")
-- Found toolchain: gnuarmemb (c:/Users/Marek/ncs/v1.9.1/toolchain/opt)
-- Found BOARD.dts: C:/Users/Marek/ncs/v1.9.1/zephyr/boards/arm/nrf52840dongle_nrf52840/nrf52840dongle_nrf52840.dts
-- Generated zephyr.dts: E:/nRF52/Projects/radio_module/build/zephyr/zephyr.dts
-- Generated devicetree_unfixed.h: E:/nRF52/Projects/radio_module/build/zephyr/include/generated/devicetree_unfixed.h
-- Generated device_extern.h: E:/nRF52/Projects/radio_module/build/zephyr/include/generated/device_extern.h
-- Including generated dts.cmake file: E:/nRF52/Projects/radio_module/build/zephyr/dts.cmake
Parsing C:/Users/Marek/ncs/v1.9.1/zephyr/Kconfig
Loaded configuration 'E:/nRF52/Projects/radio_module/build/zephyr/.config'
Configuration saved to 'E:/nRF52/Projects/radio_module/build/zephyr/.config'
Kconfig header saved to 'E:/nRF52/Projects/radio_module/build/zephyr/include/generated/autoconf.h'
-- Configuring done
-- Generating done
-- Build files have been written to: E:/nRF52/Projects/radio_module/build
[1/154] Generating misc/generated/syscalls.json, misc/generated/struct_tags.json
[2/154] Building C object zephyr/CMakeFiles/offsets.dir/arch/arm/core/offsets/offsets.c.obj
[3/154] Generating include/generated/offsets.h
[4/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/dec.c.obj
[5/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/crc7_sw.c.obj
[6/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/crc32c_sw.c.obj
[7/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/cbprintf.c.obj
[8/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/hex.c.obj
[9/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/crc8_sw.c.obj
[10/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/crc16_sw.c.obj
[11/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/crc32_sw.c.obj
[12/154] Building C object zephyr/soc/arm/common/cortex_m/CMakeFiles/soc__arm__common__cortex_m.dir/arm_mpu_regions.c.obj
[13/154] Building C object CMakeFiles/app.dir/src/uart.c.obj
../src/uart.c: In function 'uart_send':
e:\nRF52\Projects\radio_module\src\uart.c:49:9: warning: unused variable 'rb_len' [-Wunused-variable]
   49 |     int rb_len = ring_buf_put(&txRingBuffer, data, size);
      |         ^~~~~~
[14/154] Building C object CMakeFiles/app.dir/src/main.c.obj
[15/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/cbprintf_packaged.c.obj
[16/154] Building C object modules/nrf/drivers/hw_cc310/CMakeFiles/..__nrf__drivers__hw_cc310.dir/hw_cc310.c.obj
[17/154] Building C object zephyr/drivers/timer/CMakeFiles/drivers__timer.dir/sys_clock_init.c.obj
[18/154] Building C object modules/nrf/lib/fatal_error/CMakeFiles/..__nrf__lib__fatal_error.dir/fatal_error.c.obj
[19/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/fdtable.c.obj
[20/154] Building C object zephyr/boards/boards/arm/nrf52840dongle_nrf52840/CMakeFiles/boards__arm__nrf52840dongle_nrf52840.dir/board.c.obj
[21/154] Building C object zephyr/soc/arm/nordic_nrf/nrf52/CMakeFiles/soc__arm__nordic_nrf__nrf52.dir/soc.c.obj
[22/154] Linking C static library zephyr\soc\arm\common\cortex_m\libsoc__arm__common__cortex_m.a
[23/154] Building C object zephyr/soc/arm/nordic_nrf/nrf52/CMakeFiles/soc__arm__nordic_nrf__nrf52.dir/power.c.obj
[24/154] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/C_/Users/Marek/ncs/v1.9.1/modules/hal/nordic/nrfx/mdk/system_nrf52840.c.obj
[25/154] Linking C static library app\libapp.a
[26/154] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/nrfx_glue.c.obj
[27/154] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/C_/Users/Marek/ncs/v1.9.1/modules/hal/nordic/nrfx/helpers/nrfx_flag32_allocator.c.obj
[28/154] Building C object zephyr/drivers/gpio/CMakeFiles/drivers__gpio.dir/gpio_nrfx.c.obj
[29/154] Linking C static library modules\nrf\drivers\hw_cc310\lib..__nrf__drivers__hw_cc310.a
[30/154] Linking C static library zephyr\boards\boards\arm\nrf52840dongle_nrf52840\libboards__arm__nrf52840dongle_nrf52840.a
[31/154] Linking C static library modules\nrf\lib\fatal_error\lib..__nrf__lib__fatal_error.a
[32/154] Building C object zephyr/drivers/timer/CMakeFiles/drivers__timer.dir/nrf_rtc_timer.c.obj
[33/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/errno.c.obj
[34/154] Linking C static library zephyr\soc\arm\nordic_nrf\nrf52\libsoc__arm__nordic_nrf__nrf52.a
[35/154] Building C object zephyr/drivers/clock_control/CMakeFiles/drivers__clock_control.dir/clock_control_nrf.c.obj
[36/154] Linking C static library zephyr\drivers\gpio\libdrivers__gpio.a
[37/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/device.c.obj
[38/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/version.c.obj
[39/154] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/C_/Users/Marek/ncs/v1.9.1/modules/hal/nordic/nrfx/drivers/src/nrfx_clock.c.obj
[40/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/fatal.c.obj
[41/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/banner.c.obj
[42/154] Linking C static library zephyr\drivers\timer\libdrivers__timer.a
[43/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/main_weak.c.obj
[44/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/init.c.obj
[45/154] Linking C static library zephyr\drivers\clock_control\libdrivers__clock_control.a
[46/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/idle.c.obj
[47/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/kheap.c.obj
[48/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/sem.c.obj
[49/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mem_slab.c.obj
[50/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/stack.c.obj
[51/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mailbox.c.obj
[52/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/xip.c.obj
[53/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/system_work_q.c.obj
[54/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/thread.c.obj
[55/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/msg_q.c.obj
[56/154] Building C object modules/hal_nordic/nrfx/CMakeFiles/modules__hal_nordic__nrfx.dir/C_/Users/Marek/ncs/v1.9.1/modules/hal/nordic/nrfx/drivers/src/nrfx_gpiote.c.obj
[57/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/condvar.c.obj
[58/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mutex.c.obj
[59/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/timer.c.obj
[60/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/notify.c.obj
[61/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/thread_entry.c.obj
[62/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/mempool.c.obj
[63/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/queue.c.obj
[64/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/multi_heap.c.obj
[65/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/pipes.c.obj
[66/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/timeout.c.obj
[67/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/printk.c.obj
[68/154] Linking C static library modules\hal_nordic\nrfx\libmodules__hal_nordic__nrfx.a
[69/154] Building ASM object zephyr/CMakeFiles/zephyr.dir/soc/arm/nordic_nrf/common/soc_nrf_common.S.obj
[70/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/timeutil.c.obj
[71/154] Building C object zephyr/CMakeFiles/zephyr.dir/misc/generated/configs.c.obj
[72/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/sem.c.obj
[73/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/rb.c.obj
[74/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/work.c.obj
[75/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/reboot.c.obj
[76/154] Building C object zephyr/CMakeFiles/zephyr.dir/soc/arm/nordic_nrf/validate_enabled_instances.c.obj
[77/154] Building C object zephyr/CMakeFiles/zephyr.dir/soc/arm/nordic_nrf/validate_base_addresses.c.obj
[78/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/cbprintf_complete.c.obj
[79/154] Building ASM object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/cpu_idle.S.obj
[80/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/bitarray.c.obj
[81/154] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/tracing/tracing_none.c.obj
[82/154] Generating linker_zephyr_pre1.cmd
[83/154] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/pm/policy/residency.c.obj
[84/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/onoff.c.obj
[85/154] Generating linker_zephyr_pre0.cmd
[86/154] Building C object zephyr/kernel/CMakeFiles/kernel.dir/sched.c.obj
[87/154] Building ASM object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/nmi_on_reset.S.obj
[88/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/heap-validate.c.obj
[89/154] Building C object zephyr/arch/common/CMakeFiles/isr_tables.dir/isr_tables.c.obj
[90/154] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/pm/constraint.c.obj
[91/154] Building C object zephyr/CMakeFiles/zephyr.dir/C_/Users/Marek/ncs/v1.9.1/nrfxlib/crypto/nrf_cc310_platform/src/nrf_cc3xx_platform_abort_zephyr.c.obj
[92/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/ring_buffer.c.obj
[93/154] Building C object zephyr/CMakeFiles/zephyr.dir/C_/Users/Marek/ncs/v1.9.1/nrfxlib/crypto/nrf_cc310_platform/src/nrf_cc3xx_platform_mutex_zephyr.c.obj
[94/154] Building C object zephyr/arch/common/CMakeFiles/arch__common.dir/sw_isr_common.c.obj
[95/154] Building C object zephyr/CMakeFiles/zephyr.dir/lib/os/heap.c.obj
[96/154] Building ASM object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/isr_wrapper.S.obj
[97/154] Building C object zephyr/CMakeFiles/zephyr.dir/subsys/pm/pm.c.obj
[98/154] Building ASM object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/exc_exit.S.obj
[99/154] Building ASM object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/swap_helper.S.obj
[100/154] Building C object zephyr/CMakeFiles/zephyr_pre0.dir/misc/empty_file.c.obj
[101/154] Building ASM object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/fault_s.S.obj
[102/154] Linking C static library zephyr\arch\common\libisr_tables.a
[103/154] Building ASM object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/vector_table.S.obj
[104/154] Linking C static library zephyr\kernel\libkernel.a
[105/154] Building ASM object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/reset.S.obj
[106/154] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/swap.c.obj
[107/154] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/nmi.c.obj
[108/154] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/prep_c.c.obj
[109/154] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/irq_manage.c.obj
[110/154] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/thread.c.obj
[111/154] Building C object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/irq_init.c.obj
[112/154] Building C object zephyr/arch/arch/arm/core/aarch32/CMakeFiles/arch__arm__core__aarch32.dir/fatal.c.obj
[113/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/atoi.c.obj
[114/154] Linking C static library zephyr\libzephyr.a
[115/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/bsearch.c.obj
[116/154] Building C object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/fpu.c.obj
[117/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/strtoul.c.obj
[118/154] Linking C static library zephyr\arch\common\libarch__common.a
[119/154] Building C object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/thread_abort.c.obj
[120/154] Building C object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/scb.c.obj
[121/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/strtol.c.obj
[122/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/abort.c.obj
[123/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/string/strstr.c.obj
[124/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/string/strncasecmp.c.obj
[125/154] Building C object zephyr/arch/arch/arm/core/aarch32/mpu/CMakeFiles/arch__arm__core__aarch32__mpu.dir/arm_core_mpu.c.obj
[126/154] Linking C static library zephyr\arch\arch\arm\core\aarch32\libarch__arm__core__aarch32.a
[127/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/string/strspn.c.obj
[128/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/malloc.c.obj
[129/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/qsort.c.obj
[130/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdout/stdout_console.c.obj
[131/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdout/fprintf.c.obj
[132/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdlib/exit.c.obj
[133/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/string/string.c.obj
[134/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/stdout/sprintf.c.obj
[135/154] Building C object zephyr/lib/libc/minimal/CMakeFiles/lib__libc__minimal.dir/source/time/gmtime.c.obj
[136/154] Building C object zephyr/arch/arch/arm/core/aarch32/mpu/CMakeFiles/arch__arm__core__aarch32__mpu.dir/arm_mpu.c.obj
[137/154] Linking C static library zephyr\lib\libc\minimal\liblib__libc__minimal.a
[138/154] Building C object zephyr/lib/posix/CMakeFiles/lib__posix.dir/pthread_common.c.obj
[139/154] Building C object zephyr/lib/posix/CMakeFiles/lib__posix.dir/nanosleep.c.obj
[140/154] Building C object zephyr/arch/arch/arm/core/aarch32/cortex_m/CMakeFiles/arch__arm__core__aarch32__cortex_m.dir/fault.c.obj
[141/154] Linking C static library zephyr\arch\arch\arm\core\aarch32\mpu\libarch__arm__core__aarch32__mpu.a
[142/154] Linking C static library zephyr\lib\posix\liblib__posix.a
[143/154] Linking C static library zephyr\arch\arch\arm\core\aarch32\cortex_m\libarch__arm__core__aarch32__cortex_m.a
[144/154] Linking C executable zephyr\zephyr_pre0.elf

[145/154] Generating dev_handles.c
[146/154] Building C object zephyr/CMakeFiles/zephyr_pre1.dir/misc/empty_file.c.obj
[147/154] Building C object zephyr/CMakeFiles/zephyr_pre1.dir/dev_handles.c.obj
[148/154] Linking C executable zephyr\zephyr_pre1.elf

[149/154] Generating linker.cmd
[150/154] Generating isr_tables.c, isrList.bin
[151/154] Building C object zephyr/CMakeFiles/zephyr_final.dir/misc/empty_file.c.obj
[152/154] Building C object zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
[153/154] Building C object zephyr/CMakeFiles/zephyr_final.dir/dev_handles.c.obj
[154/154] Linking C executable zephyr\zephyr.elf
Memory region         Used Size  Region Size  %age Used
           FLASH:       21520 B      1020 KB      2.06%
            SRAM:       10336 B       256 KB      3.94%
        IDT_LIST:          0 GB         2 KB      0.00%

  • Hi,

    Is this part of a larger application, or is this your whole application?

    Can you try to use the Zephyr APIs to connect the interrupt to the handler?

    IRQ_DIRECT_CONNECT(UARTE0_UART0_IRQn, 6, UART0_IRQHandler, 0);
    irq_enable(UARTE0_UART0_IRQn);

    Best regards,
    Jørgen

  • This is my whole application, I edit my post to add main.c file.

    It's working now! Thank you. Can you tell me, why this is working, and "direct api" is not? What's the difference?

    /**
     * @brief Initialize a 'direct' interrupt handler.
     *
     * This routine initializes an interrupt handler for an IRQ. The IRQ must be
     * subsequently enabled via irq_enable() before the interrupt handler begins
     * servicing interrupts.
     *
     * These ISRs are designed for performance-critical interrupt handling and do
     * not go through common interrupt handling code. They must be implemented in
     * such a way that it is safe to put them directly in the vector table.  For
     * ISRs written in C, The ISR_DIRECT_DECLARE() macro will do this
     * automatically. For ISRs written in assembly it is entirely up to the
     * developer to ensure that the right steps are taken.
     *
     * This type of interrupt currently has a few limitations compared to normal
     * Zephyr interrupts:
     * - No parameters are passed to the ISR.
     * - No stack switch is done, the ISR will run on the interrupted context's
     *   stack, unless the architecture automatically does the stack switch in HW.
     * - Interrupt locking state is unchanged from how the HW sets it when the ISR
     *   runs. On arches that enter ISRs with interrupts locked, they will remain
     *   locked.
     * - Scheduling decisions are now optional, controlled by the return value of
     *   ISRs implemented with the ISR_DIRECT_DECLARE() macro
     * - The call into the OS to exit power management idle state is now optional.
     *   Normal interrupts always do this before the ISR is run, but when it runs
     *   is now controlled by the placement of a ISR_DIRECT_PM() macro, or omitted
     *   entirely.
     *
     * @warning
     * Although this routine is invoked at run-time, all of its arguments must be
     * computable by the compiler at build time.
     *
     * @param irq_p IRQ line number.
     * @param priority_p Interrupt priority.
     * @param isr_p Address of interrupt service routine.
     * @param flags_p Architecture-specific IRQ configuration flags.
     */
     #define IRQ_DIRECT_CONNECT(irq_p, priority_p, isr_p, flags_p) \
    	ARCH_IRQ_DIRECT_CONNECT(irq_p, priority_p, isr_p, flags_p)

    It's sounds like this method should be used in user code. Is that a case?

  • Thw Zephyr RTOS likely generates its own vector and ISR tables based on the IRQ_(DIRECT_)CONNECT macros during build-time, see this comment.

Related