[En-Nut-Discussion] Using the Periodic Interval Timer on the Ethernut 5 without Nut/OS

Robin Leinauer leinauer at hs-pforzheim.de
Thu Dec 2 16:55:26 CET 2021


many thanks for your help.

After a long investigation I have found the problem: The interrupt-disabled-flag in system mode was set.

The following snippet solves this issue:


asm volatile(
        "stmfd  sp!, {r0}       \n\t"
        "mrs    r0, cpsr        \n\t"
        "bic    r0, r0, #0x80   \n\t"
        "msr    cpsr, r0        \n\t"
        "ldmfd  sp!, {r0}           ");
Now everything works as expected :)

Best regards


Von: Dusan Ferbas <dferbas at solarmonitor.cz>
Gesendet: Montag, 29. November 2021 15:59:52
An: Ethernut User Chat (English); Robin Leinauer
Betreff: Re: [En-Nut-Discussion] Using the Periodic Interval Timer on the Ethernut 5 without Nut/OS

Hi Robin,

I am not familiar with SAM9 platform and I do not know your conf  file.
I suggest to compile a simple app example with Ethernut50f.conf and compare map file to your project map file.
Mainly if routines from nut/arch/arm/board/ethernut5.c are present, which confirms a correct LD script was applied.

Dusan Ferbas

Solar Monitor s.r.o. | Žižkova 562 | 511 01 Turnov | Czech Republic
Tel.: +420 481 313 661 | Mobile: +420 603 147 723

On 29.11.2021 13:59, Robin Leinauer wrote:

Hello everyone,

I'm trying to use the Periodic Interval Timer on the Ethernut 5.0 F without Nut/OS.

I have set up the project according to the following guide: http://www.ethernut.de/de/hardware/enut3/noos.html.

This is my code:


#include <toolchain.h>

#define MCK 90317000
#define LED_PIN 28

volatile unsigned int timer_ticks = 0;

void spurious_entry(void)__attribute__((naked));
void spurious_entry(void)

void timer_tick(void)__attribute__((naked));
void timer_tick(void)

    inr(PIT_PIVR);                                              // acknowledge timer interrupt


void init_timer(void)
    outr(PIT_MR, (MCK / (16 * 1000) - 1));

    outr(AIC_IDCR, _BV(SYSC_ID));                               // disable interrupt
    outr(AIC_SVR(SYSC_ID), (unsigned int)timer_tick);           // set interrupt handler
    outr(AIC_SMR(SYSC_ID), AIC_SRCTYPE_INT_LEVEL_SENSITIVE);    // define priority
    outr(AIC_ICCR, _BV(SYSC_ID));                               // clear interrupt

    outr(PIT_MR, inr(PIT_MR) | PIT_PITEN | PIT_PITIEN);         // enable timer and timer interrupt

    outr(AIC_IECR, _BV(SYSC_ID));                               // enable interrupt

void init_led(unsigned int pin)
    outr(PIOA_OER, _BV(pin));
    outr(PIOA_PER, _BV(pin));

void led_on(unsigned int pin)
    outr(PIOA_CODR, _BV(pin));

void led_off(unsigned int pin)
    outr(PIOA_SODR, _BV(pin));

void NutInit(void)
    outr(AIC_SPU, (unsigned int)spurious_entry);
    outr(AIC_IDCR, 0xffffffff);                                 // disable all interrupts
    outr(AIC_ICCR, 0xffffffff);                                 // clear all interrupts

        if(timer_ticks > 0)break;

    // is never reached
Everything compiles without errors, but unfortunately the first for-loop never exited during execution, the led never turns off.
What am I doing wrong?
I'm using an Ethernut 5.0 F and loading the image via TFTP.

Thanks and best regards


More information about the En-Nut-Discussion mailing list