/**

  • @brief DMX512定时器中断处理函数

  • @param htimHandle 定时器句柄 */ void Dmx512_TIM_IRQHandler(TIM_HandleTypeDef *htimHandle) { // 定时器中断触发时调用该函数 if (dmxSendState == STATE_MBB) { // Mark Before Break(MBB)状态已完成,下一个状态为 Break,将TX引脚设为低电平 dmxSendState = STATE_BREAK; HAL_GPIO_WritePin(DMX_TX_GPIO_Port, DMX_TX_Pin, GPIO_PIN_RESET); dmxHtim->Instance->ARR = MARK_BREAK;

    } else if (dmxSendState == STATE_BREAK) { // Break状态已完成,下一个状态为 Mark After Break(MAB),将TX引脚设为高电平 // 考虑设置GPIO备用功能模式所需的时间 dmxSendState = STATE_MAB; HAL_TIM_Base_Stop_IT(dmxHtim); HAL_TIM_Base_Start(dmxHtim); dmxHtim->Instance->CNT = 0; HAL_GPIO_WritePin(DMX_TX_GPIO_Port, DMX_TX_Pin, GPIO_PIN_SET); Dmx512EnableUsart(dmxHuart); uint32_t elapsedTime = dmxHtim->Instance->CNT; long time = MARK_AFTER_BREAK - 1 - elapsedTime; dmxHtim->Instance->ARR = (time > 0) ? time : 1; HAL_NVIC_EnableIRQ(DMX_TIM_IRQ); HAL_TIM_Base_Start_IT(dmxHtim);

    } else if (dmxSendState == STATE_MAB) { // Mark After Break(MAB)状态已完成,接下来通过USART发送数据,然后进入MBB状态 dmxSendState = STATE_DMA; HAL_TIM_Base_Stop_IT(dmxHtim); HAL_NVIC_DisableIRQ(DMX_TIM_IRQ); while (HAL_UART_Transmit_DMA(dmxHuart, dmxData, DMX_CHANNELS + 1) != HAL_OK) ; HAL_UART_IRQHandler(dmxHuart); } }

C语言函数中文注释添加:DMX512定时器中断处理

原文地址: https://www.cveoy.top/t/topic/oq3Q 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录