semf
stm32can.h
Go to the documentation of this file.
1
10#ifndef SEMF_HARDWAREABSTRACTION_STM32_STM32CAN_H_
11#define SEMF_HARDWAREABSTRACTION_STM32_STM32CAN_H_
12
15
16#if defined(STM32) && defined(HAL_CAN_MODULE_ENABLED)
18namespace semf
19{
25class Stm32Can : public CanHardware, public LinkedQueue<Stm32Can>::Node
26{
27public:
29 enum class ErrorCode : uint8_t
30 {
31 Init_HalError = 0,
32 Init_HalBusy,
33 Init_HalTimeout,
34 Deinit_HalError,
35 Deinit_HalBusy,
36 Deinit_HalTimeout,
37 SetFilter_IndexOutOfBounds,
38 SetFilter_MessageIdInvalid,
39 SetFilter_MessageIdMaskInvalid,
40 EnterDeepPowerDownMode_SleepStateReadyListeningHalError,
41 EnterDeepPowerDownMode_SleepStateReadyListeningHalBusy,
42 EnterDeepPowerDownMode_SleepStateReadyListeningHalTimeout,
43 EnterDeepPowerDownMode_InitStateResetSleepPendingHalError,
44 EnterDeepPowerDownMode_InitStateResetSleepPendingHalBusy,
45 EnterDeepPowerDownMode_InitStateResetSleepPendingHalTimeout,
46 EnterDeepPowerDownMode_StartStateResetSleepPendingHalError,
47 EnterDeepPowerDownMode_StartStateResetSleepPendingHalBusy,
48 EnterDeepPowerDownMode_StartStateResetSleepPendingHalTimeout,
49 EnterDeepPowerDownMode_SleepStateResetSleepPendingHalError,
50 EnterDeepPowerDownMode_SleepStateResetSleepPendingHalBusy,
51 EnterDeepPowerDownMode_SleepStateResetSleepPendingHalTimeout,
52 ReleaseDeepPowerDownMode_WakeupStateSleepActiveHalError,
53 ReleaseDeepPowerDownMode_WakeupStateSleepActiveHalBusy,
54 ReleaseDeepPowerDownMode_WakeupStateSleepActiveHalTimeout,
55 ReleaseDeepPowerDownMode_InitStateResetSleepPendingHalError,
56 ReleaseDeepPowerDownMode_InitStateResetSleepPendingHalBusy,
57 ReleaseDeepPowerDownMode_InitStateResetSleepPendingHalTimeout,
58 ReleaseDeepPowerDownMode_StartStateResetSleepPendingHalError,
59 ReleaseDeepPowerDownMode_StartStateResetSleepPendingHalBusy,
60 ReleaseDeepPowerDownMode_StartStateResetSleepPendingHalTimeout,
61 ReleaseDeepPowerDownMode_StartStateError,
62 ReleaseDeepPowerDownMode_StartStateInvalid,
63 IsrRead_NullpointerReadBuffer,
64 IsrRead_FifoIdInvalid,
65 IsrRead_HalError,
66 IsrRead_HalBusy,
67 IsrRead_HalTimeout,
68 IsrError_Error,
69 WriteHardware_InvalidMessageId,
70 WriteHardware_HalError,
71 WriteHardware_HalBusy,
72 WriteHardware_HalTimeout,
73 WriteHardware_NotStarted,
74 RequestHardware_InvalidMessageId,
75 RequestHardware_HalError,
76 RequestHardware_HalBusy,
77 RequestHardware_HalTimeout,
78 RequestHardware_NotStarted,
79 Start_HalTimeout,
80 Start_HalNotInitialized,
81 Stop_HalTimeout,
82 };
87 explicit Stm32Can(CAN_HandleTypeDef& hwHandle);
88 explicit Stm32Can(const Stm32Can& other) = delete;
89 virtual ~Stm32Can() = default;
90
97 void init() override;
104 void deinit() override;
105 void setReadBuffer(uint8_t buffer[], size_t bufferSize) override;
106 void stopWrite() override;
107 void stopRead() override;
113 void start();
118 void stop();
123 bool isStarted() const;
124 uint32_t messageId() const override;
125 void setMessageId(uint32_t id) override;
126 void setFrequency(uint32_t hz) override;
135 void setFilter(uint32_t filterBank, uint32_t messageId, uint32_t messageIdMask) override;
177 static void systemIsrRead(CAN_HandleTypeDef& can, uint8_t fifoId);
183 static void systemIsrWritten(CAN_HandleTypeDef& can, uint8_t mailboxId);
188 static void systemIsrError(CAN_HandleTypeDef& can);
199 void isrRead(CAN_HandleTypeDef& can, uint8_t fifoId);
205 void isrWritten(CAN_HandleTypeDef& can, uint8_t mailboxId);
210 void isrError(CAN_HandleTypeDef& can);
211
212protected:
221 void writeHardware(const uint8_t data[], size_t dataSize) override;
230 void requestHardware() override;
231
232private:
234 static LinkedQueue<Stm32Can> m_queue;
236 CAN_HandleTypeDef* m_hwHandle = nullptr;
238 static const uint8_t m_numOfFilterBanks = 28;
240 CAN_TxHeaderTypeDef m_txHeader;
242 CAN_RxHeaderTypeDef m_rxHeader;
244 uint32_t m_usedTxMailbox = 0;
246 const uint8_t* m_writeData = nullptr;
248 size_t m_writeDataSize = 0;
250 size_t m_writeDataIndex = 0;
252 uint8_t m_requestData[8] = {0};
254 uint8_t* m_readData = nullptr;
256 size_t m_readDataSize = 0;
258 uint32_t m_messageIdWrite = 0;
260 uint32_t m_messageIdRead = 0;
262 bool m_isStarted = false;
264 static constexpr Error::ClassID kSemfClassId = Error::ClassID::Stm32Can;
265};
266} /* namespace semf */
267#endif
268#endif /* SEMF_HARDWAREABSTRACTION_STM32_STM32CAN_H_ */
Interface for using CAN.
Definition: canhardware.h:24
ClassID
Semf class IDs.
Definition: error.h:28
LinkedQueue is an managed single linked queue implementation.
Definition: linkedqueue.h:38
Class for using CAN with Stm32.
Definition: stm32can.h:26
virtual ~Stm32Can()=default
Stm32Can(const Stm32Can &other)=delete
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