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{
30class CH32CAN : public CAN
31{
32 public:
39 explicit CH32CAN(ch32_can_id_t id, uint32_t pool_size);
40
44 ErrorCode Init();
45
49 ErrorCode SetConfig(const CAN::Configuration& cfg) override;
50
54 uint32_t GetClockFreq() const override;
55
59 ErrorCode AddMessage(const ClassicPack& pack) override;
60
64 ErrorCode GetErrorState(CAN::ErrorState& state) const override;
65
69 void ProcessRxInterrupt();
70
74 void ProcessTxInterrupt();
75
80
81 // Map for ISR dispatch
82 static CH32CAN* map[CH32_CAN_NUMBER]; // NOLINT
83
84 private:
85 static inline void BuildTxMsg(const ClassicPack& p, CanTxMsg& m);
86
87 void EnableIRQs();
88 void DisableIRQs();
89
90 void TxService();
91
92 private:
93 CAN_TypeDef* instance_{nullptr};
94 ch32_can_id_t id_{CH32_CAN_ID_ERROR};
95
96 uint8_t fifo_{0};
97 uint8_t filter_bank_{0};
98
100
101 std::atomic<uint32_t> tx_lock_{0};
102 std::atomic<uint32_t> tx_pend_{0};
103
104 // Cache last applied configuration so "0 means keep" can be supported safely
105 CAN::Configuration cfg_cache_{};
106
107 // Buffers used in IRQ context
108 CanRxMsg rx_msg_{};
109 CanTxMsg tx_msg_{};
110};
111} // namespace LibXR
CAN 通信抽象类,定义经典 CAN 帧与订阅接口。 Abstract class for CAN communication with classic CAN frames and subscript...
Definition can.hpp:16
CH32CAN driver (bxCAN-like) for LibXR::CAN.
Definition ch32_can.hpp:31
ErrorCode SetConfig(const CAN::Configuration &cfg) override
Set CAN configuration (bit timing + mode). Also (re-)enables IRQs.
Definition ch32_can.cpp:308
void ProcessTxInterrupt()
Process TX interrupt (call from CANx_TX handler).
Definition ch32_can.cpp:525
void ProcessErrorInterrupt()
Process SCE/error interrupt (call from CANx_SCE handler).
Definition ch32_can.cpp:595
ErrorCode AddMessage(const ClassicPack &pack) override
Enqueue a ClassicPack for transmission.
Definition ch32_can.cpp:509
void ProcessRxInterrupt()
Process RX interrupt (call from CANx_RX0 / CANx_RX1 handlers).
Definition ch32_can.cpp:540
ErrorCode Init()
Initialize filter + IRQ routing. Does NOT force a bitrate; call SetConfig().
Definition ch32_can.cpp:151
ErrorCode GetErrorState(CAN::ErrorState &state) const override
Read bus error state and counters.
Definition ch32_can.cpp:688
uint32_t GetClockFreq() const override
CAN clock frequency (Hz). CH32 CAN is on APB1.
Definition ch32_can.cpp:435
CH32CAN(ch32_can_id_t id, uint32_t pool_size)
Construct CH32CAN.
Definition ch32_can.cpp:113
无锁无序槽池 / Lock-free, unordered slot pool
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