Skip to content

Commit 759642a

Browse files
committed
STM32: Define CAN handle as part of can object
Instead of a static object, this will make driver instantiation more robust and allow to re-use init configuration on a need basis. The CANName struct member is actually the CAN registers base address, which is now available in the CanHandle.Instance field, so we don't need CANName anymore.
1 parent 66162c6 commit 759642a

File tree

8 files changed

+42
-43
lines changed

8 files changed

+42
-43
lines changed

targets/TARGET_STM/TARGET_STM32F0/common_objects.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ struct dac_s {
130130

131131
#if DEVICE_CAN
132132
struct can_s {
133-
CANName can;
133+
CAN_HandleTypeDef CanHandle;
134134
int index;
135135
};
136136
#endif

targets/TARGET_STM/TARGET_STM32F1/common_objects.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ struct analogin_s {
118118

119119
#if DEVICE_CAN
120120
struct can_s {
121-
CANName can;
121+
CAN_HandleTypeDef CanHandle;
122122
int index;
123123
};
124124
#endif

targets/TARGET_STM/TARGET_STM32F2/objects.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ struct pwmout_s {
137137
};
138138

139139
struct can_s {
140-
CANName can;
140+
CAN_HandleTypeDef CanHandle;
141141
int index;
142142
};
143143

targets/TARGET_STM/TARGET_STM32F3/common_objects.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ struct analogin_s {
126126

127127
#if DEVICE_CAN
128128
struct can_s {
129-
CANName can;
129+
CAN_HandleTypeDef CanHandle;
130130
int index;
131131
};
132132
#endif

targets/TARGET_STM/TARGET_STM32F4/common_objects.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ struct dac_s {
135135

136136
#if DEVICE_CAN
137137
struct can_s {
138-
CANName can;
138+
CAN_HandleTypeDef CanHandle;
139139
int index;
140140
};
141141
#endif

targets/TARGET_STM/TARGET_STM32F7/common_objects.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ struct flash_s {
134134

135135
#if DEVICE_CAN
136136
struct can_s {
137-
CANName can;
137+
CAN_HandleTypeDef CanHandle;
138138
int index;
139139
};
140140
#endif

targets/TARGET_STM/TARGET_STM32L4/common_objects.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ struct dac_s {
137137

138138
#if DEVICE_CAN
139139
struct can_s {
140-
CANName can;
140+
CAN_HandleTypeDef CanHandle;
141141
int index;
142142
};
143143
#endif

targets/TARGET_STM/can_api.c

Lines changed: 35 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#include <math.h>
2626
#include <string.h>
2727

28-
static CAN_HandleTypeDef CanHandle;
2928
static uint32_t can_irq_ids[CAN_NUM] = {0};
3029
static can_irq_handler irq_handler;
3130

@@ -38,16 +37,16 @@ void can_init_freq (can_t *obj, PinName rd, PinName td, int hz)
3837
{
3938
CANName can_rd = (CANName)pinmap_peripheral(rd, PinMap_CAN_RD);
4039
CANName can_td = (CANName)pinmap_peripheral(td, PinMap_CAN_TD);
40+
CANName can = (CANName)pinmap_merge(can_rd, can_td);
4141

42-
obj->can = (CANName)pinmap_merge(can_rd, can_td);
43-
MBED_ASSERT((int)obj->can != NC);
42+
MBED_ASSERT((int)can != NC);
4443

45-
if (obj->can == CAN_1) {
44+
if (can == CAN_1) {
4645
__HAL_RCC_CAN1_CLK_ENABLE();
4746
obj->index = 0;
4847
}
4948
#if defined(CAN2_BASE) && (CAN_NUM == 2)
50-
else if (obj->can == CAN_2) {
49+
else if (can == CAN_2) {
5150
__HAL_RCC_CAN1_CLK_ENABLE(); // needed to set filters
5251
__HAL_RCC_CAN2_CLK_ENABLE();
5352
obj->index = 1;
@@ -67,21 +66,21 @@ void can_init_freq (can_t *obj, PinName rd, PinName td, int hz)
6766
pin_mode(td, PullUp);
6867
}
6968

70-
CanHandle.Instance = (CAN_TypeDef *)(obj->can);
69+
obj->CanHandle.Instance = (CAN_TypeDef *)can;
7170

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;
8382

84-
if (HAL_CAN_Init(&CanHandle) != HAL_OK) {
83+
if (HAL_CAN_Init(&obj->CanHandle) != HAL_OK) {
8584
error("Cannot initialize CAN");
8685
}
8786

@@ -90,7 +89,7 @@ void can_init_freq (can_t *obj, PinName rd, PinName td, int hz)
9089
error("Can frequency could not be set\n");
9190
}
9291

93-
uint32_t filter_number = (obj->can == CAN_1) ? 0 : 14;
92+
uint32_t filter_number = (can == CAN_1) ? 0 : 14;
9493
can_filter(obj, 0, 0, CANStandard, filter_number);
9594
}
9695

@@ -102,7 +101,7 @@ void can_irq_init(can_t *obj, can_irq_handler handler, uint32_t id)
102101

103102
void can_irq_free(can_t *obj)
104103
{
105-
CAN_TypeDef *can = (CAN_TypeDef *)(obj->can);
104+
CAN_TypeDef *can = obj->CanHandle.Instance;
106105

107106
can->IER &= ~(CAN_IT_FMP0 | CAN_IT_FMP1 | CAN_IT_TME | \
108107
CAN_IT_ERR | CAN_IT_EPV | CAN_IT_BOF);
@@ -111,14 +110,15 @@ void can_irq_free(can_t *obj)
111110

112111
void can_free(can_t *obj)
113112
{
113+
CANName can = (CANName) obj->CanHandle.Instance;
114114
// Reset CAN and disable clock
115-
if (obj->can == CAN_1) {
115+
if (can == CAN_1) {
116116
__HAL_RCC_CAN1_FORCE_RESET();
117117
__HAL_RCC_CAN1_RELEASE_RESET();
118118
__HAL_RCC_CAN1_CLK_DISABLE();
119119
}
120120
#if defined(CAN2_BASE) && (CAN_NUM == 2)
121-
if (obj->can == CAN_2) {
121+
if (can == CAN_2) {
122122
__HAL_RCC_CAN2_FORCE_RESET();
123123
__HAL_RCC_CAN2_RELEASE_RESET();
124124
__HAL_RCC_CAN2_CLK_DISABLE();
@@ -196,7 +196,7 @@ int can_frequency(can_t *obj, int f)
196196
{
197197
int pclk = HAL_RCC_GetPCLK1Freq();
198198
int btr = can_speed(pclk, (unsigned int)f, 1);
199-
CAN_TypeDef *can = (CAN_TypeDef *)(obj->can);
199+
CAN_TypeDef *can = obj->CanHandle.Instance;
200200
uint32_t tickstart = 0;
201201
int status = 1;
202202

@@ -236,7 +236,7 @@ int can_frequency(can_t *obj, int f)
236236
int can_write(can_t *obj, CAN_Message msg, int cc)
237237
{
238238
uint32_t transmitmailbox = CAN_TXSTATUS_NOMAILBOX;
239-
CAN_TypeDef *can = (CAN_TypeDef *)(obj->can);
239+
CAN_TypeDef *can = obj->CanHandle.Instance;
240240

241241
/* Select one empty transmit mailbox */
242242
if ((can->TSR & CAN_TSR_TME0) == CAN_TSR_TME0) {
@@ -279,7 +279,7 @@ int can_read(can_t *obj, CAN_Message *msg, int handle)
279279
{
280280
//handle is the FIFO number
281281

282-
CAN_TypeDef *can = (CAN_TypeDef *)(obj->can);
282+
CAN_TypeDef *can = obj->CanHandle.Instance;
283283

284284
// check FPM0 which holds the pending message count in FIFO 0
285285
// if no message is pending, return 0
@@ -324,26 +324,26 @@ int can_read(can_t *obj, CAN_Message *msg, int handle)
324324

325325
void can_reset(can_t *obj)
326326
{
327-
CAN_TypeDef *can = (CAN_TypeDef *)(obj->can);
327+
CAN_TypeDef *can = obj->CanHandle.Instance;
328328
can->MCR |= CAN_MCR_RESET;
329329
can->ESR = 0x0;
330330
}
331331

332332
unsigned char can_rderror(can_t *obj)
333333
{
334-
CAN_TypeDef *can = (CAN_TypeDef *)(obj->can);
334+
CAN_TypeDef *can = obj->CanHandle.Instance;
335335
return (can->ESR >> 24) & 0xFF;
336336
}
337337

338338
unsigned char can_tderror(can_t *obj)
339339
{
340-
CAN_TypeDef *can = (CAN_TypeDef *)(obj->can);
340+
CAN_TypeDef *can = obj->CanHandle.Instance;
341341
return (can->ESR >> 16) & 0xFF;
342342
}
343343

344344
void can_monitor(can_t *obj, int silent)
345345
{
346-
CAN_TypeDef *can = (CAN_TypeDef *)(obj->can);
346+
CAN_TypeDef *can = obj->CanHandle.Instance;
347347

348348
can->MCR |= CAN_MCR_INRQ ;
349349
while ((can->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) {
@@ -363,7 +363,7 @@ void can_monitor(can_t *obj, int silent)
363363
int can_mode(can_t *obj, CanMode mode)
364364
{
365365
int success = 0;
366-
CAN_TypeDef *can = (CAN_TypeDef *)(obj->can);
366+
CAN_TypeDef *can = obj->CanHandle.Instance;
367367

368368
can->MCR |= CAN_MCR_INRQ ;
369369
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
407407

408408
// filter for CANAny format cannot be configured for STM32
409409
if ((format == CANStandard) || (format == CANExtended)) {
410-
CanHandle.Instance = (CAN_TypeDef *)(obj->can);
411410
CAN_FilterConfTypeDef sFilterConfig;
412411
sFilterConfig.FilterNumber = handle;
413412
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
429428
sFilterConfig.FilterActivation = ENABLE;
430429
sFilterConfig.BankNumber = 14 + handle;
431430

432-
HAL_CAN_ConfigFilter(&CanHandle, &sFilterConfig);
431+
HAL_CAN_ConfigFilter(&obj->CanHandle, &sFilterConfig);
433432
retval = handle;
434433
}
435434
return retval;
@@ -438,6 +437,7 @@ int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t
438437
static void can_irq(CANName name, int id)
439438
{
440439
uint32_t tmp1 = 0, tmp2 = 0, tmp3 = 0;
440+
CAN_HandleTypeDef CanHandle;
441441
CanHandle.Instance = (CAN_TypeDef *)name;
442442

443443
if (__HAL_CAN_GET_IT_SOURCE(&CanHandle, CAN_IT_TME)) {
@@ -535,13 +535,12 @@ void CAN2_SCE_IRQHandler(void)
535535

536536
void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
537537
{
538-
539-
CAN_TypeDef *can = (CAN_TypeDef *)(obj->can);
538+
CAN_TypeDef *can = obj->CanHandle.Instance;
540539
IRQn_Type irq_n = (IRQn_Type)0;
541540
uint32_t vector = 0;
542541
uint32_t ier;
543542

544-
if (obj->can == CAN_1) {
543+
if ((CANName) can == CAN_1) {
545544
switch (type) {
546545
case IRQ_RX:
547546
ier = CAN_IT_FMP0;
@@ -573,7 +572,7 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
573572
}
574573
}
575574
#if defined(CAN2_BASE) && (CAN_NUM == 2)
576-
else if (obj->can == CAN_2) {
575+
else if ((CANName) can == CAN_2) {
577576
switch (type) {
578577
case IRQ_RX:
579578
ier = CAN_IT_FMP0;

0 commit comments

Comments
 (0)