Skip to content

Commit e1d8a17

Browse files
committed
[stm32/sam_x7x] Allow I2C ISR priority to be set
1 parent 9d4baa9 commit e1d8a17

File tree

4 files changed

+11
-13
lines changed

4 files changed

+11
-13
lines changed

src/modm/platform/i2c/sam_x7x/i2c_master.cpp.in

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ MODM_ISR(TWIHS{{ id }})
289289
// ----------------------------------------------------------------------------
290290

291291
void
292-
modm::platform::I2cMaster{{ id }}::initializeWithClockConfig(uint32_t cwgrRegister)
292+
modm::platform::I2cMaster{{ id }}::initializeWithClockConfig(uint32_t cwgrRegister, uint8_t isrPriority)
293293
{
294294
ClockGen::enable<ClockPeripheral::I2c{{ id }}>();
295295

@@ -307,9 +307,7 @@ modm::platform::I2cMaster{{ id }}::initializeWithClockConfig(uint32_t cwgrRegist
307307
// Enable arbitration lost interrupt
308308
TWIHS{{ id }}->TWIHS_IER = TWIHS_IER_ARBLST;
309309

310-
// TODO: make priority configurable?
311-
// 10 is also used in the STM32 extended driver
312-
NVIC_SetPriority(TWIHS{{ id }}_IRQn, 10);
310+
NVIC_SetPriority(TWIHS{{ id }}_IRQn, isrPriority);
313311
NVIC_EnableIRQ(TWIHS{{ id }}_IRQn);
314312
}
315313

src/modm/platform/i2c/sam_x7x/i2c_master.hpp.in

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,14 +146,14 @@ public:
146146
*/
147147
template<class SystemClock, baudrate_t baudrate=kBd(100), percent_t tolerance=pct(5)>
148148
static void
149-
initialize()
149+
initialize(uint8_t isrPriority = 10u)
150150
{
151151
static_assert(baudrate <= 400'000, "Baudrate must not exceed 400 kHz for I2C fast mode");
152152
constexpr std::optional<uint32_t> registerValue = calculateTimings<SystemClock, baudrate, tolerance>();
153153
static_assert(bool(registerValue), "Could not find a valid clock configuration for the requested"
154154
" baudrate and tolerance");
155155

156-
initializeWithClockConfig(registerValue.value());
156+
initializeWithClockConfig(registerValue.value(), isrPriority);
157157
}
158158

159159
static bool
@@ -167,7 +167,7 @@ public:
167167

168168
private:
169169
static void
170-
initializeWithClockConfig(uint32_t cwgrRegister);
170+
initializeWithClockConfig(uint32_t cwgrRegister, uint8_t isrPriority);
171171
};
172172

173173

src/modm/platform/i2c/stm32/i2c_master.cpp.in

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ MODM_ISR(I2C{{ id }}_ER)
588588
// ----------------------------------------------------------------------------
589589

590590
void
591-
modm::platform::I2cMaster{{ id }}::initializeWithPrescaler(uint8_t peripheralFrequency, uint8_t riseTime, uint16_t prescaler)
591+
modm::platform::I2cMaster{{ id }}::initializeWithPrescaler(uint8_t peripheralFrequency, uint8_t riseTime, uint16_t prescaler, uint8_t isrPriority)
592592
{
593593
// no reset, since we want to keep the transaction attached!
594594

@@ -597,9 +597,9 @@ modm::platform::I2cMaster{{ id }}::initializeWithPrescaler(uint8_t peripheralFre
597597
I2C{{ id }}->CR1 = I2C_CR1_SWRST; // reset module
598598
I2C{{ id }}->CR1 = 0;
599599

600-
NVIC_SetPriority(I2C{{ id }}_ER_IRQn, 10);
600+
NVIC_SetPriority(I2C{{ id }}_ER_IRQn, isrPriority);
601601
NVIC_EnableIRQ(I2C{{ id }}_ER_IRQn);
602-
NVIC_SetPriority(I2C{{ id }}_EV_IRQn, 10);
602+
NVIC_SetPriority(I2C{{ id }}_EV_IRQn, isrPriority);
603603
NVIC_EnableIRQ(I2C{{ id }}_EV_IRQn);
604604

605605
I2C{{ id }}->CR2 = peripheralFrequency;

src/modm/platform/i2c/stm32/i2c_master.hpp.in

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public:
7070
*/
7171
template<class SystemClock, baudrate_t baudrate=kBd(100), percent_t tolerance=pct(5)>
7272
static void
73-
initialize()
73+
initialize(uint8_t isrPriority = 10u)
7474
{
7575
// calculate the expected clock ratio
7676
constexpr uint8_t scalar = (baudrate <= 100'000) ? 2 : ((baudrate <= 300'000) ? 3 : 25);
@@ -96,7 +96,7 @@ public:
9696
constexpr float trise_raw = max_rise_time < 0 ? 0 : std::floor(max_rise_time / (1'000.f / freq));
9797
constexpr uint8_t trise = trise_raw > 62 ? 63 : (trise_raw + 1);
9898

99-
initializeWithPrescaler(freq, trise, prescaler);
99+
initializeWithPrescaler(freq, trise, prescaler, isrPriority);
100100
}
101101

102102
static bool
@@ -110,7 +110,7 @@ public:
110110

111111
private:
112112
static void
113-
initializeWithPrescaler(uint8_t peripheralFrequency, uint8_t riseTime, uint16_t prescaler);
113+
initializeWithPrescaler(uint8_t peripheralFrequency, uint8_t riseTime, uint16_t prescaler, uint8_t isrPriority);
114114
};
115115

116116
} // namespace platform

0 commit comments

Comments
 (0)