Skip to content

Commit 0280b2c

Browse files
author
Krzysztof Blazewicz
committed
stmhal/i2c: handle I2C IRQs
This is required by HAL Driver for error handling since v1.5.0
1 parent fa833f9 commit 0280b2c

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

stmhal/i2c.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,24 @@ void i2c_init(I2C_HandleTypeDef *i2c) {
253253
const pyb_i2c_obj_t *self = &pyb_i2c_obj[i2c_unit - 1];
254254
dma_invalidate_channel(self->tx_dma_descr);
255255
dma_invalidate_channel(self->rx_dma_descr);
256+
257+
if (0) {
258+
#if defined(MICROPY_HW_I2C1_SCL)
259+
} else if (i2c->Instance == I2C1) {
260+
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
261+
HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
262+
#endif
263+
#if defined(MICROPY_HW_I2C2_SCL)
264+
} else if (i2c->Instance == I2C2) {
265+
HAL_NVIC_EnableIRQ(I2C2_EV_IRQn);
266+
HAL_NVIC_EnableIRQ(I2C2_ER_IRQn);
267+
#endif
268+
#if defined(MICROPY_HW_I2C3_SCL)
269+
} else if (i2c->Instance == I2C3) {
270+
HAL_NVIC_EnableIRQ(I2C3_EV_IRQn);
271+
HAL_NVIC_EnableIRQ(I2C3_ER_IRQn);
272+
#endif
273+
}
256274
}
257275

258276
void i2c_deinit(I2C_HandleTypeDef *i2c) {
@@ -263,18 +281,24 @@ void i2c_deinit(I2C_HandleTypeDef *i2c) {
263281
__I2C1_FORCE_RESET();
264282
__I2C1_RELEASE_RESET();
265283
__I2C1_CLK_DISABLE();
284+
HAL_NVIC_DisableIRQ(I2C1_EV_IRQn);
285+
HAL_NVIC_DisableIRQ(I2C1_ER_IRQn);
266286
#endif
267287
#if defined(MICROPY_HW_I2C2_SCL)
268288
} else if (i2c->Instance == I2C2) {
269289
__I2C2_FORCE_RESET();
270290
__I2C2_RELEASE_RESET();
271291
__I2C2_CLK_DISABLE();
292+
HAL_NVIC_DisableIRQ(I2C2_EV_IRQn);
293+
HAL_NVIC_DisableIRQ(I2C2_ER_IRQn);
272294
#endif
273295
#if defined(MICROPY_HW_I2C3_SCL)
274296
} else if (i2c->Instance == I2C3) {
275297
__I2C3_FORCE_RESET();
276298
__I2C3_RELEASE_RESET();
277299
__I2C3_CLK_DISABLE();
300+
HAL_NVIC_DisableIRQ(I2C3_EV_IRQn);
301+
HAL_NVIC_DisableIRQ(I2C3_ER_IRQn);
278302
#endif
279303
}
280304
}

stmhal/stm32_it.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,12 @@
7979
#include "storage.h"
8080
#include "can.h"
8181
#include "dma.h"
82+
#include "i2c.h"
8283

8384
extern void __fatal_error(const char*);
8485
extern PCD_HandleTypeDef pcd_fs_handle;
8586
extern PCD_HandleTypeDef pcd_hs_handle;
87+
8688
/******************************************************************************/
8789
/* Cortex-M4 Processor Exceptions Handlers */
8890
/******************************************************************************/
@@ -700,3 +702,45 @@ void CAN2_RX1_IRQHandler(void) {
700702
IRQ_EXIT(CAN2_RX1_IRQn);
701703
}
702704
#endif // MICROPY_HW_ENABLE_CAN
705+
706+
#if defined(MICROPY_HW_I2C1_SCL)
707+
void I2C1_EV_IRQHandler(void) {
708+
IRQ_ENTER(I2C1_EV_IRQn);
709+
HAL_I2C_EV_IRQHandler(&I2CHandle1);
710+
IRQ_EXIT(I2C1_EV_IRQn);
711+
}
712+
713+
void I2C1_ER_IRQHandler(void) {
714+
IRQ_ENTER(I2C1_ER_IRQn);
715+
HAL_I2C_ER_IRQHandler(&I2CHandle1);
716+
IRQ_EXIT(I2C1_ER_IRQn);
717+
}
718+
#endif // defined(MICROPY_HW_I2C1_SCL)
719+
720+
#if defined(MICROPY_HW_I2C2_SCL)
721+
void I2C2_EV_IRQHandler(void) {
722+
IRQ_ENTER(I2C2_EV_IRQn);
723+
HAL_I2C_EV_IRQHandler(&I2CHandle2);
724+
IRQ_EXIT(I2C2_EV_IRQn);
725+
}
726+
727+
void I2C2_ER_IRQHandler(void) {
728+
IRQ_ENTER(I2C2_ER_IRQn);
729+
HAL_I2C_ER_IRQHandler(&I2CHandle2);
730+
IRQ_EXIT(I2C2_ER_IRQn);
731+
}
732+
#endif // defined(MICROPY_HW_I2C2_SCL)
733+
734+
#if defined(MICROPY_HW_I2C3_SCL)
735+
void I2C3_EV_IRQHandler(void) {
736+
IRQ_ENTER(I2C3_EV_IRQn);
737+
HAL_I2C_EV_IRQHandler(&I2CHandle3);
738+
IRQ_EXIT(I2C3_EV_IRQn);
739+
}
740+
741+
void I2C3_ER_IRQHandler(void) {
742+
IRQ_ENTER(I2C3_ER_IRQn);
743+
HAL_I2C_ER_IRQHandler(&I2CHandle3);
744+
IRQ_EXIT(I2C3_ER_IRQn);
745+
}
746+
#endif // defined(MICROPY_HW_I2C3_SCL)

0 commit comments

Comments
 (0)