semf
stm32can.cpp
Go to the documentation of this file.
1
12#include <algorithm>
13
14#if defined(STM32) && defined(HAL_CAN_MODULE_ENABLED)
15
16extern "C" void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef* can)
17{
19}
20extern "C" void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef* can)
21{
23}
24extern "C" void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef* can)
25{
27}
28extern "C" void HAL_CAN_ErrorCallback(CAN_HandleTypeDef* can)
29{
31}
32extern "C" void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef* can)
33{
35}
36extern "C" void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef* can)
37{
39}
40namespace semf
41{
42LinkedQueue<Stm32Can> Stm32Can::m_queue;
43
44Stm32Can::Stm32Can(CAN_HandleTypeDef& hwHandle)
45: m_hwHandle(&hwHandle)
46{
47 queue()->push(*this);
48}
49
51{
52 SEMF_INFO("init");
53 HAL_StatusTypeDef state = HAL_CAN_Init(m_hwHandle);
54 if (state != HAL_OK)
55 {
56 if (state == HAL_ERROR)
57 {
58 SEMF_ERROR("hal error");
59 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Init_HalError)));
60 }
61 else if (state == HAL_BUSY)
62 {
63 SEMF_ERROR("hal busy");
64 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Init_HalBusy)));
65 }
66 else if (state == HAL_TIMEOUT)
67 {
68 SEMF_ERROR("hal timeout");
69 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Init_HalTimeout)));
70 }
71 return;
72 }
73}
74
76{
77 SEMF_INFO("deinit");
78 HAL_StatusTypeDef state = HAL_CAN_DeInit(m_hwHandle);
79 if (state != HAL_OK)
80 {
81 if (state == HAL_ERROR)
82 {
83 SEMF_ERROR("hal error");
84 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Deinit_HalError)));
85 }
86 else if (state == HAL_BUSY)
87 {
88 SEMF_ERROR("hal busy");
89 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Deinit_HalBusy)));
90 }
91 else if (state == HAL_TIMEOUT)
92 {
93 SEMF_ERROR("dhal timeout");
94 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Deinit_HalTimeout)));
95 }
96 return;
97 }
98 m_isStarted = false;
99}
100
101void Stm32Can::setReadBuffer(uint8_t buffer[], size_t bufferSize)
102{
103 m_readData = buffer;
104 m_readDataSize = bufferSize;
105}
106
108{
109 SEMF_INFO("not implemented");
110 // TODO(FS) not implemented
111 return;
112}
113
115{
116 SEMF_INFO("not implemented");
117 // TODO(FS) not implemented
118 return;
119}
120
122{
123 return m_isStarted;
124}
125
126uint32_t Stm32Can::messageId() const
127{
128 return m_messageIdRead;
129}
130
131void Stm32Can::setMessageId(uint32_t id)
132{
133 SEMF_INFO("message Id: %u", id);
134 m_messageIdWrite = id;
135}
136
137void Stm32Can::setFrequency(uint32_t hz)
138{
139 (void)hz;
140 SEMF_INFO("not implemented");
141 // TODO(FS) not implemented
142 return;
143}
144
145void Stm32Can::setFilter(uint32_t filterBank, uint32_t messageId, uint32_t messageIdMask)
146{
147 SEMF_INFO("index: %u, messageId: %u, messageIdMask: %u", index, messageId, messageIdMask);
148 CAN_FilterTypeDef rxFilter;
149
150 if (filterBank >= m_numOfFilterBanks)
151 {
152 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::SetFilter_IndexOutOfBounds)));
153 return;
154 }
155
156 rxFilter.FilterBank = filterBank;
157 rxFilter.FilterMode = CAN_FILTERMODE_IDMASK; // alternative CAN_FILTERMODE_IDLIST
158 rxFilter.FilterFIFOAssignment = CAN_RX_FIFO0;
159 rxFilter.FilterScale = CAN_FILTERSCALE_32BIT;
160 rxFilter.FilterActivation = ENABLE;
161
162 if (messageIdMask <= 0x1FFFFFFF)
163 {
164 rxFilter.FilterIdHigh = ((messageId << 5) | (messageId >> (32 - 5))) & 0xFFFF; // STID[10:0] & EXTID[17:13]
165 rxFilter.FilterIdLow = (messageId >> (11 - 3)) & 0xFFF8; // EXID[12:5] & 3 Reserved bits
166
167 rxFilter.FilterMaskIdHigh = ((messageIdMask << 5) | (messageIdMask >> (32 - 5))) & 0xFFFF;
168 rxFilter.FilterMaskIdLow = (messageIdMask >> (11 - 3)) & 0xFFF8;
169 }
170 else
171 {
172 SEMF_ERROR("invalid message id mask: %u", messageIdMask);
173 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::SetFilter_MessageIdMaskInvalid)));
174 return;
175 }
176 HAL_CAN_ConfigFilter(m_hwHandle, &rxFilter);
177}
178
180{
181 SEMF_INFO("enter deep power down mode");
182 HAL_CAN_StateTypeDef canstate = HAL_CAN_GetState(m_hwHandle);
183 HAL_StatusTypeDef state;
184 switch (canstate)
185 {
186 case HAL_CAN_STATE_READY:
187 case HAL_CAN_STATE_LISTENING: // is already started
188 SEMF_INFO("state is ready or listening");
189 state = HAL_CAN_RequestSleep(m_hwHandle);
190 if (state != HAL_OK)
191 {
192 if (state == HAL_ERROR)
193 {
194 SEMF_ERROR("request sleep hal error");
196 }
197 else if (state == HAL_BUSY)
198 {
199 SEMF_ERROR("request sleep hal busy");
201 }
202 else if (state == HAL_TIMEOUT)
203 {
204 SEMF_ERROR("request sleep hal timeout");
206 }
207 return;
208 }
209 break;
210
211 case HAL_CAN_STATE_SLEEP_ACTIVE:
212 SEMF_INFO("state is sleep active");
213 break;
214
215 case HAL_CAN_STATE_RESET:
216 case HAL_CAN_STATE_SLEEP_PENDING:
217 SEMF_INFO("state is reset or sleep pending");
218 state = HAL_CAN_Init(m_hwHandle);
219 if (state != HAL_OK)
220 {
221 if (state == HAL_ERROR)
222 {
223 SEMF_ERROR("init hal error");
225 }
226 else if (state == HAL_BUSY)
227 {
228 SEMF_ERROR("init hal busy");
230 }
231 else if (state == HAL_TIMEOUT)
232 {
233 SEMF_ERROR("init hal timeout");
235 }
236 return;
237 }
238 state = HAL_CAN_Start(m_hwHandle);
239 if (state != HAL_OK)
240 {
241 if (state == HAL_ERROR)
242 {
243 SEMF_ERROR("start hal error");
245 }
246 else if (state == HAL_BUSY)
247 {
248 SEMF_ERROR("start hal busy");
250 }
251 else if (state == HAL_TIMEOUT)
252 {
253 SEMF_ERROR("start hal timeout");
255 }
256 return;
257 }
258 state = HAL_CAN_RequestSleep(m_hwHandle);
259 if (state != HAL_OK)
260 {
261 if (state == HAL_ERROR)
262 {
263 SEMF_ERROR("request sleep hal error");
265 }
266 else if (state == HAL_BUSY)
267 {
268 SEMF_ERROR("request sleep hal busy");
270 }
271 else if (state == HAL_TIMEOUT)
272 {
273 SEMF_ERROR("request sleep hal timeout");
275 }
276 return;
277 }
278 break;
279 case HAL_CAN_STATE_ERROR:
280 SEMF_INFO("state error");
281 break;
282 default:
283 SEMF_INFO("invalid state");
284 break;
285 }
286}
287
289{
290 SEMF_INFO("release deep power down mode");
291
292 HAL_CAN_StateTypeDef canstate = HAL_CAN_GetState(m_hwHandle);
293 HAL_StatusTypeDef state;
294 switch (canstate)
295 {
296 case HAL_CAN_STATE_READY:
297 case HAL_CAN_STATE_LISTENING: // is already started
298 SEMF_INFO("state is ready or listening");
299 break;
300
301 case HAL_CAN_STATE_SLEEP_ACTIVE:
302 state = HAL_CAN_WakeUp(m_hwHandle);
303 if (state != HAL_OK)
304 {
305 if (state == HAL_ERROR)
306 {
307 SEMF_ERROR("hal error");
309 }
310 else if (state == HAL_BUSY)
311 {
312 SEMF_ERROR("hal busy");
314 }
315 else if (state == HAL_TIMEOUT)
316 {
317 SEMF_ERROR("hal timeout");
319 }
320 return;
321 }
322 break;
323
324 case HAL_CAN_STATE_RESET:
325 case HAL_CAN_STATE_SLEEP_PENDING:
326 SEMF_INFO("state is reset or sleep pending");
327 state = HAL_CAN_Init(m_hwHandle);
328 if (state != HAL_OK)
329 {
330 if (state == HAL_ERROR)
331 {
332 SEMF_ERROR("init hal error");
334 }
335 else if (state == HAL_BUSY)
336 {
337 SEMF_ERROR("init hal busy");
339 }
340 else if (state == HAL_TIMEOUT)
341 {
342 SEMF_ERROR("init hal timeout");
344 }
345 return;
346 }
347 state = HAL_CAN_Start(m_hwHandle);
348 if (state != HAL_OK)
349 {
350 if (state == HAL_ERROR)
351 {
352 SEMF_ERROR("start hal error");
354 }
355 else if (state == HAL_BUSY)
356 {
357 SEMF_ERROR("start hal busy");
359 }
360 else if (state == HAL_TIMEOUT)
361 {
362 SEMF_ERROR("start hal timeout");
364 }
365 return;
366 }
367 break;
368 case HAL_CAN_STATE_ERROR:
369 SEMF_ERROR("state error");
370 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::ReleaseDeepPowerDownMode_StartStateError)));
371 break;
372 default:
373 SEMF_ERROR("state invalid");
374 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::ReleaseDeepPowerDownMode_StartStateInvalid)));
375 break;
376 }
377}
378
380{
382 return &queue;
383}
384
385void Stm32Can::systemIsrRead(CAN_HandleTypeDef& can, uint8_t fifoId)
386{
387 for (Stm32Can& i : *(queue()))
388 i.isrRead(can, fifoId);
389}
390
391void Stm32Can::systemIsrWritten(CAN_HandleTypeDef& can, uint8_t mailboxId)
392{
393 for (Stm32Can& i : *(queue()))
394 i.isrWritten(can, mailboxId);
395}
396
397void Stm32Can::systemIsrError(CAN_HandleTypeDef& can)
398{
399 for (Stm32Can& i : *(queue()))
400 i.isrError(can);
401}
402
403void Stm32Can::isrRead(CAN_HandleTypeDef& can, uint8_t fifoId)
404{
405 if (&can != m_hwHandle)
406 return;
407
408 if (m_readData == nullptr)
409 {
410 SEMF_ERROR("invalid read data");
411 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::IsrRead_NullpointerReadBuffer)));
412 return;
413 }
414
415 SEMF_INFO("data available");
416 if (fifoId > CAN_RX_FIFO1)
417 {
418 SEMF_ERROR("invalid fifo id: %u", fifoId);
419 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::IsrRead_FifoIdInvalid)));
420 return;
421 }
422
423 HAL_StatusTypeDef state = HAL_CAN_GetRxMessage(m_hwHandle, fifoId == 0 ? CAN_RX_FIFO0 : CAN_RX_FIFO1, &m_rxHeader, m_readData /*[m_readDataIndex]*/);
424 if (state != HAL_OK)
425 {
426 if (state == HAL_ERROR)
427 {
428 SEMF_ERROR("hal error");
429 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::IsrRead_HalError)));
430 }
431 else if (state == HAL_BUSY)
432 {
433 SEMF_ERROR("hal busy");
434 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::IsrRead_HalBusy)));
435 }
436 else if (state == HAL_TIMEOUT)
437 {
438 SEMF_ERROR("hal timeout");
439 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::IsrRead_HalTimeout)));
440 }
441 return;
442 }
443
444 if (m_rxHeader.IDE == CAN_ID_EXT)
445 m_messageIdRead = m_rxHeader.ExtId;
446 else
447 m_messageIdRead = m_rxHeader.StdId;
448
449 if (m_rxHeader.RTR == CAN_RTR_REMOTE)
451 else
453}
454
455void Stm32Can::isrWritten(CAN_HandleTypeDef& can, uint8_t mailboxId)
456{
457 (void)mailboxId;
458 if (&can != m_hwHandle)
459 return;
460
461 m_writeDataIndex += m_txHeader.DLC;
462 if (m_writeDataIndex >= m_writeDataSize)
464 else
465 writeHardware(&m_writeData[m_writeDataIndex], m_writeDataSize - m_writeDataIndex);
466}
467
468void Stm32Can::isrError(CAN_HandleTypeDef& can)
469{
470 if (&can != m_hwHandle)
471 return;
472
473 SEMF_ERROR("isr error");
474 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::IsrError_Error)));
475}
476
477void Stm32Can::writeHardware(const uint8_t data[], size_t dataSize)
478{
479 SEMF_INFO("write data: %p, size %u", data, dataSize);
480 if (!m_isStarted)
481 {
482 SEMF_ERROR("not started");
483 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteHardware_NotStarted)));
484 }
485
486 if (m_messageIdWrite <= 0x7FF)
487 {
488 m_txHeader.IDE = CAN_ID_STD;
489 m_txHeader.StdId = m_messageIdWrite & 0x7FF;
490 }
491 else if (m_messageIdWrite <= 0x1FFFFFFF)
492 {
493 m_txHeader.IDE = CAN_ID_EXT;
494 m_txHeader.ExtId = m_messageIdWrite & 0x1FFFFFFF;
495 }
496 else
497 {
498 SEMF_ERROR("invalid message id: %u", m_messageIdWrite);
499 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteHardware_InvalidMessageId)));
500 return;
501 }
502
503 if (dataSize > 8)
504 {
505 SEMF_WARNING("The given dataSize is greater than 8, but this STM32-CAN implementation doesn't support CAN FD. The value is changed to 8");
506 }
507
508 size_t writeSize = std::min(dataSize, std::size_t{8});
509
510 m_writeData = data;
511 m_writeDataIndex = 0;
512 m_writeDataSize = writeSize;
513
514 m_txHeader.DLC = writeSize;
515 m_txHeader.RTR = CAN_RTR_DATA;
516 m_txHeader.TransmitGlobalTime = FunctionalState::DISABLE;
517
518 HAL_StatusTypeDef state = HAL_CAN_AddTxMessage(m_hwHandle, &m_txHeader, const_cast<uint8_t*>(data), &m_usedTxMailbox);
519 if (state != HAL_OK)
520 {
521 if (state == HAL_ERROR)
522 {
523 SEMF_ERROR("hal error");
524 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteHardware_HalError)));
525 }
526 else if (state == HAL_BUSY)
527 {
528 SEMF_ERROR("hal busy");
529 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteHardware_HalBusy)));
530 }
531 else if (state == HAL_TIMEOUT)
532 {
533 SEMF_ERROR("hal timeout");
534 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::WriteHardware_HalTimeout)));
535 }
536 return;
537 }
538}
539
541{
542 SEMF_INFO("request data");
543 if (!m_isStarted)
544 {
545 SEMF_ERROR("not started");
546 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::RequestHardware_NotStarted)));
547 }
548
549 // txHeader configuration
550 if (m_messageIdWrite <= 0x7FF) // standard
551 {
552 m_txHeader.IDE = CAN_ID_STD; // Identifier extension bit
553 m_txHeader.StdId = m_messageIdWrite & 0x7FF;
554 }
555 else if (m_messageIdWrite <= 0x1FFFFFFF) // fill up the extended id
556 {
557 m_txHeader.IDE = CAN_ID_EXT; // Identifier extension bit
558 m_txHeader.ExtId = m_messageIdWrite & 0x1FFFFFFF;
559 }
560 else
561 {
562 SEMF_ERROR("invalid message id: %u", m_messageIdWrite);
563 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::RequestHardware_InvalidMessageId)));
564 return;
565 }
566
567 m_txHeader.DLC = 0; // Data size code
568 m_txHeader.RTR = CAN_RTR_REMOTE; // Remote transmission request
569 // Specifies whether the timestamp counter value captured on
570 // start of frame transmission within the data field in the frame
571 m_txHeader.TransmitGlobalTime = FunctionalState::DISABLE;
572
573 HAL_StatusTypeDef state = HAL_CAN_AddTxMessage(m_hwHandle, &m_txHeader, m_requestData, &m_usedTxMailbox);
574 if (state != HAL_OK)
575 {
576 if (state == HAL_ERROR)
577 {
578 SEMF_ERROR("hal error");
579 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::RequestHardware_HalError)));
580 }
581 else if (state == HAL_BUSY)
582 {
583 SEMF_ERROR("hal busy");
584 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::RequestHardware_HalBusy)));
585 }
586 else if (state == HAL_TIMEOUT)
587 {
588 SEMF_ERROR("hal timeout");
589 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::RequestHardware_HalTimeout)));
590 }
591 return;
592 }
593}
594
596{
597 HAL_StatusTypeDef state = HAL_CAN_Start(m_hwHandle);
598
599 if (state != HAL_OK)
600 {
601 if (state == HAL_ERROR)
602 {
603 SEMF_ERROR("hal timeout");
604 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Start_HalTimeout)));
605 }
606 return;
607 }
608
609 HAL_StatusTypeDef notificationState =
610 HAL_CAN_ActivateNotification(m_hwHandle, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_RX_FIFO1_MSG_PENDING | CAN_IT_TX_MAILBOX_EMPTY);
611 if (notificationState != HAL_OK)
612 {
613 if (notificationState == HAL_ERROR)
614 {
615 SEMF_ERROR("hal not initialized");
616 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Start_HalNotInitialized)));
617 }
618 return;
619 }
620 m_isStarted = true;
621}
622
624{
625 HAL_StatusTypeDef state = HAL_CAN_Stop(m_hwHandle);
626 if (state != HAL_OK)
627 {
628 if (state == HAL_ERROR)
629 {
630 SEMF_ERROR("hal error");
631 onError(Error(kSemfClassId, static_cast<uint8_t>(ErrorCode::Stop_HalTimeout)));
632 }
633 return;
634 }
635 m_isStarted = false;
636}
637} /* namespace semf */
638#endif
void onError(Error thrown)
Is called if an error occurred by hardware read or write access. Will emit error signal.
Definition: canhardware.cpp:99
Class for representing errors. Every error should have a unique source code. As a user feel encourage...
Definition: error.h:22
LinkedQueue is an managed single linked queue implementation.
Definition: linkedqueue.h:38
Class for using CAN with Stm32.
Definition: stm32can.h:26
@ EnterDeepPowerDownMode_StartStateResetSleepPendingHalTimeout
@ ReleaseDeepPowerDownMode_InitStateResetSleepPendingHalBusy
@ ReleaseDeepPowerDownMode_InitStateResetSleepPendingHalTimeout
@ ReleaseDeepPowerDownMode_StartStateResetSleepPendingHalTimeout
@ EnterDeepPowerDownMode_SleepStateReadyListeningHalError
@ EnterDeepPowerDownMode_SleepStateResetSleepPendingHalError
@ ReleaseDeepPowerDownMode_WakeupStateSleepActiveHalBusy
@ ReleaseDeepPowerDownMode_StartStateResetSleepPendingHalError
@ ReleaseDeepPowerDownMode_InitStateResetSleepPendingHalError
@ EnterDeepPowerDownMode_SleepStateReadyListeningHalBusy
@ EnterDeepPowerDownMode_StartStateResetSleepPendingHalError
@ EnterDeepPowerDownMode_SleepStateResetSleepPendingHalTimeout
@ EnterDeepPowerDownMode_InitStateResetSleepPendingHalTimeout
@ EnterDeepPowerDownMode_InitStateResetSleepPendingHalBusy
@ EnterDeepPowerDownMode_SleepStateResetSleepPendingHalBusy
@ EnterDeepPowerDownMode_StartStateResetSleepPendingHalBusy
@ EnterDeepPowerDownMode_InitStateResetSleepPendingHalError
@ ReleaseDeepPowerDownMode_StartStateResetSleepPendingHalBusy
@ EnterDeepPowerDownMode_SleepStateReadyListeningHalTimeout
@ ReleaseDeepPowerDownMode_WakeupStateSleepActiveHalError
@ ReleaseDeepPowerDownMode_WakeupStateSleepActiveHalTimeout
uint32_t messageId() const override
Returns the message ID for reading data. Use this function after reading the data via read-function.
Definition: stm32can.cpp:126
static void systemIsrWritten(CAN_HandleTypeDef &can, uint8_t mailboxId)
System-wide interrupt service routine for can transmit.
Definition: stm32can.cpp:391
void stopWrite() override
Definition: stm32can.cpp:107
void isrWritten(CAN_HandleTypeDef &can, uint8_t mailboxId)
Sending a readyWritten signal.
Definition: stm32can.cpp:455
void setReadBuffer(uint8_t buffer[], size_t bufferSize) override
Sets the read buffer for having the possibility to handle the received data.
Definition: stm32can.cpp:101
void requestHardware() override
Definition: stm32can.cpp:540
void setFrequency(uint32_t hz) override
Sets the speed.
Definition: stm32can.cpp:137
Stm32Can(CAN_HandleTypeDef &hwHandle)
Constructor.
Definition: stm32can.cpp:44
void setFilter(uint32_t filterBank, uint32_t messageId, uint32_t messageIdMask) override
Sets a message hardware receive filter.
Definition: stm32can.cpp:145
void stopRead() override
Definition: stm32can.cpp:114
void init() override
Definition: stm32can.cpp:50
void writeHardware(const uint8_t data[], size_t dataSize) override
Hardware will write data.
Definition: stm32can.cpp:477
static void systemIsrError(CAN_HandleTypeDef &can)
System-wide interrupt service routine for can error.
Definition: stm32can.cpp:397
void setMessageId(uint32_t id) override
Sets the message ID for writing data. Use this function before writing the data via write-function.
Definition: stm32can.cpp:131
void releaseDeepPowerDownMode()
Go to active mode.
Definition: stm32can.cpp:288
void start()
Hardware driver will be started.
Definition: stm32can.cpp:595
void stop()
Hardware driver will be stopped.
Definition: stm32can.cpp:623
static LinkedQueue< Stm32Can > * queue()
Get the list with all cans.
Definition: stm32can.cpp:379
void isrRead(CAN_HandleTypeDef &can, uint8_t fifoId)
Saves a received message and sends a readyRead or readyRequested signal.
Definition: stm32can.cpp:403
void enterDeepPowerDownMode()
Go to deep power down mode.
Definition: stm32can.cpp:179
void isrError(CAN_HandleTypeDef &can)
Sending a error signal.
Definition: stm32can.cpp:468
bool isStarted() const
Get the state of the start of the CAN driver.
Definition: stm32can.cpp:121
void deinit() override
Definition: stm32can.cpp:75
static void systemIsrRead(CAN_HandleTypeDef &can, uint8_t fifoId)
System-wide interrupt service routine for can receive.
Definition: stm32can.cpp:385
#define SEMF_ERROR(...)
Definition: debug.h:39
#define SEMF_WARNING(...)
Definition: debug.h:40
#define SEMF_INFO(...)
Definition: debug.h:41
void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *can)
Definition: stm32can.cpp:24
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *can)
Definition: stm32can.cpp:32
void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *can)
Definition: stm32can.cpp:16
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *can)
Definition: stm32can.cpp:28
void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *can)
Definition: stm32can.cpp:36
void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *can)
Definition: stm32can.cpp:20