25
25
#include <math.h>
26
26
#include <string.h>
27
27
28
- static CAN_HandleTypeDef CanHandle ;
29
28
static uint32_t can_irq_ids [CAN_NUM ] = {0 };
30
29
static can_irq_handler irq_handler ;
31
30
@@ -38,16 +37,16 @@ void can_init_freq (can_t *obj, PinName rd, PinName td, int hz)
38
37
{
39
38
CANName can_rd = (CANName )pinmap_peripheral (rd , PinMap_CAN_RD );
40
39
CANName can_td = (CANName )pinmap_peripheral (td , PinMap_CAN_TD );
40
+ CANName can = (CANName )pinmap_merge (can_rd , can_td );
41
41
42
- obj -> can = (CANName )pinmap_merge (can_rd , can_td );
43
- MBED_ASSERT ((int )obj -> can != NC );
42
+ MBED_ASSERT ((int )can != NC );
44
43
45
- if (obj -> can == CAN_1 ) {
44
+ if (can == CAN_1 ) {
46
45
__HAL_RCC_CAN1_CLK_ENABLE ();
47
46
obj -> index = 0 ;
48
47
}
49
48
#if defined(CAN2_BASE ) && (CAN_NUM == 2 )
50
- else if (obj -> can == CAN_2 ) {
49
+ else if (can == CAN_2 ) {
51
50
__HAL_RCC_CAN1_CLK_ENABLE (); // needed to set filters
52
51
__HAL_RCC_CAN2_CLK_ENABLE ();
53
52
obj -> index = 1 ;
@@ -67,21 +66,21 @@ void can_init_freq (can_t *obj, PinName rd, PinName td, int hz)
67
66
pin_mode (td , PullUp );
68
67
}
69
68
70
- CanHandle .Instance = (CAN_TypeDef * )( obj -> can ) ;
69
+ obj -> CanHandle .Instance = (CAN_TypeDef * )can ;
71
70
72
- CanHandle .Init .TTCM = DISABLE ;
73
- CanHandle .Init .ABOM = DISABLE ;
74
- CanHandle .Init .AWUM = DISABLE ;
75
- CanHandle .Init .NART = DISABLE ;
76
- CanHandle .Init .RFLM = DISABLE ;
77
- CanHandle .Init .TXFP = DISABLE ;
78
- CanHandle .Init .Mode = CAN_MODE_NORMAL ;
79
- CanHandle .Init .SJW = CAN_SJW_1TQ ;
80
- CanHandle .Init .BS1 = CAN_BS1_6TQ ;
81
- CanHandle .Init .BS2 = CAN_BS2_8TQ ;
82
- CanHandle .Init .Prescaler = 2 ;
71
+ obj -> CanHandle .Init .TTCM = DISABLE ;
72
+ obj -> CanHandle .Init .ABOM = DISABLE ;
73
+ obj -> CanHandle .Init .AWUM = DISABLE ;
74
+ obj -> CanHandle .Init .NART = DISABLE ;
75
+ obj -> CanHandle .Init .RFLM = DISABLE ;
76
+ obj -> CanHandle .Init .TXFP = DISABLE ;
77
+ obj -> CanHandle .Init .Mode = CAN_MODE_NORMAL ;
78
+ obj -> CanHandle .Init .SJW = CAN_SJW_1TQ ;
79
+ obj -> CanHandle .Init .BS1 = CAN_BS1_6TQ ;
80
+ obj -> CanHandle .Init .BS2 = CAN_BS2_8TQ ;
81
+ obj -> CanHandle .Init .Prescaler = 2 ;
83
82
84
- if (HAL_CAN_Init (& CanHandle ) != HAL_OK ) {
83
+ if (HAL_CAN_Init (& obj -> CanHandle ) != HAL_OK ) {
85
84
error ("Cannot initialize CAN" );
86
85
}
87
86
@@ -90,7 +89,7 @@ void can_init_freq (can_t *obj, PinName rd, PinName td, int hz)
90
89
error ("Can frequency could not be set\n" );
91
90
}
92
91
93
- uint32_t filter_number = (obj -> can == CAN_1 ) ? 0 : 14 ;
92
+ uint32_t filter_number = (can == CAN_1 ) ? 0 : 14 ;
94
93
can_filter (obj , 0 , 0 , CANStandard , filter_number );
95
94
}
96
95
@@ -102,7 +101,7 @@ void can_irq_init(can_t *obj, can_irq_handler handler, uint32_t id)
102
101
103
102
void can_irq_free (can_t * obj )
104
103
{
105
- CAN_TypeDef * can = ( CAN_TypeDef * )( obj -> can ) ;
104
+ CAN_TypeDef * can = obj -> CanHandle . Instance ;
106
105
107
106
can -> IER &= ~(CAN_IT_FMP0 | CAN_IT_FMP1 | CAN_IT_TME | \
108
107
CAN_IT_ERR | CAN_IT_EPV | CAN_IT_BOF );
@@ -111,14 +110,15 @@ void can_irq_free(can_t *obj)
111
110
112
111
void can_free (can_t * obj )
113
112
{
113
+ CANName can = (CANName ) obj -> CanHandle .Instance ;
114
114
// Reset CAN and disable clock
115
- if (obj -> can == CAN_1 ) {
115
+ if (can == CAN_1 ) {
116
116
__HAL_RCC_CAN1_FORCE_RESET ();
117
117
__HAL_RCC_CAN1_RELEASE_RESET ();
118
118
__HAL_RCC_CAN1_CLK_DISABLE ();
119
119
}
120
120
#if defined(CAN2_BASE ) && (CAN_NUM == 2 )
121
- if (obj -> can == CAN_2 ) {
121
+ if (can == CAN_2 ) {
122
122
__HAL_RCC_CAN2_FORCE_RESET ();
123
123
__HAL_RCC_CAN2_RELEASE_RESET ();
124
124
__HAL_RCC_CAN2_CLK_DISABLE ();
@@ -196,7 +196,7 @@ int can_frequency(can_t *obj, int f)
196
196
{
197
197
int pclk = HAL_RCC_GetPCLK1Freq ();
198
198
int btr = can_speed (pclk , (unsigned int )f , 1 );
199
- CAN_TypeDef * can = ( CAN_TypeDef * )( obj -> can ) ;
199
+ CAN_TypeDef * can = obj -> CanHandle . Instance ;
200
200
uint32_t tickstart = 0 ;
201
201
int status = 1 ;
202
202
@@ -236,7 +236,7 @@ int can_frequency(can_t *obj, int f)
236
236
int can_write (can_t * obj , CAN_Message msg , int cc )
237
237
{
238
238
uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX ;
239
- CAN_TypeDef * can = ( CAN_TypeDef * )( obj -> can ) ;
239
+ CAN_TypeDef * can = obj -> CanHandle . Instance ;
240
240
241
241
/* Select one empty transmit mailbox */
242
242
if ((can -> TSR & CAN_TSR_TME0 ) == CAN_TSR_TME0 ) {
@@ -279,7 +279,7 @@ int can_read(can_t *obj, CAN_Message *msg, int handle)
279
279
{
280
280
//handle is the FIFO number
281
281
282
- CAN_TypeDef * can = ( CAN_TypeDef * )( obj -> can ) ;
282
+ CAN_TypeDef * can = obj -> CanHandle . Instance ;
283
283
284
284
// check FPM0 which holds the pending message count in FIFO 0
285
285
// if no message is pending, return 0
@@ -324,26 +324,26 @@ int can_read(can_t *obj, CAN_Message *msg, int handle)
324
324
325
325
void can_reset (can_t * obj )
326
326
{
327
- CAN_TypeDef * can = ( CAN_TypeDef * )( obj -> can ) ;
327
+ CAN_TypeDef * can = obj -> CanHandle . Instance ;
328
328
can -> MCR |= CAN_MCR_RESET ;
329
329
can -> ESR = 0x0 ;
330
330
}
331
331
332
332
unsigned char can_rderror (can_t * obj )
333
333
{
334
- CAN_TypeDef * can = ( CAN_TypeDef * )( obj -> can ) ;
334
+ CAN_TypeDef * can = obj -> CanHandle . Instance ;
335
335
return (can -> ESR >> 24 ) & 0xFF ;
336
336
}
337
337
338
338
unsigned char can_tderror (can_t * obj )
339
339
{
340
- CAN_TypeDef * can = ( CAN_TypeDef * )( obj -> can ) ;
340
+ CAN_TypeDef * can = obj -> CanHandle . Instance ;
341
341
return (can -> ESR >> 16 ) & 0xFF ;
342
342
}
343
343
344
344
void can_monitor (can_t * obj , int silent )
345
345
{
346
- CAN_TypeDef * can = ( CAN_TypeDef * )( obj -> can ) ;
346
+ CAN_TypeDef * can = obj -> CanHandle . Instance ;
347
347
348
348
can -> MCR |= CAN_MCR_INRQ ;
349
349
while ((can -> MSR & CAN_MSR_INAK ) != CAN_MSR_INAK ) {
@@ -363,7 +363,7 @@ void can_monitor(can_t *obj, int silent)
363
363
int can_mode (can_t * obj , CanMode mode )
364
364
{
365
365
int success = 0 ;
366
- CAN_TypeDef * can = ( CAN_TypeDef * )( obj -> can ) ;
366
+ CAN_TypeDef * can = obj -> CanHandle . Instance ;
367
367
368
368
can -> MCR |= CAN_MCR_INRQ ;
369
369
while ((can -> MSR & CAN_MSR_INAK ) != CAN_MSR_INAK ) {
@@ -407,7 +407,6 @@ int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t
407
407
408
408
// filter for CANAny format cannot be configured for STM32
409
409
if ((format == CANStandard ) || (format == CANExtended )) {
410
- CanHandle .Instance = (CAN_TypeDef * )(obj -> can );
411
410
CAN_FilterConfTypeDef sFilterConfig ;
412
411
sFilterConfig .FilterNumber = handle ;
413
412
sFilterConfig .FilterMode = CAN_FILTERMODE_IDMASK ;
@@ -429,7 +428,7 @@ int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t
429
428
sFilterConfig .FilterActivation = ENABLE ;
430
429
sFilterConfig .BankNumber = 14 + handle ;
431
430
432
- HAL_CAN_ConfigFilter (& CanHandle , & sFilterConfig );
431
+ HAL_CAN_ConfigFilter (& obj -> CanHandle , & sFilterConfig );
433
432
retval = handle ;
434
433
}
435
434
return retval ;
@@ -438,6 +437,7 @@ int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t
438
437
static void can_irq (CANName name , int id )
439
438
{
440
439
uint32_t tmp1 = 0 , tmp2 = 0 , tmp3 = 0 ;
440
+ CAN_HandleTypeDef CanHandle ;
441
441
CanHandle .Instance = (CAN_TypeDef * )name ;
442
442
443
443
if (__HAL_CAN_GET_IT_SOURCE (& CanHandle , CAN_IT_TME )) {
@@ -535,13 +535,12 @@ void CAN2_SCE_IRQHandler(void)
535
535
536
536
void can_irq_set (can_t * obj , CanIrqType type , uint32_t enable )
537
537
{
538
-
539
- CAN_TypeDef * can = (CAN_TypeDef * )(obj -> can );
538
+ CAN_TypeDef * can = obj -> CanHandle .Instance ;
540
539
IRQn_Type irq_n = (IRQn_Type )0 ;
541
540
uint32_t vector = 0 ;
542
541
uint32_t ier ;
543
542
544
- if (obj -> can == CAN_1 ) {
543
+ if (( CANName ) can == CAN_1 ) {
545
544
switch (type ) {
546
545
case IRQ_RX :
547
546
ier = CAN_IT_FMP0 ;
@@ -573,7 +572,7 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
573
572
}
574
573
}
575
574
#if defined(CAN2_BASE ) && (CAN_NUM == 2 )
576
- else if (obj -> can == CAN_2 ) {
575
+ else if (( CANName ) can == CAN_2 ) {
577
576
switch (type ) {
578
577
case IRQ_RX :
579
578
ier = CAN_IT_FMP0 ;
0 commit comments