Biomimetics MBED Library w/ Added Support for CAN3
Dependents: CAN_TEST SPIne_Plus_DYNO_SENSORS SPIne_Plus_v2 SPIne_Plus_Dyno_v2
Revision 3:993b4d6ff61e, committed 2021-03-09
- Comitter:
- adimmit
- Date:
- Tue Mar 09 20:33:24 2021 +0000
- Parent:
- 2:0edeaf13dfb2
- Commit message:
- added CAN3
Changed in this revision
diff -r 0edeaf13dfb2 -r 993b4d6ff61e targets/TARGET_STM/TARGET_STM32F7/can_device.h --- a/targets/TARGET_STM/TARGET_STM32F7/can_device.h Thu Feb 04 20:44:34 2021 +0000 +++ b/targets/TARGET_STM/TARGET_STM32F7/can_device.h Tue Mar 09 20:33:24 2021 +0000 @@ -49,6 +49,17 @@ #define CAN2_IRQ_BUS_IRQN CAN2_SCE_IRQn #define CAN2_IRQ_BUS_VECT CAN2_SCE_IRQHandler +#define CAN3_IRQ_RX_IRQN CAN3_RX0_IRQn +#define CAN3_IRQ_RX_VECT CAN3_RX0_IRQHandler +#define CAN3_IRQ_TX_IRQN CAN3_TX_IRQn +#define CAN3_IRQ_TX_VECT CAN3_TX_IRQHandler +#define CAN3_IRQ_ERROR_IRQN CAN3_SCE_IRQn +#define CAN3_IRQ_ERROR_VECT CAN3_SCE_IRQHandler +#define CAN3_IRQ_PASSIVE_IRQN CAN3_SCE_IRQn +#define CAN3_IRQ_PASSIVE_VECT CAN3_SCE_IRQHandler +#define CAN3_IRQ_BUS_IRQN CAN3_SCE_IRQn +#define CAN3_IRQ_BUS_VECT CAN3_SCE_IRQHandler + #endif // DEVICE_CAN #endif
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; }