Я пишу драйвер низкого уровня для протокола связи с одной линией. Эта линия подключена как к выводу Tx, так и к выводу Rx на микроконтроллере STM32F0, работающем с внутренними часами на частоте 8 МГц. Состояние вывода Tx устанавливается в прерывании таймера, а вывод Rx считывается во внешнем прерывании GPIO.
Для тестирования я переключаю вывод Tx на 416 мкс (значение автоматической перезагрузки составляет 3333 без предварительного делителя), а в прерывании GPIO я считываю разницу во времени между двумя последовательными прерываниями. Измеренное время составляет примерно 500 мкс от прерывания перехода с высокого уровня на низкий до прерывания перехода с низкого на высокий и 300 мкс от прерывания перехода с низкого уровня на высокий до прерывания перехода с высокого уровня на низкий. Почему такая разница? И как от этого избавиться?
Я проверил сигнал на осциллографе, и это идеальная прямоугольная волна с длительностью импульса 416 мкс. Я также использую htim->Instance->CNT = 0;
и time = htim->Instance->CNT;
, чтобы обернуть разные части кода, чтобы найти, откуда взялась разница, но безрезультатно.
Вот обработчики прерываний, измеренное время сохраняется в переменной tim3_value
:
void TIM2_IRQHandler(void)
{
if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET)
{
if (__HAL_TIM_GET_IT_SOURCE(&htim2, TIM_IT_UPDATE) != RESET)
{
__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);
HAL_GPIO_TogglePin(TX_GPIO_Port, TX_Pin);
htim2.Instance->ARR = 3333;
}
}
return;
}
void EXTI4_15_IRQHandler(void)
{
if(__HAL_GPIO_EXTI_GET_IT(RX_Pin) != 0x00u)
{
__HAL_GPIO_EXTI_CLEAR_IT(RX_Pin);
tim3_value = htim3.Instance->CNT;
htim3.Instance->CNT = 0;
}
return;
}
htim2.Instance->ARR = 3333;
не изменит ARR. Он изменит его при следующем переполнении - person 0___________   schedule 30.09.2020