Ср окт 12, 2022 16:23:09
Ср окт 12, 2022 16:24:34
Ср окт 12, 2022 17:45:11
Ср окт 12, 2022 17:56:03
Ср окт 12, 2022 17:56:36
Ср окт 12, 2022 18:10:00
Ср окт 12, 2022 19:51:18
Чт окт 13, 2022 06:50:01
Самое быстрое, полностью аппаратное решение - два таймера и объединённые выходные пины "открытый сток" + резистор + буфер по вкусу
Чт окт 13, 2022 10:10:17
Чт окт 13, 2022 10:29:46
Режим объединения входов по XOR
Для таймеров TIM2 — TIM5 существует возможность подавать на вход фильтра первого входного канала комбинированный по XOR сигнал от входов TIMx_CH1, TIMx_CH2, TIMx_CH3. Эта фишка используется при подключении интерфейсов датчиков Холла (подробности в RM0008, глава 14.3.18, стр.327).
Для выбора этой опции нужно установить в 1 бит TI1S.
Самое быстрое, полностью аппаратное решение - два таймера и объединённые выходные пины "открытый сток" + резистор + буфер по вкусу.
Чт окт 13, 2022 12:27:46
Чт окт 13, 2022 16:47:06
Чт окт 13, 2022 16:57:06
Чт окт 13, 2022 17:07:09
Чт окт 13, 2022 17:26:11
Пт окт 14, 2022 09:34:38
Вт янв 17, 2023 14:47:26
static void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_SlaveConfigTypeDef sSlaveConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 4999;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;
sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;
sSlaveConfig.TriggerFilter = 0;
if (HAL_TIM_SlaveConfigSynchro(&htim2, &sSlaveConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM2;
sConfigOC.Pulse = 1;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
HAL_TIM_MspPostInit(&htim2);
}
// Запускаем таймер
TIM2->CNT = 0;
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_2);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */
if (htim->Instance == TIM1) {
HAL_IncTick();
}
/* USER CODE BEGIN Callback 1 */
else if (htim->Instance == TIM2)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_7);
TIM2->CCR2 = 4999;
TIM2->ARR = 9999;
}
else
{
__NOP();
}
/* USER CODE END Callback 1 */
}
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
{
if(i == 0)
{
i++;
}
else
{
i = 0;
HAL_TIM_Base_Stop_IT(&htim2);
HAL_TIM_PWM_Stop_IT(&htim2, TIM_CHANNEL_2);
}
}
else
{
__NOP();
}
}
else if(htim->Instance == TIM5)
{
LL_TIM_SetCounter(TIM7, 0);
LL_TIM_EnableIT_UPDATE(TIM7);
LL_TIM_EnableCounter(TIM7);
}
else
{
__NOP();
}
}
void TIM7_Callback(void)
{
if(LL_TIM_IsActiveFlag_UPDATE(TIM7))
{
TIM2->CNT = 0;
TIM2->CCR2 = 1;
TIM2->ARR = 4999;
TIM2->EGR = TIM_EGR_UG;
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_PWM_Start_IT(&htim2, TIM_CHANNEL_2);
LL_TIM_ClearFlag_UPDATE(TIM7);
}
else
{
__NOP();
}
}