79 template <
typename,
typename =
void>
86 T, std::void_t<decltype(std::declval<T>()->Init.MessageRAMOffset)>> : std::true_type
91 typename std::enable_if<!HasMessageRAMOffset<T>::value,
void>::type
92 CheckMessageRAMOffset(T&, uint32_t = FDCAN_MESSAGE_RAM_WORDS_MAX)
97 typename std::enable_if<HasMessageRAMOffset<T>::value,
void>::type
98 CheckMessageRAMOffset(T& fdcan_handle, uint32_t max_words = FDCAN_MESSAGE_RAM_WORDS_MAX)
100 using HandleT = std::remove_reference_t<
decltype(*fdcan_handle)>;
101 using InitT =
decltype(HandleT{}.Init);
104 static const auto FDCAN_ElmtWords = [](uint32_t sz) -> uint32_t
106#if defined(FDCAN_DATA_BYTES_8)
109 case FDCAN_DATA_BYTES_8:
111 case FDCAN_DATA_BYTES_12:
113 case FDCAN_DATA_BYTES_16:
115 case FDCAN_DATA_BYTES_20:
117 case FDCAN_DATA_BYTES_24:
119 case FDCAN_DATA_BYTES_32:
121 case FDCAN_DATA_BYTES_48:
123 case FDCAN_DATA_BYTES_64:
134 const uint32_t TX_FIFO_ELEMS =
138 const auto FDCAN_MessageRAMWords = [&](
const InitT& c) -> uint32_t
140 return c.StdFiltersNbr * 1u + c.ExtFiltersNbr * 2u +
141 c.RxFifo0ElmtsNbr * FDCAN_ElmtWords(c.RxFifo0ElmtSize) +
142 c.RxFifo1ElmtsNbr * FDCAN_ElmtWords(c.RxFifo1ElmtSize) +
143 c.RxBuffersNbr * FDCAN_ElmtWords(c.RxBufferSize) + c.TxEventsNbr * 2u +
144 (c.TxBuffersNbr + TX_FIFO_ELEMS) * FDCAN_ElmtWords(c.TxElmtSize);
152 } offset_map[STM32_FDCAN_NUMBER] = {};
154 auto id = STM32_FDCAN_GetID(fdcan_handle->Instance);
155 ASSERT(
id >= 0 &&
id < STM32_FDCAN_NUMBER);
157 offset_map[id].offset = fdcan_handle->Init.MessageRAMOffset;
158 offset_map[id].size = FDCAN_MessageRAMWords(fdcan_handle->Init);
160 const uint32_t START = offset_map[id].offset;
161 const uint32_t END = START + offset_map[id].size;
164 ASSERT(START <= max_words);
165 ASSERT(END <= max_words);
167 for (
auto& it : offset_map)
174 const uint32_t A0 = it.offset, A1 = it.offset + it.size;
175 const uint32_t B0 = START, B1 = END;
176 if (A0 < B1 && B0 < A1)
183 offset_map[id].inited =
true;
193 STM32CANFD(FDCAN_HandleTypeDef* hcan, uint32_t queue_size);
200 ErrorCode
Init(
void);
202 ErrorCode
AddMessage(
const ClassicPack& pack)
override;
204 ErrorCode
AddMessage(
const FDPack& pack)
override;
226 auto free = HAL_FDCAN_GetTxFifoFreeLevel(hcan_);
230 FDCAN_HandleTypeDef* hcan_;
232 stm32_fdcan_id_t id_;
240 FDCAN_RxHeaderTypeDef header;
247 FDCAN_TxHeaderTypeDef header;