Skip to content

Commit 7604de3

Browse files
author
Krzysztof Blazewicz
committed
stmhal/can: clear FIFO flags in IRQ handler
HAL Driver before v1.4.2 had a bug which caused clearing all pending flags in MSR, TSR, RF0R and RF1R instead of only the requested one. This is why micropython got away without explicitly clearing flags in IRQ handler.
1 parent dc1ac5d commit 7604de3

1 file changed

Lines changed: 4 additions & 0 deletions

File tree

stmhal/can.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,6 +752,8 @@ STATIC mp_obj_t pyb_can_rxcallback(mp_obj_t self_in, mp_obj_t fifo_in, mp_obj_t
752752
__HAL_CAN_DISABLE_IT(&self->can, (fifo == 0) ? CAN_IT_FMP0 : CAN_IT_FMP1);
753753
__HAL_CAN_DISABLE_IT(&self->can, (fifo == 0) ? CAN_IT_FF0 : CAN_IT_FF1);
754754
__HAL_CAN_DISABLE_IT(&self->can, (fifo == 0) ? CAN_IT_FOV0 : CAN_IT_FOV1);
755+
__HAL_CAN_CLEAR_FLAG(&self->can, (fifo == CAN_FIFO0) ? CAN_FLAG_FF0 : CAN_FLAG_FF1);
756+
__HAL_CAN_CLEAR_FLAG(&self->can, (fifo == CAN_FIFO0) ? CAN_FLAG_FOV0 : CAN_FLAG_FOV1);
755757
*callback = mp_const_none;
756758
} else if (*callback != mp_const_none) {
757759
// Rx call backs has already been initialized
@@ -847,11 +849,13 @@ void can_rx_irq_handler(uint can_id, uint fifo_id) {
847849
break;
848850
case RX_STATE_MESSAGE_PENDING:
849851
__HAL_CAN_DISABLE_IT(&self->can, (fifo_id == CAN_FIFO0) ? CAN_IT_FF0 : CAN_IT_FF1);
852+
__HAL_CAN_CLEAR_FLAG(&self->can, (fifo_id == CAN_FIFO0) ? CAN_FLAG_FF0 : CAN_FLAG_FF1);
850853
irq_reason = MP_OBJ_NEW_SMALL_INT(1);
851854
*state = RX_STATE_FIFO_FULL;
852855
break;
853856
case RX_STATE_FIFO_FULL:
854857
__HAL_CAN_DISABLE_IT(&self->can, (fifo_id == CAN_FIFO0) ? CAN_IT_FOV0 : CAN_IT_FOV1);
858+
__HAL_CAN_CLEAR_FLAG(&self->can, (fifo_id == CAN_FIFO0) ? CAN_FLAG_FOV0 : CAN_FLAG_FOV1);
855859
irq_reason = MP_OBJ_NEW_SMALL_INT(2);
856860
*state = RX_STATE_FIFO_OVERFLOW;
857861
break;

0 commit comments

Comments
 (0)