nrf5/drivers/ticker: Removing LowPriority callback from nrf51 as there is only one SoftwareIRQ free if bluetooth stack is enabled. Also setting new IRQ priority on SlowTicker to 3 instead of 2, to interleave with bluetooth stack if needed. Updating all NVIC calls to use hal_irq.h defined static inlines instead of direct access.

This commit is contained in:
Glenn Ruben Bakke 2017-05-18 01:14:33 +02:00 committed by glennrub
parent 981b3e61dd
commit c921bbd9ac
1 changed files with 15 additions and 13 deletions

View File

@ -29,22 +29,21 @@
#if MICROPY_PY_MACHINE_SOFT_PWM #if MICROPY_PY_MACHINE_SOFT_PWM
#include "ticker.h" #include "ticker.h"
#include "hal_irq.h"
#define FastTicker NRF_TIMER0 #define FastTicker NRF_TIMER0
#define FastTicker_IRQn TIMER0_IRQn #define FastTicker_IRQn TIMER0_IRQn
#define FastTicker_IRQHandler TIMER0_IRQHandler #define FastTicker_IRQHandler TIMER0_IRQHandler
#define SlowTicker_IRQn SWI3_IRQn #define SlowTicker_IRQn SWI0_IRQn
#define SlowTicker_IRQHandler SWI3_IRQHandler #define SlowTicker_IRQHandler SWI0_IRQHandler
#define LowPriority_IRQn SWI4_IRQn
#define LowPriority_IRQHandler SWI4_IRQHandler
// Ticker callback function called every MACRO_TICK // Ticker callback function called every MACRO_TICK
static callback_ptr slow_ticker; static callback_ptr slow_ticker;
void ticker_init(callback_ptr slow_ticker_callback) { void ticker_init(callback_ptr slow_ticker_callback) {
slow_ticker = slow_ticker_callback; slow_ticker = slow_ticker_callback;
NRF_TIMER_Type *ticker = FastTicker; NRF_TIMER_Type *ticker = FastTicker;
#if NRF51 #if NRF51
ticker->POWER = 1; ticker->POWER = 1;
@ -58,24 +57,23 @@ void ticker_init(callback_ptr slow_ticker_callback) {
ticker->PRESCALER = 4; // 1 tick == 1 microsecond ticker->PRESCALER = 4; // 1 tick == 1 microsecond
ticker->INTENSET = TIMER_INTENSET_COMPARE3_Msk; ticker->INTENSET = TIMER_INTENSET_COMPARE3_Msk;
ticker->SHORTS = 0; ticker->SHORTS = 0;
NVIC_SetPriority(FastTicker_IRQn, 1);
NVIC_SetPriority(SlowTicker_IRQn, 2); hal_irq_priority(FastTicker_IRQn, 1);
NVIC_SetPriority(LowPriority_IRQn, 3); hal_irq_priority(SlowTicker_IRQn, 3);
NVIC_EnableIRQ(SlowTicker_IRQn); hal_irq_enable(SlowTicker_IRQn);
NVIC_EnableIRQ(LowPriority_IRQn);
} }
/* Start and stop timer 0 including workarounds for Anomaly 73 for Timer /* Start and stop timer 0 including workarounds for Anomaly 73 for Timer
* http://www.nordicsemi.com/eng/content/download/29490/494569/file/nRF51822-PAN%20v3.0.pdf * http://www.nordicsemi.com/eng/content/download/29490/494569/file/nRF51822-PAN%20v3.0.pdf
*/ */
void ticker_start(void) { void ticker_start(void) {
NVIC_EnableIRQ(FastTicker_IRQn); hal_irq_enable(FastTicker_IRQn);
*(uint32_t *)0x40008C0C = 1; //for Timer 0 *(uint32_t *)0x40008C0C = 1; //for Timer 0
FastTicker->TASKS_START = 1; FastTicker->TASKS_START = 1;
} }
void ticker_stop(void) { void ticker_stop(void) {
NVIC_DisableIRQ(FastTicker_IRQn); hal_irq_disable(FastTicker_IRQn);
FastTicker->TASKS_STOP = 1; FastTicker->TASKS_STOP = 1;
*(uint32_t *)0x40008C0C = 0; //for Timer 0 *(uint32_t *)0x40008C0C = 0; //for Timer 0
} }
@ -107,7 +105,7 @@ void FastTicker_IRQHandler(void) {
ticker->EVENTS_COMPARE[3] = 0; ticker->EVENTS_COMPARE[3] = 0;
ticker->CC[3] += MICROSECONDS_PER_MACRO_TICK; ticker->CC[3] += MICROSECONDS_PER_MACRO_TICK;
ticks += MILLISECONDS_PER_MACRO_TICK; ticks += MILLISECONDS_PER_MACRO_TICK;
NVIC_SetPendingIRQ(SlowTicker_IRQn); hal_irq_pending(SlowTicker_IRQn);
} }
} }
@ -150,6 +148,8 @@ void SlowTicker_IRQHandler(void)
slow_ticker(); slow_ticker();
} }
#if NRF52
#define LOW_PRIORITY_CALLBACK_LIMIT 4 #define LOW_PRIORITY_CALLBACK_LIMIT 4
callback_ptr low_priority_callbacks[LOW_PRIORITY_CALLBACK_LIMIT] = { NULL, NULL, NULL, NULL }; callback_ptr low_priority_callbacks[LOW_PRIORITY_CALLBACK_LIMIT] = { NULL, NULL, NULL, NULL };
@ -172,4 +172,6 @@ int set_low_priority_callback(callback_ptr callback, int id) {
return 0; return 0;
} }
#endif // NRF52
#endif // MICROPY_PY_MACHINE_SOFT_PWM #endif // MICROPY_PY_MACHINE_SOFT_PWM