libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
ch32_can.hpp
1#pragma once
2
3#include <atomic>
4#include <cstdint>
5#include <cstring>
6
7#include "can.hpp"
8#include "ch32_can_def.hpp"
9#include "libxr.hpp"
10
11#include DEF2STR(LIBXR_CH32_CONFIG_FILE)
12
13namespace LibXR
14{
23class CH32CAN : public CAN
24{
25 public:
32 explicit CH32CAN(ch32_can_id_t id, uint32_t pool_size);
33 ~CH32CAN() override = default;
34
38 ErrorCode Init();
39
43 ErrorCode SetConfig(const CAN::Configuration& cfg) override;
44
48 uint32_t GetClockFreq() const override;
49
53 ErrorCode AddMessage(const ClassicPack& pack) override;
54
58 ErrorCode GetErrorState(CAN::ErrorState& state) const override;
59
63 void ProcessRxInterrupt();
64
68 void ProcessTxInterrupt();
69
74
76 static CH32CAN* map[CH32_CAN_NUMBER]; // NOLINT
77
78 private:
79 static inline void BuildTxMsg(const ClassicPack& p, CanTxMsg& m);
80
81 void EnableIRQs();
82 void DisableIRQs();
83
84 void TxService();
85
86 private:
87 CAN_TypeDef* instance_{nullptr};
88 ch32_can_id_t id_{CH32_CAN_ID_ERROR};
89
90 uint8_t fifo_{0};
91 uint8_t filter_bank_{0};
92
93 LockFreePool<ClassicPack> tx_pool_;
94
95 std::atomic<uint32_t> tx_lock_{0};
96 std::atomic<uint32_t> tx_pend_{0};
97
100
102 CanRxMsg rx_msg_{};
103 CanTxMsg tx_msg_{};
104};
105} // namespace LibXR
CAN 通信抽象类,定义经典 CAN 帧与订阅接口。 Abstract class for CAN communication with classic CAN frames and subscript...
Definition can.hpp:16
CH32 CAN 驱动实现 / CH32 CAN driver implementation.
Definition ch32_can.hpp:24
ErrorCode SetConfig(const CAN::Configuration &cfg) override
设置 CAN 配置 / Set CAN configuration
Definition ch32_can.cpp:343
void ProcessTxInterrupt()
处理发送中断 / Handle TX interrupt
Definition ch32_can.cpp:552
void ProcessErrorInterrupt()
处理错误中断 / Handle error interrupt
Definition ch32_can.cpp:626
CAN::Configuration cfg_cache_
缓存配置(用于保留原值语义) / Cached configuration for keep-previous semantics
Definition ch32_can.hpp:99
ErrorCode AddMessage(const ClassicPack &pack) override
发送消息入队 / Enqueue TX message
Definition ch32_can.cpp:536
void ProcessRxInterrupt()
处理接收中断 / Handle RX interrupt
Definition ch32_can.cpp:570
ErrorCode Init()
初始化过滤器和中断路由 / Initialize filters and IRQ routing
Definition ch32_can.cpp:173
ErrorCode GetErrorState(CAN::ErrorState &state) const override
获取总线错误状态 / Get bus error state
Definition ch32_can.cpp:720
uint32_t GetClockFreq() const override
获取 CAN 时钟频率 / Get CAN clock frequency
Definition ch32_can.cpp:459
static CH32CAN * map[CH32_CAN_NUMBER]
中断分发表 / IRQ dispatch map
Definition ch32_can.hpp:76
CH32CAN(ch32_can_id_t id, uint32_t pool_size)
构造 CAN 驱动对象 / Construct CAN driver object
Definition ch32_can.cpp:125
CanRxMsg rx_msg_
中断上下文收发缓冲 / RX/TX buffers in IRQ context
Definition ch32_can.hpp:102
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