Biomimetics MBED Library w/ Added Support for CAN3
Dependents: CAN_TEST SPIne_Plus_DYNO_SENSORS SPIne_Plus_v2 SPIne_Plus_Dyno_v2
Diff: targets/TARGET_STM/can_api.c
- Revision:
- 3:993b4d6ff61e
- Parent:
- 0:083111ae2a11
diff -r 0edeaf13dfb2 -r 993b4d6ff61e targets/TARGET_STM/can_api.c --- a/targets/TARGET_STM/can_api.c Thu Feb 04 20:44:34 2021 +0000 +++ b/targets/TARGET_STM/can_api.c Tue Mar 09 20:33:24 2021 +0000 @@ -53,7 +53,7 @@ MBED_ASSERT((int)can != NC); - if (can == CAN_1) { + if (can == CAN_1) { //NOTE CAN1 and CAN3 are independent, CAN2 must have CAN1 running (slave only) __HAL_RCC_CAN1_CLK_ENABLE(); obj->index = 0; } @@ -64,6 +64,10 @@ obj->index = 1; } #endif + else if (can == CAN_3) { //EDITED + __HAL_RCC_CAN3_CLK_ENABLE(); //EDITED + obj->index = 2; //EDITED + } else { return; } @@ -133,6 +137,11 @@ __HAL_RCC_CAN2_CLK_DISABLE(); } #endif + if (can == CAN_3) { + __HAL_RCC_CAN3_FORCE_RESET(); //EDITED + __HAL_RCC_CAN3_RELEASE_RESET(); //EDITED + __HAL_RCC_CAN3_CLK_DISABLE(); //EDITED + } } // The following table is used to program bit_timing. It is an adjustment of the sample @@ -565,6 +574,40 @@ #endif // defined(CAN2_BASE) && (CAN_NUM == 2) #endif // else +//ADDIING IN CAN3 +#if defined(TARGET_STM32F0) // Starting here is ADDED CODE /* +void CAN_IRQHandler(void) +{ + can_irq(CAN_3, 0); +} +#elif defined(TARGET_STM32F3) +void CAN_RX0_IRQHandler(void) +{ + can_irq(CAN_3, 0); +} +void CAN_TX_IRQHandler(void) +{ + can_irq(CAN_3, 0); +} +void CAN_SCE_IRQHandler(void) +{ + can_irq(CAN_3, 0); +} +#else +void CAN3_RX0_IRQHandler(void) +{ + can_irq(CAN_3, 0); +} +void CAN3_TX_IRQHandler(void) +{ + can_irq(CAN_3, 0); +} +void CAN3_SCE_IRQHandler(void) +{ + can_irq(CAN_3, 0); +} +#endif // else */ Ending here is ADDED CODE // + void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable) { CAN_TypeDef *can = obj->CanHandle.Instance; @@ -636,6 +679,39 @@ } } #endif + //ADDED CODE FOR CAN3 + else if ((CANName) can == CAN_3) { // STARTING HERE IS ADDED CODE /* + switch (type) { + case IRQ_RX: + ier = CAN_IT_FMP0; + irq_n = CAN3_IRQ_RX_IRQN; //CAUSED AN ERROR ON FIRST COMPILE + vector = (uint32_t)&CAN3_IRQ_RX_VECT; + break; + case IRQ_TX: + ier = CAN_IT_TME; + irq_n = CAN3_IRQ_TX_IRQN; + vector = (uint32_t)&CAN3_IRQ_TX_VECT; + break; + case IRQ_ERROR: + ier = CAN_IT_ERR; + irq_n = CAN3_IRQ_ERROR_IRQN; + vector = (uint32_t)&CAN3_IRQ_ERROR_VECT; + break; + case IRQ_PASSIVE: + ier = CAN_IT_EPV; + irq_n = CAN3_IRQ_PASSIVE_IRQN; + vector = (uint32_t)&CAN3_IRQ_PASSIVE_VECT; + break; + case IRQ_BUS: + ier = CAN_IT_BOF; + irq_n = CAN3_IRQ_BUS_IRQN; + vector = (uint32_t)&CAN3_IRQ_BUS_VECT; // ENDING HERE IS ADDED CODE + break; + default: + return; + } + } + else { return; }