Add support for register callbacks

This commit is contained in:
2026-03-31 11:52:59 +03:00
parent 3cae8b7008
commit 7f116acf22
35 changed files with 4180 additions and 3469 deletions

View File

@@ -92,7 +92,10 @@ int main(void)
MX_RTC_Init();
MX_TIM4_Init();
/* USER CODE BEGIN 2 */
HAL_CAN_Start(&hcan);
HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_ERROR | CAN_IT_BUSOFF | CAN_IT_LAST_ERROR_CODE);
PROTOCAN_INIT(&hcan, &hrtc, &htim4);
PROTOCAN_LOOP();
/* USER CODE END 2 */
/* Infinite loop */

View File

@@ -6,6 +6,7 @@ struct controlflags ControlFlags;
CAN_HandleTypeDef *_HCAN = 0;
RTC_HandleTypeDef *_HRTC = 0;
TIM_HandleTypeDef *_HTIM = 0;
uint8_t CurrentStep = 1;
uint8_t LastStep = 0;
@@ -35,25 +36,61 @@ uint16_t AvailableCanRxMsg(void)
return ((uint16_t)(CAN_RX_BUFFER_SIZE + (LastStep - CurrentStep + 1)))%CAN_RX_BUFFER_SIZE;
}
void PROTOCAN_DEINIT(uint8_t stage)
{
switch(stage) {
case 3:
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
HAL_TIM_UnRegisterCallback(_HTIM, HAL_TIM_PERIOD_ELAPSED_CB_ID);
#endif
case 2:
case 1:
#if (USE_HAL_CAN_REGISTER_CALLBACKS == 1)
HAL_CAN_UnRegisterCallback(_HCAN, HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID);
#endif
}
return;
}
/**
* @brief Инициализация переферии
* @details Инициализация указателей на HCAN, HRTC, установка фильтров CAN.
* @note Фильтры CAN описаны в разделе PROTOCAN_CAN_FILTERS().
*/
PROTOCAN_INIT_StatusTypeDef PROTOCAN_INIT(CAN_HandleTypeDef *tmp_hcan, RTC_HandleTypeDef *tmp_hrtc)
PROTOCAN_INIT_StatusTypeDef PROTOCAN_INIT(CAN_HandleTypeDef *tmp_hcan, RTC_HandleTypeDef *tmp_hrtc, TIM_HandleTypeDef *tmp_tim)
{
//HAL_CAN_Start(_HCAN);
//HAL_CAN_ActivateNotification(_HCAN, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_ERROR | CAN_IT_BUSOFF | CAN_IT_LAST_ERROR_CODE);
//MX_TIM4_Init();
//MX_RTC_Init();
if(tmp_hcan)
unsigned initStage = 0;
if(tmp_hcan) {
_HCAN = tmp_hcan;
else
#if (USE_HAL_CAN_REGISTER_CALLBACKS == 1)
HAL_CAN_RegisterCallback(_HCAN, HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID, ProtoCanRxFifo0MsgPendingCallback);
#endif
} else {
PROTOCAN_DEINIT(initStage);
return PROTOCAN_HCAN_ERROR;
if(tmp_hrtc)
}
initStage++;
if(tmp_hrtc) {
_HRTC = tmp_hrtc;
else
} else {
PROTOCAN_DEINIT(initStage);
return PROTOCAN_HRTC_ERROR;
}
initStage++;
if(tmp_tim) {
_HTIM = tmp_tim;
#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)
HAL_TIM_RegisterCallback(_HTIM, HAL_TIM_PERIOD_ELAPSED_CB_ID, ProtoCanPulseCallback);
#endif
} else {
PROTOCAN_DEINIT(initStage);
return PROTOCAN_TIM_ERROR;
}
initStage++;
PROTOCAN_FILTERS();
ControlFlags.IsPulse = 1;
return PROTOCAN_OK;
@@ -65,6 +102,7 @@ PROTOCAN_INIT_StatusTypeDef PROTOCAN_INIT(CAN_HandleTypeDef *tmp_hcan, RTC_Handl
* Обработка запроса аналоговых значений - PROTOCAN_AnalogProcessing().
* Обработка широковещательных запросов - PROTOCAN_BroadcastProcessing().
* Обработка запроса дискретных значений - PROTOCAN_DiscreticProcessing().
* Обработка запроса к общему адресному пространству - PROTOCAN_GeneralAddressSpace_Answer().
* Обработка Modbus - PROTOCAN_ModbusProcessing().
*/
void PROTOCAN_LOOP(void)
@@ -831,7 +869,7 @@ void TakeRxMsgToBuffer(extID tmp_eID, uint32_t tmp_IDE, uint32_t tmp_RTR, uint32
* Читает все сообщения из FIFO, проверяет их тип, обновляет статус устройств сети или сохраняет сообщение в буфер.
* @param hcan Указатель на структуру управления CAN-Hardware.
*/
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
void ProtoCanRxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
//Обработка всех сообщений в FIFO
CAN_RxHeaderTypeDef RxHeader;
@@ -869,7 +907,7 @@ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
* @brief Функция отправки пульса устройства.
* @details Пульс устройства. Есть возможность отключить пульс по запросу.
*/
void PROTOCAN_Pulse_TIM_Handler()
void ProtoCanPulseCallback(TIM_HandleTypeDef *htim)
{
if(ControlFlags.IsPulse)
{

View File

@@ -261,7 +261,7 @@ void CAN1_SCE_IRQHandler(void)
void TIM4_IRQHandler(void)
{
/* USER CODE BEGIN TIM4_IRQn 0 */
REQUESTER_Pulse_TIM_Handler();
/* USER CODE END TIM4_IRQn 0 */
HAL_TIM_IRQHandler(&htim4);
/* USER CODE BEGIN TIM4_IRQn 1 */

View File

@@ -41,7 +41,7 @@ void MX_TIM4_Init(void)
/* USER CODE END TIM4_Init 1 */
htim4.Instance = TIM4;
htim4.Init.Prescaler = TIM_REQUESTER_Prescaler-1;
htim4.Init.Prescaler = TIM_PROTOCAN_Prescaler-1;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 1000;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;