Skip to content

Commit

Permalink
[stm32/sam_x7x] Allow I2C ISR priority to be set
Browse files Browse the repository at this point in the history
  • Loading branch information
rleh committed Mar 14, 2024
1 parent 9d4baa9 commit e1d8a17
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 13 deletions.
6 changes: 2 additions & 4 deletions src/modm/platform/i2c/sam_x7x/i2c_master.cpp.in
Expand Up @@ -289,7 +289,7 @@ MODM_ISR(TWIHS{{ id }})
// ----------------------------------------------------------------------------

void
modm::platform::I2cMaster{{ id }}::initializeWithClockConfig(uint32_t cwgrRegister)
modm::platform::I2cMaster{{ id }}::initializeWithClockConfig(uint32_t cwgrRegister, uint8_t isrPriority)
{
ClockGen::enable<ClockPeripheral::I2c{{ id }}>();

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

// TODO: make priority configurable?
// 10 is also used in the STM32 extended driver
NVIC_SetPriority(TWIHS{{ id }}_IRQn, 10);
NVIC_SetPriority(TWIHS{{ id }}_IRQn, isrPriority);
NVIC_EnableIRQ(TWIHS{{ id }}_IRQn);
}

Expand Down
6 changes: 3 additions & 3 deletions src/modm/platform/i2c/sam_x7x/i2c_master.hpp.in
Expand Up @@ -146,14 +146,14 @@ public:
*/
template<class SystemClock, baudrate_t baudrate=kBd(100), percent_t tolerance=pct(5)>
static void
initialize()
initialize(uint8_t isrPriority = 10u)
{
static_assert(baudrate <= 400'000, "Baudrate must not exceed 400 kHz for I2C fast mode");
constexpr std::optional<uint32_t> registerValue = calculateTimings<SystemClock, baudrate, tolerance>();
static_assert(bool(registerValue), "Could not find a valid clock configuration for the requested"
" baudrate and tolerance");

initializeWithClockConfig(registerValue.value());
initializeWithClockConfig(registerValue.value(), isrPriority);
}

static bool
Expand All @@ -167,7 +167,7 @@ public:

private:
static void
initializeWithClockConfig(uint32_t cwgrRegister);
initializeWithClockConfig(uint32_t cwgrRegister, uint8_t isrPriority);
};


Expand Down
6 changes: 3 additions & 3 deletions src/modm/platform/i2c/stm32/i2c_master.cpp.in
Expand Up @@ -588,7 +588,7 @@ MODM_ISR(I2C{{ id }}_ER)
// ----------------------------------------------------------------------------

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

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

NVIC_SetPriority(I2C{{ id }}_ER_IRQn, 10);
NVIC_SetPriority(I2C{{ id }}_ER_IRQn, isrPriority);
NVIC_EnableIRQ(I2C{{ id }}_ER_IRQn);
NVIC_SetPriority(I2C{{ id }}_EV_IRQn, 10);
NVIC_SetPriority(I2C{{ id }}_EV_IRQn, isrPriority);
NVIC_EnableIRQ(I2C{{ id }}_EV_IRQn);

I2C{{ id }}->CR2 = peripheralFrequency;
Expand Down
6 changes: 3 additions & 3 deletions src/modm/platform/i2c/stm32/i2c_master.hpp.in
Expand Up @@ -70,7 +70,7 @@ public:
*/
template<class SystemClock, baudrate_t baudrate=kBd(100), percent_t tolerance=pct(5)>
static void
initialize()
initialize(uint8_t isrPriority = 10u)
{
// calculate the expected clock ratio
constexpr uint8_t scalar = (baudrate <= 100'000) ? 2 : ((baudrate <= 300'000) ? 3 : 25);
Expand All @@ -96,7 +96,7 @@ public:
constexpr float trise_raw = max_rise_time < 0 ? 0 : std::floor(max_rise_time / (1'000.f / freq));
constexpr uint8_t trise = trise_raw > 62 ? 63 : (trise_raw + 1);

initializeWithPrescaler(freq, trise, prescaler);
initializeWithPrescaler(freq, trise, prescaler, isrPriority);
}

static bool
Expand All @@ -110,7 +110,7 @@ public:

private:
static void
initializeWithPrescaler(uint8_t peripheralFrequency, uint8_t riseTime, uint16_t prescaler);
initializeWithPrescaler(uint8_t peripheralFrequency, uint8_t riseTime, uint16_t prescaler, uint8_t isrPriority);
};

} // namespace platform
Expand Down

0 comments on commit e1d8a17

Please sign in to comment.