libxr 1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_canfd.cpp
1#include "stm32_canfd.hpp"
2
3#ifdef HAL_FDCAN_MODULE_ENABLED
4
5using namespace LibXR;
6
7STM32CANFD* STM32CANFD::map[STM32_FDCAN_NUMBER] = {nullptr};
8
15stm32_fdcan_id_t STM32_FDCAN_GetID(FDCAN_GlobalTypeDef* addr)
16{
17 if (addr == nullptr)
18 { // NOLINT
19 return stm32_fdcan_id_t::STM32_FDCAN_ID_ERROR;
20 }
21#ifdef FDCAN1
22 else if (addr == FDCAN1)
23 { // NOLINT
24 return stm32_fdcan_id_t::STM32_FDCAN1;
25 }
26#endif
27#ifdef FDCAN2
28 else if (addr == FDCAN2)
29 { // NOLINT
30 return stm32_fdcan_id_t::STM32_FDCAN2;
31 }
32#endif
33#ifdef FDCAN3
34 else if (addr == FDCAN3)
35 { // NOLINT
36 return stm32_fdcan_id_t::STM32_FDCAN3;
37 }
38#endif
39 else
40 {
41 return stm32_fdcan_id_t::STM32_FDCAN_ID_ERROR;
42 }
43}
44
45extern "C" void HAL_FDCAN_ErrorCallback(FDCAN_HandleTypeDef* hcan)
46{
47 hcan->ErrorCode = HAL_FDCAN_ERROR_NONE;
48 auto can = STM32CANFD::map[STM32_FDCAN_GetID(hcan->Instance)];
49 if (can)
50 {
51 can->ProcessTxInterrupt();
52 }
53}
54
55extern "C" void HAL_FDCAN_ErrorStatusCallback(FDCAN_HandleTypeDef* hfdcan,
56 uint32_t ErrorStatusITs)
57{
58 if ((ErrorStatusITs & FDCAN_IT_BUS_OFF) != RESET)
59 {
60 FDCAN_ProtocolStatusTypeDef protocol_status = {};
61 HAL_FDCAN_GetProtocolStatus(hfdcan, &protocol_status);
62 if (protocol_status.BusOff)
63 {
64 CLEAR_BIT(hfdcan->Instance->CCCR, FDCAN_CCCR_INIT);
65 }
66 }
67
68 auto can = STM32CANFD::map[STM32_FDCAN_GetID(hfdcan->Instance)];
69 if (can)
70 {
71 can->ProcessTxInterrupt();
72 }
73}
74
75extern "C" void HAL_FDCAN_TxBufferCompleteCallback(FDCAN_HandleTypeDef* hcan,
76 uint32_t BufferIndexes)
77{
78 UNUSED(BufferIndexes);
79 auto can = STM32CANFD::map[STM32_FDCAN_GetID(hcan->Instance)];
80 if (can)
81 {
82 can->ProcessTxInterrupt();
83 }
84}
85
86extern "C" void HAL_FDCAN_TxFifoEmptyCallback(FDCAN_HandleTypeDef* hcan)
87{
88 auto can = STM32CANFD::map[STM32_FDCAN_GetID(hcan->Instance)];
89 if (can)
90 {
91 can->ProcessTxInterrupt();
92 }
93}
94
95extern "C" void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef* hcan, uint32_t RxFifo0ITs)
96{
97 UNUSED(RxFifo0ITs);
98 auto can = STM32CANFD::map[STM32_FDCAN_GetID(hcan->Instance)];
99 if (can)
100 {
101 can->ProcessRxInterrupt(FDCAN_RX_FIFO0);
102 }
103}
104
105extern "C" void HAL_FDCAN_RxFifo1Callback(FDCAN_HandleTypeDef* hcan, uint32_t RxFifo1ITs)
106{
107 UNUSED(RxFifo1ITs);
108 auto can = STM32CANFD::map[STM32_FDCAN_GetID(hcan->Instance)];
109 if (can)
110 {
111 can->ProcessRxInterrupt(FDCAN_RX_FIFO1);
112 }
113}
114
115#endif
STM32CANFD 类,用于处理 STM32 系统的 CANFD 通道。 Provides handling for STM32 CANFD.
void ProcessRxInterrupt(uint32_t fifo)
处理接收中断
void ProcessTxInterrupt()
处理发送中断
LibXR Color Control Library / LibXR终端颜色控制库
Definition esp_gpio.hpp:8