@@ -57,12 +57,18 @@ void can_init_freq (can_t *obj, PinName rd, PinName td, int hz)
57
57
__HAL_RCC_CAN1_CLK_ENABLE ();
58
58
obj -> index = 0 ;
59
59
}
60
- #if defined(CAN2_BASE ) && (CAN_NUM == 2 )
60
+ #if defined(CAN2_BASE ) && (CAN_NUM > 1 )
61
61
else if (can == CAN_2 ) {
62
62
__HAL_RCC_CAN1_CLK_ENABLE (); // needed to set filters
63
63
__HAL_RCC_CAN2_CLK_ENABLE ();
64
64
obj -> index = 1 ;
65
65
}
66
+ #endif
67
+ #if defined(CAN3_BASE ) && (CAN_NUM > 2 )
68
+ else if (can == CAN_3 ) {
69
+ __HAL_RCC_CAN3_CLK_ENABLE ();
70
+ obj -> index = 2 ;
71
+ }
66
72
#endif
67
73
else {
68
74
return ;
@@ -126,13 +132,20 @@ void can_free(can_t *obj)
126
132
__HAL_RCC_CAN1_RELEASE_RESET ();
127
133
__HAL_RCC_CAN1_CLK_DISABLE ();
128
134
}
129
- #if defined(CAN2_BASE ) && (CAN_NUM == 2 )
135
+ #if defined(CAN2_BASE ) && (CAN_NUM > 1 )
130
136
if (can == CAN_2 ) {
131
137
__HAL_RCC_CAN2_FORCE_RESET ();
132
138
__HAL_RCC_CAN2_RELEASE_RESET ();
133
139
__HAL_RCC_CAN2_CLK_DISABLE ();
134
140
}
135
141
#endif
142
+ #if defined(CAN3_BASE ) && (CAN_NUM > 2 )
143
+ if (can == CAN_3 ) {
144
+ __HAL_RCC_CAN3_FORCE_RESET ();
145
+ __HAL_RCC_CAN3_RELEASE_RESET ();
146
+ __HAL_RCC_CAN3_CLK_DISABLE ();
147
+ }
148
+ #endif
136
149
}
137
150
138
151
// The following table is used to program bit_timing. It is an adjustment of the sample
@@ -549,7 +562,7 @@ void CAN1_SCE_IRQHandler(void)
549
562
{
550
563
can_irq (CAN_1 , 0 );
551
564
}
552
- #if defined(CAN2_BASE ) && (CAN_NUM == 2 )
565
+ #if defined(CAN2_BASE ) && (CAN_NUM > 1 )
553
566
void CAN2_RX0_IRQHandler (void )
554
567
{
555
568
can_irq (CAN_2 , 1 );
@@ -562,7 +575,21 @@ void CAN2_SCE_IRQHandler(void)
562
575
{
563
576
can_irq (CAN_2 , 1 );
564
577
}
565
- #endif // defined(CAN2_BASE) && (CAN_NUM == 2)
578
+ #endif
579
+ #if defined(CAN3_BASE ) && (CAN_NUM > 2 )
580
+ void CAN3_RX0_IRQHandler (void )
581
+ {
582
+ can_irq (CAN_3 , 1 );
583
+ }
584
+ void CAN3_TX_IRQHandler (void )
585
+ {
586
+ can_irq (CAN_3 , 1 );
587
+ }
588
+ void CAN3_SCE_IRQHandler (void )
589
+ {
590
+ can_irq (CAN_3 , 1 );
591
+ }
592
+ #endif
566
593
#endif // else
567
594
568
595
void can_irq_set (can_t * obj , CanIrqType type , uint32_t enable )
@@ -603,7 +630,7 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
603
630
return ;
604
631
}
605
632
}
606
- #if defined(CAN2_BASE ) && (CAN_NUM == 2 )
633
+ #if defined(CAN2_BASE ) && (CAN_NUM > 1 )
607
634
else if ((CANName ) can == CAN_2 ) {
608
635
switch (type ) {
609
636
case IRQ_RX :
@@ -635,6 +662,39 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
635
662
return ;
636
663
}
637
664
}
665
+ #endif
666
+ #if defined(CAN3_BASE ) && (CAN_NUM > 2 )
667
+ else if ((CANName ) can == CAN_3 ) {
668
+ switch (type ) {
669
+ case IRQ_RX :
670
+ ier = CAN_IT_FMP0 ;
671
+ irq_n = CAN3_IRQ_RX_IRQN ;
672
+ vector = (uint32_t )& CAN3_IRQ_RX_VECT ;
673
+ break ;
674
+ case IRQ_TX :
675
+ ier = CAN_IT_TME ;
676
+ irq_n = CAN3_IRQ_TX_IRQN ;
677
+ vector = (uint32_t )& CAN3_IRQ_TX_VECT ;
678
+ break ;
679
+ case IRQ_ERROR :
680
+ ier = CAN_IT_ERR ;
681
+ irq_n = CAN3_IRQ_ERROR_IRQN ;
682
+ vector = (uint32_t )& CAN3_IRQ_ERROR_VECT ;
683
+ break ;
684
+ case IRQ_PASSIVE :
685
+ ier = CAN_IT_EPV ;
686
+ irq_n = CAN3_IRQ_PASSIVE_IRQN ;
687
+ vector = (uint32_t )& CAN3_IRQ_PASSIVE_VECT ;
688
+ break ;
689
+ case IRQ_BUS :
690
+ ier = CAN_IT_BOF ;
691
+ irq_n = CAN3_IRQ_BUS_IRQN ;
692
+ vector = (uint32_t )& CAN3_IRQ_BUS_VECT ;
693
+ break ;
694
+ default :
695
+ return ;
696
+ }
697
+ }
638
698
#endif
639
699
else {
640
700
return ;
0 commit comments