libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_canfd.hpp
1#pragma once
2
3#include "main.h"
4
5#ifdef HAL_FDCAN_MODULE_ENABLED
6
7#ifdef FDCAN
8#undef FDCAN
9#endif
10
11#include "can.hpp"
12#include "libxr.hpp"
13
14typedef enum
15{
16#ifdef FDCAN1
17 STM32_FDCAN1,
18#endif
19#ifdef FDCAN2
20 STM32_FDCAN2,
21#endif
22#ifdef FDCAN3
23 STM32_FDCAN3,
24#endif
25 STM32_FDCAN_NUMBER,
26 STM32_FDCAN_ID_ERROR
27} stm32_fdcan_id_t;
28
29stm32_fdcan_id_t STM32_FDCAN_GetID(FDCAN_GlobalTypeDef* addr); // NOLINT
30
31namespace LibXR
32{
38class STM32CANFD : public FDCAN
39{
40 public:
48 STM32CANFD(FDCAN_HandleTypeDef* hcan, uint32_t queue_size);
49
55 ErrorCode Init(void);
56
57 ErrorCode AddMessage(const ClassicPack& pack) override;
58
59 static constexpr uint32_t FDCAN_PACK_LEN_MAP[16] = {
60 FDCAN_DLC_BYTES_0, FDCAN_DLC_BYTES_1, FDCAN_DLC_BYTES_2, FDCAN_DLC_BYTES_3,
61 FDCAN_DLC_BYTES_4, FDCAN_DLC_BYTES_5, FDCAN_DLC_BYTES_6, FDCAN_DLC_BYTES_7,
62 FDCAN_DLC_BYTES_8, FDCAN_DLC_BYTES_12, FDCAN_DLC_BYTES_16, FDCAN_DLC_BYTES_20,
63 FDCAN_DLC_BYTES_24, FDCAN_DLC_BYTES_32, FDCAN_DLC_BYTES_48, FDCAN_DLC_BYTES_64,
64 };
65
66 static constexpr uint32_t FDCAN_PACK_LEN_TO_INT_MAP[16] = {
67 0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64,
68 };
69
70 ErrorCode AddMessage(const FDPack& pack) override;
71
77 void ProcessRxInterrupt(uint32_t fifo);
78
83 void ProcessTxInterrupt();
84
85 FDCAN_HandleTypeDef* hcan_;
86
87 stm32_fdcan_id_t id_;
89 LockFreeQueue<FDPack> tx_queue_fd_;
90 Mutex write_mutex_, write_mutex_fd_;
91 static STM32CANFD* map[STM32_FDCAN_NUMBER]; // NOLINT
92
93 struct
94 {
95 FDCAN_RxHeaderTypeDef header;
96 ClassicPack pack;
97 FDPack pack_fd;
98 } rx_buff_;
99
100 struct
101 {
102 FDCAN_TxHeaderTypeDef header;
103 ClassicPack pack;
104 FDPack pack_fd;
105 } tx_buff_;
106
107 uint32_t txMailbox;
108};
109} // namespace LibXR
110
111#endif
FDCAN 通信接口,扩展 CAN 功能,支持灵活数据速率(FD)CAN 消息 (FDCAN communication interface that extends CAN functionality...
Definition can.hpp:95
无锁队列实现 / Lock-free queue implementation
互斥锁类,提供线程同步机制 (Mutex class providing thread synchronization mechanisms).
Definition mutex.hpp:18
STM32CANFD 类,用于处理 STM32 系统的 CANFD 通道。 Provides handling for STM32 CANFD.
ErrorCode Init(void)
初始化
void ProcessRxInterrupt(uint32_t fifo)
处理接收中断
STM32CANFD(FDCAN_HandleTypeDef *hcan, uint32_t queue_size)
STM32CANFD 类,用于处理 STM32 系统的 CANFD 通道。 Provides handling for STM32 CANFD.
ErrorCode AddMessage(const ClassicPack &pack) override
添加 CAN 消息到系统 (Adds a CAN message to the system).
void ProcessTxInterrupt()
处理发送中断
LibXR 命名空间
Definition ch32_gpio.hpp:9