Question
LIN BUS non blocking HAL_LIN_SendBreak?
Hi, HAL_LIN_SendBreak seems to be blocking CPU, is there a way to bring UART TX pin down then wait for timer and bring it up? I have done it making GPIO pin GPIO_MODE_OUTPUT_PP then back to GPIO_MODE_AF_PP but init after takes long time. I was wondering is it possible to do it within UART without changing pin mode? Or reducing the time pin mode init is required?
void LIN_SendFrame_IT(void)
{
__HAL_UART_DISABLE(&huart2);
GPIO_InitTypeDef g = {0};
g.Pin = LIN_TX_Pin;
g.Mode = GPIO_MODE_OUTPUT_PP;
g.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LIN_TX_GPIO_Port, &g);
HAL_GPIO_WritePin(LIN_TX_GPIO_Port, LIN_TX_Pin, GPIO_PIN_RESET);
TIM2->ARR = 900; // 900us break
TIM2->CNT = 0;
TIM2->CR1 |= TIM_CR1_OPM;
HAL_TIM_Base_Start_IT(&htim2);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim != &htim2) return;
HAL_GPIO_WritePin(LIN_TX_GPIO_Port, LIN_TX_Pin, GPIO_PIN_SET);
GPIO_InitTypeDef g = {0};
g.Pin = LIN_TX_Pin;
g.Mode = GPIO_MODE_AF_PP;
// This takes way too long to retunt to UART
HAL_GPIO_Init(LIN_TX_GPIO_Port, &g);
__HAL_UART_ENABLE(&huart2);
HAL_UART_Transmit_DMA(&huart2, &DATA, 1); //Transmit
}