diff --git a/targets/TARGET_STM/can_api.c b/targets/TARGET_STM/can_api.c index e80e74171e..c134aa5d1e 100644 --- a/targets/TARGET_STM/can_api.c +++ b/targets/TARGET_STM/can_api.c @@ -76,6 +76,11 @@ static void _can_init_freq_direct(can_t *obj, const can_pinmap_t *pinmap, int hz else if (pinmap->peripheral == CAN_2) { obj->index = 1; } +#endif +#if defined(FDCAN3_BASE) + else if (pinmap->peripheral == CAN_3) { + obj->index = 2; + } #endif else { error("can_init wrong instance\n"); @@ -199,6 +204,12 @@ void can_irq_free(can_t *obj) HAL_NVIC_DisableIRQ(FDCAN2_IT0_IRQn); HAL_NVIC_DisableIRQ(FDCAN2_IT1_IRQn); } +#endif +#if defined(FDCAN3_BASE) + else if (can == CAN_3) { + HAL_NVIC_DisableIRQ(FDCAN3_IT0_IRQn); + HAL_NVIC_DisableIRQ(FDCAN3_IT1_IRQn); + } #endif else { return; @@ -505,6 +516,17 @@ void FDCAN2_IT1_IRQHandler(void) can_irq(CAN_2, 1); } +void FDCAN3_IT0_IRQHandler(void) +{ + can_irq(CAN_3, 2); +} + +void FDCAN3_IT1_IRQHandler(void) +{ + can_irq(CAN_3, 2); +} + + // TODO Add other interrupts ? void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable) { @@ -549,6 +571,12 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable) NVIC_SetVector(FDCAN2_IT1_IRQn, (uint32_t)&FDCAN2_IT1_IRQHandler); NVIC_EnableIRQ(FDCAN2_IT1_IRQn); #endif +#if defined(FDCAN3_BASE) + NVIC_SetVector(FDCAN3_IT0_IRQn, (uint32_t)&FDCAN3_IT0_IRQHandler); + NVIC_EnableIRQ(FDCAN3_IT0_IRQn); + NVIC_SetVector(FDCAN3_IT1_IRQn, (uint32_t)&FDCAN3_IT1_IRQHandler); + NVIC_EnableIRQ(FDCAN3_IT1_IRQn); +#endif } #else /* FDCAN1 */