Skip to content

Commit 69b5bf9

Browse files
mcbridejcsalkinium
andcommitted
[irq] Fixes for strict IRQ name validation on STM32
Co-authored-by: Niklas Hauser <[email protected]>
1 parent da953d6 commit 69b5bf9

File tree

6 files changed

+56
-20
lines changed

6 files changed

+56
-20
lines changed

src/modm/platform/adc/stm32/adc_interrupt.cpp.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ modm::platform::AdcInterrupt{{ id }}::Handler
1818
modm::platform::AdcInterrupt{{ id }}::handler(modm::dummy);
1919

2020
%% if id not in shared_irq_ids
21-
MODM_ISR(ADC{{ id }})
21+
MODM_ISR(ADC{{ irq }})
2222
{
2323
if (modm::platform::AdcInterrupt{{ id }}::getInterruptFlags()) {
2424
modm::platform::AdcInterrupt{{ id }}::handler();

src/modm/platform/adc/stm32/module.lb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class Instance(Module):
4949
properties["channels"] = sorted(channels)
5050
global props
5151
properties["shared_irq_ids"] = props["shared_irq_ids"]
52+
properties["irq"] = "1" if target.family in ["l1"] else self.instance
5253
props["instances"].append(self.instance)
5354

5455
env.substitutions = properties

src/modm/platform/can/stm32/can.cpp.in

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -121,16 +121,16 @@ modm::platform::Can{{ id }}::initializeWithPrescaler(
121121
NVIC_EnableIRQ(CEC_CAN_IRQn);
122122
%% else
123123
// Set vector priority
124-
NVIC_SetPriority({{ reg }}_RX0_IRQn, interruptPriority);
125-
NVIC_SetPriority({{ reg }}_RX1_IRQn, interruptPriority);
124+
NVIC_SetPriority({{ irqs.rx0 }}_IRQn, interruptPriority);
125+
NVIC_SetPriority({{ irqs.rx1 }}_IRQn, interruptPriority);
126126

127127
// Register Interrupts at the NVIC
128-
NVIC_EnableIRQ({{ reg }}_RX0_IRQn);
129-
NVIC_EnableIRQ({{ reg }}_RX1_IRQn);
128+
NVIC_EnableIRQ({{ irqs.rx0 }}_IRQn);
129+
NVIC_EnableIRQ({{ irqs.rx1 }}_IRQn);
130130

131131
%% if options["buffer.tx"] > 0
132-
NVIC_EnableIRQ({{ reg }}_TX_IRQn);
133-
NVIC_SetPriority({{ reg }}_TX_IRQn, interruptPriority);
132+
NVIC_EnableIRQ({{ irqs.tx }}_IRQn);
133+
NVIC_SetPriority({{ irqs.tx }}_IRQn, interruptPriority);
134134
%% endif
135135
%% endif
136136

@@ -220,8 +220,11 @@ readMailbox(modm::can::Message& message, uint32_t mailboxId, uint8_t* filter_id)
220220
*
221221
* Generated when Transmit Mailbox 0..2 becomes empty.
222222
*/
223-
224-
MODM_ISR({{ reg }}_TX)
223+
%% if combined_isr
224+
void MODM_ISR_NAME({{ irqs.tx }})()
225+
%% else
226+
MODM_ISR({{ irqs.tx }})
227+
%% endif
225228
{
226229
%% if options["buffer.tx"] > 0
227230
uint32_t mailbox;
@@ -254,7 +257,11 @@ MODM_ISR({{ reg }}_TX)
254257
* Generated on a new received message, FIFO0 full condition and Overrun
255258
* Condition.
256259
*/
257-
MODM_ISR({{ reg }}_RX0)
260+
%% if combined_isr
261+
void MODM_ISR_NAME({{ irqs.rx0 }})()
262+
%% else
263+
MODM_ISR({{ irqs.rx0 }})
264+
%% endif
258265
{
259266
if (not modm_assert_continue_ignore(not ({{ reg }}->RF0R & CAN_RF0R_FOVR0),
260267
"can.rx.hw0", "CAN receive hardware buffer overflowed!", {{ 0 if id == '' else id }}))
@@ -280,7 +287,11 @@ MODM_ISR({{ reg }}_RX0)
280287
*
281288
* See FIFO0 Interrupt
282289
*/
283-
MODM_ISR({{ reg }}_RX1)
290+
%% if combined_isr
291+
void MODM_ISR_NAME({{ irqs.rx1 }})()
292+
%% else
293+
MODM_ISR({{ irqs.rx1 }})
294+
%% endif
284295
{
285296
if (not modm_assert_continue_ignore(not ({{ reg }}->RF1R & CAN_RF1R_FOVR1),
286297
"can.rx.hw1", "CAN receive hardware buffer overflowed!", {{ 0 if id == '' else id }}))
@@ -301,7 +312,7 @@ MODM_ISR({{ reg }}_RX1)
301312
%% endif
302313
}
303314

304-
%% if target["family"] == "f0"
315+
%% if combined_isr
305316
// On stm32f0, ST has decided to use only one interrupt vector for all
306317
// CAN interrupts. In order to avoide duplicate code, we try to determine
307318
// the interrupt source and call the correct interrupts function defined above.
@@ -310,15 +321,15 @@ MODM_ISR({{ reg }}_RX1)
310321
MODM_ISR(CEC_CAN)
311322
{
312323
if({{ reg }}->TSR & (CAN_TSR_RQCP0 | CAN_TSR_RQCP1 | CAN_TSR_RQCP2)) {
313-
MODM_ISR_CALL({{ reg }}_TX);
324+
MODM_ISR_NAME({{ irqs.tx }})();
314325
}
315326

316327
if({{ reg }}->RF0R & (CAN_RF0R_FMP0 | CAN_RF0R_FULL0 | CAN_RF0R_FOVR0)) {
317-
MODM_ISR_CALL({{ reg }}_RX0);
328+
MODM_ISR_NAME({{ irqs.rx0 }})();
318329
}
319330

320331
if({{ reg }}->RF1R & (CAN_RF1R_FMP1 | CAN_RF1R_FULL1 | CAN_RF1R_FOVR1)) {
321-
MODM_ISR_CALL({{ reg }}_RX1);
332+
MODM_ISR_NAME({{ irqs.rx1 }})();
322333
}
323334

324335
// TODO: we do not handle status changes at the moment.

src/modm/platform/can/stm32/module.lb

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,22 @@ def get_substitutions(instance, device, env):
8484
cm = can_map[target["family"]]
8585
is_single = (cm[instance].type == CanType.Single) or (cm[instance].associated_instance not in instances)
8686
other = cm[instance].associated_instance
87+
cmr = cm[instance].register
88+
irqs = {
89+
"tx": "CAN" + cmr + "_TX",
90+
"rx0": "CAN" + cmr + "_RX0",
91+
"rx1": "CAN" + cmr + "_RX1",
92+
}
93+
if any(v["name"].startswith("USB_HP_CAN") for v in device.get_driver("core")["vector"]):
94+
irqs["tx"] = "USB_HP_CAN" + cmr + "_TX"
95+
irqs["rx0"] = "USB_LP_CAN" + cmr + "_RX0"
8796

8897
subs = {
8998
"id": "" if instance == 0 else str(instance),
90-
"own_instance": cm[instance].register,
99+
"own_instance": cmr,
91100
"other_instance": cm[other].register if other in cm else None,
92-
"reg": "CAN" + cm[instance].register,
101+
"reg": "CAN" + cmr,
102+
"irqs": irqs,
93103
"type": cm[instance].type.name if not is_single else CanType.Single.name
94104
}
95105

@@ -115,6 +125,11 @@ class Instance(Module):
115125
properties = device.properties
116126
properties["target"] = target = device.identifier
117127
properties["driver"] = driver
128+
if device.identifier.family == "f0":
129+
properties["combined_isr"] = True
130+
else:
131+
properties["combined_isr"] = False
132+
118133
properties.update(get_substitutions(self.instance, device, env))
119134

120135
env.substitutions = properties
@@ -165,6 +180,10 @@ def build(env):
165180
properties = device.properties
166181
properties["target"] = device.identifier
167182
properties["driver"] = driver
183+
if device.identifier.family == "f0":
184+
properties["combined_isr"] = True
185+
else:
186+
properties["combined_isr"] = False
168187

169188
if "instance" not in driver:
170189
properties.update(get_substitutions(0, device, env))

src/modm/platform/dma/stm32/dma.hpp.in

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,13 @@ public:
5858
if constexpr (ID == 1)
5959
Rcc::enable<Peripheral::Dma1>();
6060
%% if (dma.instance | length) > 1
61-
else
61+
else {
6262
Rcc::enable<Peripheral::Dma2>();
63+
%% if target.string.startswith("stm32f100")
64+
// TODO: Enable remap of DMA2_Channel5 IRQ
65+
// AFIO->MAPR2 |= AFIO_MAPR2_MISC_REMAP;
66+
%% endif
67+
}
6368
%% endif
6469
%% if dmaType in ["stm32-mux"]:
6570
Rcc::enable<Peripheral::Dmamux1>();

src/modm/platform/dma/stm32/module.lb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ def prepare(module, options):
4444

4545

4646
def get_irq_list(device):
47-
irqs = [v["name"] for v in device.get_driver("core")["vector"]]
48-
irqs = [v for v in irqs if v.startswith("DMA") and v[3].isdigit() and not "DMA2D" in v]
47+
irqs = {v["position"]: v["name"] for v in device.get_driver("core")["vector"]}
48+
irqs = [v for v in irqs.values() if v.startswith("DMA") and v[3].isdigit() and not "DMA2D" in v]
4949

5050
instance_pattern = re.compile("(DMA\d_(Ch|Channel)\d(_\d)*)")
5151
channel_pattern = re.compile("DMA(?P<instance>\d)_(Channel|Ch)(?P<channels>(\d(_\d)*))")

0 commit comments

Comments
 (0)