90
90
// register in an atomic fashion by using bitband addressing.
91
91
#define EXTI_MODE_BB (mode , line ) (*(__IO uint32_t *)(PERIPH_BB_BASE + ((EXTI_OFFSET + (mode)) * 32) + ((line) * 4)))
92
92
93
+ #if defined(MCU_SERIES_L4 )
94
+ // The L4 MCU supports 40 Events/IRQs lines of the type configurable and direct.
95
+ // Here we only support configurable line types. Details, see page 330 of RM0351, Rev 1.
96
+ // The USB_FS_WAKUP event is a direct type and there is no support for it.
97
+ #define EXTI_Mode_Interrupt offsetof(EXTI_TypeDef, IMR1)
98
+ #define EXTI_Mode_Event offsetof(EXTI_TypeDef, EMR1)
99
+ #else
93
100
#define EXTI_Mode_Interrupt offsetof(EXTI_TypeDef, IMR)
94
101
#define EXTI_Mode_Event offsetof(EXTI_TypeDef, EMR)
102
+ #endif
95
103
96
104
#define EXTI_SWIER_BB (line ) (*(__IO uint32_t *)(PERIPH_BB_BASE + ((EXTI_OFFSET + offsetof(EXTI_TypeDef, SWIER)) * 32) + ((line) * 4)))
97
105
@@ -108,13 +116,26 @@ STATIC uint32_t pyb_extint_mode[EXTI_NUM_VECTORS];
108
116
#if !defined(OTG_HS_WKUP_IRQn )
109
117
#define OTG_HS_WKUP_IRQn 76 // Some MCUs don't have HS, but we want a value to put in our table
110
118
#endif
119
+ #if !defined(OTG_FS_WKUP_IRQn )
120
+ #define OTG_FS_WKUP_IRQn 42 // Some MCUs don't have FS IRQ, but we want a value to put in our table
121
+ #endif
111
122
112
123
STATIC const uint8_t nvic_irq_channel [EXTI_NUM_VECTORS ] = {
113
124
EXTI0_IRQn , EXTI1_IRQn , EXTI2_IRQn , EXTI3_IRQn , EXTI4_IRQn ,
114
125
EXTI9_5_IRQn , EXTI9_5_IRQn , EXTI9_5_IRQn , EXTI9_5_IRQn , EXTI9_5_IRQn ,
115
126
EXTI15_10_IRQn , EXTI15_10_IRQn , EXTI15_10_IRQn , EXTI15_10_IRQn , EXTI15_10_IRQn ,
116
- EXTI15_10_IRQn , PVD_IRQn , RTC_Alarm_IRQn , OTG_FS_WKUP_IRQn , ETH_WKUP_IRQn ,
117
- OTG_HS_WKUP_IRQn , TAMP_STAMP_IRQn , RTC_WKUP_IRQn
127
+ EXTI15_10_IRQn ,
128
+ #if defined(MCU_SERIES_L4 )
129
+ PVD_PVM_IRQn ,
130
+ #else
131
+ PVD_IRQn ,
132
+ #endif
133
+ RTC_Alarm_IRQn ,
134
+ OTG_FS_WKUP_IRQn ,
135
+ ETH_WKUP_IRQn ,
136
+ OTG_HS_WKUP_IRQn ,
137
+ TAMP_STAMP_IRQn ,
138
+ RTC_WKUP_IRQn ,
118
139
};
119
140
120
141
// Set override_callback_obj to true if you want to unconditionally set the
@@ -230,7 +251,11 @@ void extint_swint(uint line) {
230
251
if (line >= EXTI_NUM_VECTORS ) {
231
252
return ;
232
253
}
254
+ #if defined(MCU_SERIES_L4 )
255
+ EXTI -> SWIER1 = (1 << line );
256
+ #else
233
257
EXTI -> SWIER = (1 << line );
258
+ #endif
234
259
}
235
260
236
261
/// \method line()
@@ -273,12 +298,27 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(extint_obj_swint_obj, extint_obj_swint);
273
298
/// \classmethod regs()
274
299
/// Dump the values of the EXTI registers.
275
300
STATIC mp_obj_t extint_regs (void ) {
301
+ #if defined(MCU_SERIES_L4 )
302
+ printf ("EXTI_IMR1 %08lx\n" , EXTI -> IMR1 );
303
+ printf ("EXTI_IMR2 %08lx\n" , EXTI -> IMR2 );
304
+ printf ("EXTI_EMR1 %08lx\n" , EXTI -> EMR1 );
305
+ printf ("EXTI_EMR2 %08lx\n" , EXTI -> EMR2 );
306
+ printf ("EXTI_RTSR1 %08lx\n" , EXTI -> RTSR1 );
307
+ printf ("EXTI_RTSR2 %08lx\n" , EXTI -> RTSR2 );
308
+ printf ("EXTI_FTSR1 %08lx\n" , EXTI -> FTSR1 );
309
+ printf ("EXTI_FTSR2 %08lx\n" , EXTI -> FTSR2 );
310
+ printf ("EXTI_SWIER1 %08lx\n" , EXTI -> SWIER1 );
311
+ printf ("EXTI_SWIER2 %08lx\n" , EXTI -> SWIER2 );
312
+ printf ("EXTI_PR1 %08lx\n" , EXTI -> PR1 );
313
+ printf ("EXTI_PR2 %08lx\n" , EXTI -> PR2 );
314
+ #else
276
315
printf ("EXTI_IMR %08lx\n" , EXTI -> IMR );
277
316
printf ("EXTI_EMR %08lx\n" , EXTI -> EMR );
278
317
printf ("EXTI_RTSR %08lx\n" , EXTI -> RTSR );
279
318
printf ("EXTI_FTSR %08lx\n" , EXTI -> FTSR );
280
319
printf ("EXTI_SWIER %08lx\n" , EXTI -> SWIER );
281
320
printf ("EXTI_PR %08lx\n" , EXTI -> PR );
321
+ #endif
282
322
return mp_const_none ;
283
323
}
284
324
STATIC MP_DEFINE_CONST_FUN_OBJ_0 (extint_regs_fun_obj , extint_regs );
0 commit comments