libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_can.hpp
1#pragma once
2
3#include "main.h"
4
5#ifdef HAL_CAN_MODULE_ENABLED
6
7#ifdef CAN
8#if !defined(CAN1)
9#define CAN1 ((CAN_TypeDef*)CAN_BASE)
10#endif
11#undef CAN
12#endif
13
14#include "can.hpp"
15#include "queue.hpp"
16
17typedef enum
18{
19#ifdef CAN1
20 STM32_CAN1,
21#endif
22#ifdef CAN2
23 STM32_CAN2,
24#endif
25#ifdef CAN3
26 STM32_CAN3,
27#endif
28 STM32_CAN_NUMBER,
29 STM32_CAN_ID_ERROR
30} stm32_can_id_t;
31
32static_assert(STM32_CAN_NUMBER >= 1, "No CAN instance detected for this MCU");
33
34stm32_can_id_t STM32_CAN_GetID(CAN_TypeDef* addr); // NOLINT
35
36namespace LibXR
37{
41class STM32CAN : public CAN
42{
43 public:
51 STM32CAN(CAN_HandleTypeDef* hcan, uint32_t queue_size);
52
58 ErrorCode Init(void);
59
66 ErrorCode SetConfig(const CAN::Configuration& cfg) override;
67
68 uint32_t GetClockFreq() const override;
69
70 ErrorCode AddMessage(const ClassicPack& pack) override;
71
72 ErrorCode GetErrorState(CAN::ErrorState& state) const override;
73
78 void ProcessRxInterrupt();
79
85
86 CAN_HandleTypeDef* hcan_;
87
88 stm32_can_id_t id_;
89 uint32_t fifo_;
90 static STM32CAN* map[STM32_CAN_NUMBER]; // NOLINT
91
92 struct
93 {
94 CAN_RxHeaderTypeDef header;
95 ClassicPack pack;
96 } rx_buff_;
97
98 struct
99 {
100 CAN_TxHeaderTypeDef header;
101 ClassicPack pack;
102 } tx_buff_;
103
104 uint32_t txMailbox;
105
109 bool tx_retry_valid_{false};
112
113 std::atomic<uint32_t> tx_lock_{0};
114 std::atomic<uint32_t> tx_pend_{0};
115
116 static inline void BuildTxHeader(const ClassicPack& p, CAN_TxHeaderTypeDef& h);
117
118 void TxService();
119};
120} // namespace LibXR
121
122#endif
CAN 通信抽象类,定义经典 CAN 帧与订阅接口。 Abstract class for CAN communication with classic CAN frames and subscript...
Definition can.hpp:16
带固定 payload 类型的有界 MPMC 队列。
STM32 CAN 驱动实现 / STM32 CAN driver implementation.
Definition stm32_can.hpp:42
ClassicPack tx_retry_pack_
待重试帧。 Pending retry frame.
ErrorCode GetErrorState(CAN::ErrorState &state) const override
查询当前错误状态(快照)。 Query current CAN controller error state (snapshot).
ErrorCode SetConfig(const CAN::Configuration &cfg) override
设置 CAN 配置 / Set CAN configuration
uint32_t GetClockFreq() const override
获取 CAN 外设时钟频率(Hz)。 Get CAN peripheral clock frequency in Hz.
ErrorCode Init(void)
初始化驱动 / Initialize driver
Definition stm32_can.cpp:54
bool tx_retry_valid_
待重试帧有效标记。 Pending retry frame flag.
MPMCQueue< ClassicPack > tx_queue_
发送软件队列。 TX software queue.
ErrorCode AddMessage(const ClassicPack &pack) override
添加经典 CAN 消息。Add classic CAN message.
STM32CAN(CAN_HandleTypeDef *hcan, uint32_t queue_size)
构造 CAN 驱动对象 / Construct CAN driver object
Definition stm32_can.cpp:47
void ProcessErrorInterrupt()
处理错误中断 / Handle error interrupt
void ProcessRxInterrupt()
处理接收中断 / Handle RX interrupt
LibXR 命名空间
Definition ch32_can.hpp:14
ErrorCode
定义错误码枚举
经典 CAN 帧数据结构。Classic CAN frame structure.
Definition can.hpp:129
CAN 配置参数。CAN configuration parameters.
Definition can.hpp:62
CAN 当前错误状态快照(来自硬件计数器/状态机)。 Snapshot of current CAN controller error state (from HW counters/state).
Definition can.hpp:88