Biomimetics MBED Library w/ Added Support for CAN3

Dependents:   CAN_TEST SPIne_Plus_DYNO_SENSORS SPIne_Plus_v2 SPIne_Plus_Dyno_v2

Files at this revision

API Documentation at this revision

Comitter:
adimmit
Date:
Tue Mar 09 20:33:24 2021 +0000
Parent:
2:0edeaf13dfb2
Commit message:
added CAN3

Changed in this revision

targets/TARGET_STM/TARGET_STM32F7/can_device.h Show annotated file Show diff for this revision Revisions of this file
targets/TARGET_STM/can_api.c Show annotated file Show diff for this revision Revisions of this file
--- 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
--- 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;
     }