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 "libxr.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{
43class STM32CAN : public CAN
44{
45 public:
52 STM32CAN(CAN_HandleTypeDef* hcan, uint32_t pool_size);
53
59 ErrorCode Init(void);
60
67 ErrorCode SetConfig(const CAN::Configuration& cfg) override;
68
69 uint32_t GetClockFreq() const override;
70
71 ErrorCode AddMessage(const ClassicPack& pack) override;
72
73 ErrorCode GetErrorState(CAN::ErrorState& state) const override;
74
79 void ProcessRxInterrupt();
80
86
87 CAN_HandleTypeDef* hcan_;
88
89 stm32_can_id_t id_;
90 uint32_t fifo_;
91 static STM32CAN* map[STM32_CAN_NUMBER]; // NOLINT
92
93 struct
94 {
95 CAN_RxHeaderTypeDef header;
96 ClassicPack pack;
97 } rx_buff_;
98
99 struct
100 {
101 CAN_TxHeaderTypeDef header;
102 ClassicPack pack;
103 } tx_buff_;
104
105 uint32_t txMailbox;
106
108
109 std::atomic<uint32_t> tx_lock_{0};
110 std::atomic<uint32_t> tx_pend_{0};
111
112 static inline void BuildTxHeader(const ClassicPack& p, CAN_TxHeaderTypeDef& h);
113
114 void TxService();
115};
116} // namespace LibXR
117
118#endif
CAN 通信抽象类,定义经典 CAN 帧与订阅接口。 Abstract class for CAN communication with classic CAN frames and subscript...
Definition can.hpp:16
无锁无序槽池 / Lock-free, unordered slot pool
STM32CAN 类,用于处理 STM32 系统的 CAN 通道。 Provides handling for STM32 CAN channels.
Definition stm32_can.hpp:44
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.
STM32CAN(CAN_HandleTypeDef *hcan, uint32_t pool_size)
STM32CAN 类,用于处理 STM32 系统的 CAN 通道。 Provides handling for STM32 CAN.
Definition stm32_can.cpp:47
uint32_t GetClockFreq() const override
获取 CAN 外设时钟频率(Hz)。 Get CAN peripheral clock frequency in Hz.
ErrorCode Init(void)
初始化
Definition stm32_can.cpp:54
ErrorCode AddMessage(const ClassicPack &pack) override
添加经典 CAN 消息。Add classic CAN message.
void ProcessErrorInterrupt()
处理错误中断
void ProcessRxInterrupt()
处理接收中断
LibXR 命名空间
经典 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