From 6db318828dda2c3bb8858c996e97c42355f055dc Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sun, 3 Nov 2019 23:22:11 -0800 Subject: [PATCH] Add function to set SoftwareSerial int priority --- libraries/SoftwareSerial/src/SoftwareSerial.cpp | 10 ++++++++++ libraries/SoftwareSerial/src/SoftwareSerial.h | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/libraries/SoftwareSerial/src/SoftwareSerial.cpp b/libraries/SoftwareSerial/src/SoftwareSerial.cpp index 9ba9dbb731..104f9150aa 100644 --- a/libraries/SoftwareSerial/src/SoftwareSerial.cpp +++ b/libraries/SoftwareSerial/src/SoftwareSerial.cpp @@ -35,6 +35,7 @@ // Includes // #include "SoftwareSerial.h" +#include #define OVERSAMPLE 3 // in RX, Timer will generate interruption OVERSAMPLE time during a bit. Thus OVERSAMPLE ticks in a bit. (interrupt not synchonized with edge). @@ -96,6 +97,8 @@ // Statics // HardwareTimer SoftwareSerial::timer(TIMER_SERIAL); +const IRQn_Type SoftwareSerial::timer_interrupt_number = static_cast(getTimerUpIrq(TIMER_SERIAL)); +uint32_t SoftwareSerial::timer_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO); SoftwareSerial *SoftwareSerial::active_listener = nullptr; SoftwareSerial *volatile SoftwareSerial::active_out = nullptr; SoftwareSerial *volatile SoftwareSerial::active_in = nullptr; @@ -107,6 +110,12 @@ uint32_t SoftwareSerial::rx_buffer = 0; int32_t SoftwareSerial::rx_bit_cnt = -1; // rx_bit_cnt = -1 : waiting for start bit uint32_t SoftwareSerial::cur_speed = 0; +void SoftwareSerial::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) +{ + timer_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority); + NVIC_SetPriority(timer_interrupt_number, timer_interrupt_priority); +} + // // Private methods // @@ -134,6 +143,7 @@ void SoftwareSerial::setSpeed(uint32_t speed) timer.setCount(0); timer.attachInterrupt(&handleInterrupt); timer.resume(); + NVIC_SetPriority(timer_interrupt_number, timer_interrupt_priority); } else { timer.detachInterrupt(); } diff --git a/libraries/SoftwareSerial/src/SoftwareSerial.h b/libraries/SoftwareSerial/src/SoftwareSerial.h index 7ec0aee188..45b0c03c9f 100644 --- a/libraries/SoftwareSerial/src/SoftwareSerial.h +++ b/libraries/SoftwareSerial/src/SoftwareSerial.h @@ -66,6 +66,8 @@ class SoftwareSerial : public Stream { // static data static bool initialised; static HardwareTimer timer; + static const IRQn_Type timer_interrupt_number; + static uint32_t timer_interrupt_priority; static SoftwareSerial *active_listener; static SoftwareSerial *volatile active_out; static SoftwareSerial *volatile active_in; @@ -118,6 +120,8 @@ class SoftwareSerial : public Stream { return true; } + static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); + using Print::write; };