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{
41class STM32CAN : public CAN
42{
43 public:
50 STM32CAN(CAN_HandleTypeDef* hcan, uint32_t pool_size);
51
57 ErrorCode Init(void);
58
65 ErrorCode SetConfig(const CAN::Configuration& cfg) override;
66
67 uint32_t GetClockFreq() const override;
68
69 ErrorCode AddMessage(const ClassicPack& pack) override;
70
71 ErrorCode GetErrorState(CAN::ErrorState& state) const override;
72
77 void ProcessRxInterrupt();
78
84
85 CAN_HandleTypeDef* hcan_;
86
87 stm32_can_id_t id_;
88 uint32_t fifo_;
89 static STM32CAN* map[STM32_CAN_NUMBER]; // NOLINT
90
91 struct
92 {
93 CAN_RxHeaderTypeDef header;
94 ClassicPack pack;
95 } rx_buff_;
96
97 struct
98 {
99 CAN_TxHeaderTypeDef header;
100 ClassicPack pack;
101 } tx_buff_;
102
103 uint32_t txMailbox;
104
106
107 std::atomic<uint32_t> tx_lock_{0};
108 std::atomic<uint32_t> tx_pend_{0};
109
110 static inline void BuildTxHeader(const ClassicPack& p, CAN_TxHeaderTypeDef& h);
111
112 void TxService();
113};
114} // namespace LibXR
115
116#endif
CAN 通信抽象类,定义经典 CAN 帧与订阅接口。 Abstract class for CAN communication with classic CAN frames and subscript...
Definition can.hpp:16
无锁无序槽池 / Lock-free, unordered slot pool
STM32 CAN 驱动实现 / STM32 CAN driver implementation.
Definition stm32_can.hpp:42
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)
构造 CAN 驱动对象 / Construct CAN driver object
Definition stm32_can.cpp:47
uint32_t GetClockFreq() const override
获取 CAN 外设时钟频率(Hz)。 Get CAN peripheral clock frequency in Hz.
ErrorCode Init(void)
初始化驱动 / Initialize driver
Definition stm32_can.cpp:54
ErrorCode AddMessage(const ClassicPack &pack) override
添加经典 CAN 消息。Add classic CAN message.
void ProcessErrorInterrupt()
处理错误中断 / Handle error interrupt
void ProcessRxInterrupt()
处理接收中断 / Handle RX interrupt
LibXR 命名空间
Definition ch32_can.hpp:14
经典 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