@@ -68,7 +68,11 @@ static void _can_init_freq_direct(can_t *obj, const can_pinmap_t *pinmap, int hz
68
68
{
69
69
MBED_ASSERT ((int )pinmap -> peripheral != NC );
70
70
71
+ #if defined(__HAL_RCC_FDCAN1_CLK_ENABLE )
72
+ __HAL_RCC_FDCAN1_CLK_ENABLE ();
73
+ #else
71
74
__HAL_RCC_FDCAN_CLK_ENABLE ();
75
+ #endif
72
76
73
77
if (pinmap -> peripheral == CAN_1 ) {
74
78
obj -> index = 0 ;
@@ -90,8 +94,13 @@ static void _can_init_freq_direct(can_t *obj, const can_pinmap_t *pinmap, int hz
90
94
91
95
// Select PLL1Q as source of FDCAN clock
92
96
RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit ;
97
+ #if (defined RCC_PERIPHCLK_FDCAN1 )
98
+ RCC_PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_FDCAN1 ;
99
+ RCC_PeriphClkInit .Fdcan1ClockSelection = RCC_FDCAN1CLKSOURCE_PLL1 ;
100
+ #else
93
101
RCC_PeriphClkInit .PeriphClockSelection = RCC_PERIPHCLK_FDCAN ;
94
- RCC_PeriphClkInit .FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL ; // 10 MHz (RCC_OscInitStruct.PLL.PLLQ = 80)
102
+ RCC_PeriphClkInit .FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL ;
103
+ #endif
95
104
#if defined(DUAL_CORE ) && (TARGET_STM32H7 )
96
105
while (LL_HSEM_1StepLock (HSEM , CFG_HW_RCC_SEMID )) {
97
106
}
@@ -128,14 +137,18 @@ static void _can_init_freq_direct(can_t *obj, const can_pinmap_t *pinmap, int hz
128
137
// !Attention Not all bitrates can be covered with all fdcan-core-clk values. When a clk
129
138
// does not work for the desired bitrate, change system_clock settings for FDCAN_CLK
130
139
// (default FDCAN_CLK is PLLQ)
131
- #ifdef TARGET_STM32G4
132
- int ntq = HAL_RCCEx_GetPeriphCLKFreq (RCC_PERIPHCLK_FDCAN ) / hz ;
133
- #else
140
+ #if (defined TARGET_STM32H7 )
134
141
// STM32H7 doesn't support yet HAL_RCCEx_GetPeriphCLKFreq for FDCAN
135
142
// We use PLL1.Q clock right now so get its frequency
136
143
PLL1_ClocksTypeDef pll1_clocks ;
137
144
HAL_RCCEx_GetPLL1ClockFreq (& pll1_clocks );
138
145
int ntq = pll1_clocks .PLL1_Q_Frequency / hz ;
146
+ #else
147
+ #if (defined RCC_PERIPHCLK_FDCAN1 )
148
+ int ntq = HAL_RCCEx_GetPeriphCLKFreq (RCC_PERIPHCLK_FDCAN1 ) / hz ;
149
+ #else
150
+ int ntq = HAL_RCCEx_GetPeriphCLKFreq (RCC_PERIPHCLK_FDCAN ) / hz ;
151
+ #endif
139
152
#endif
140
153
141
154
int nominalPrescaler = 1 ;
@@ -250,7 +263,7 @@ void can_irq_free(can_t *obj)
250
263
else {
251
264
return ;
252
265
}
253
- #ifndef TARGET_STM32G4
266
+ #if (defined TARGET_STM32H7 )
254
267
HAL_NVIC_DisableIRQ (FDCAN_CAL_IRQn );
255
268
#endif
256
269
can_irq_ids [obj -> index ] = 0 ;
@@ -262,12 +275,21 @@ void can_free(can_t *obj)
262
275
while (LL_HSEM_1StepLock (HSEM , CFG_HW_RCC_SEMID )) {
263
276
}
264
277
#endif /* DUAL_CORE */
278
+ #if defined(__HAL_RCC_FDCAN1_FORCE_RESET )
279
+ __HAL_RCC_FDCAN1_FORCE_RESET ();
280
+ __HAL_RCC_FDCAN1_RELEASE_RESET ();
281
+ #else
265
282
__HAL_RCC_FDCAN_FORCE_RESET ();
266
283
__HAL_RCC_FDCAN_RELEASE_RESET ();
284
+ #endif
267
285
#if defined(DUAL_CORE ) && (TARGET_STM32H7 )
268
286
LL_HSEM_ReleaseLock (HSEM , CFG_HW_RCC_SEMID , HSEM_CR_COREID_CURRENT );
269
287
#endif /* DUAL_CORE */
288
+ #if defined(__HAL_RCC_FDCAN1_CLK_DISABLE )
289
+ __HAL_RCC_FDCAN1_CLK_DISABLE ();
290
+ #else
270
291
__HAL_RCC_FDCAN_CLK_DISABLE ();
292
+ #endif
271
293
}
272
294
273
295
@@ -296,13 +318,17 @@ int can_frequency(can_t *obj, int f)
296
318
* does not work for the desired bitrate, change system_clock settings for FDCAN_CLK
297
319
* (default FDCAN_CLK is PLLQ)
298
320
*/
299
- #ifdef TARGET_STM32G4
300
- int ntq = HAL_RCCEx_GetPeriphCLKFreq (RCC_PERIPHCLK_FDCAN ) / f ;
301
- #else
321
+ #if (defined TARGET_STM32H7 )
302
322
// STM32H7 doesn't support yet HAL_RCCEx_GetPeriphCLKFreq for FDCAN
303
323
PLL1_ClocksTypeDef pll1_clocks ;
304
324
HAL_RCCEx_GetPLL1ClockFreq (& pll1_clocks );
305
325
int ntq = pll1_clocks .PLL1_Q_Frequency / f ;
326
+ #else
327
+ #if (defined RCC_PERIPHCLK_FDCAN1 )
328
+ int ntq = HAL_RCCEx_GetPeriphCLKFreq (RCC_PERIPHCLK_FDCAN1 ) / f ;
329
+ #else
330
+ int ntq = HAL_RCCEx_GetPeriphCLKFreq (RCC_PERIPHCLK_FDCAN ) / f ;
331
+ #endif
306
332
#endif
307
333
308
334
int nominalPrescaler = 1 ;
@@ -520,7 +546,7 @@ static void can_irq(CANName name, int id)
520
546
irq_handler (can_irq_ids [id ], IRQ_TX );
521
547
}
522
548
}
523
- #ifndef TARGET_STM32G4
549
+ #if (defined FDCAN_IT_RX_BUFFER_NEW_MESSAGE )
524
550
if (__HAL_FDCAN_GET_IT_SOURCE (& CanHandle , FDCAN_IT_RX_BUFFER_NEW_MESSAGE )) {
525
551
if (__HAL_FDCAN_GET_FLAG (& CanHandle , FDCAN_IT_RX_BUFFER_NEW_MESSAGE )) {
526
552
__HAL_FDCAN_CLEAR_FLAG (& CanHandle , FDCAN_IT_RX_BUFFER_NEW_MESSAGE );
@@ -602,7 +628,7 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
602
628
interrupts = FDCAN_IT_TX_COMPLETE ;
603
629
break ;
604
630
case IRQ_RX :
605
- #ifndef TARGET_STM32G4
631
+ #if (defined FDCAN_IT_RX_BUFFER_NEW_MESSAGE )
606
632
interrupts = FDCAN_IT_RX_BUFFER_NEW_MESSAGE ;
607
633
#else
608
634
interrupts = FDCAN_IT_RX_FIFO0_NEW_MESSAGE ;
0 commit comments