STM32F101-107 HAL Input filters цифровые фильтры на входах портов таймеров.
Назначение цифрового фильтра — это отделение помех от истинного сигнала на входе контроллера, например, возникающие при дребезге контактов. Многие пытаются реализовать такой фильтр аналоговым путём или программным, что усложняет схему устройства или программный код и замедляет работу контроллера. Разработчики ST позаботились об этой проблеме, создав на некоторых входах контроллера цифровые фильтры. Именно таймеры, у которых есть регистры Capture/Compare и вход TIMx_ETR, имеют на своих входах эти цифровые фильтры, назначение которых — пропускать сигнал не меньше определенной продолжительности для отфильтровки помех.
Ниже на схеме они выделены.

Эти фильтры довольно-таки сложные устройства, но принцип их работы прост: фильтр захватывает сигнал, и если он будет держаться нужное время на входе или более, то он пропустится дальше в контроллер. Поподробней о работе фильтра: фильтр состоит из двух счётчиков — это счётчик захвата сигнала и счётчик фильтра или подтверждение сигнала. Счётчик захвата должен отсчитать время присутствия высокого сигнала на входе для его генерации на выходе в дальнейшем, так как фильтр пропускает сигнал не в реальном времени, а с задержкой. Второй счётчик — это подтверждение, который отсчитывает время, меньше которого сигнал не должен пропускаться, если он видит, что сигнал на входе держится неизменно нужное время, то сигнал пропускается дальше в контроллер. Пропущенный сигнал после того, как пропадёт на входе, будет до восстановлен из счётчика захвата для его повторения с входным сигналом.
Ещё подробней показано ниже.
Что такое FDTS и TDTS!
FDTS(Frequency Device Tree Source)-частота источника тактирования.
TDTS(Time Device Tree Source)-продолжительность одного такта источника тактирования.
Источник тактирования здесь тод же что и у рассматриваемого таймера.
Фильтрация сигнала FDTS/2 и N=6 для входа TIMx_CH1.

Пример расчёта продолжительности сигнала для счётчика фильтра.
1.Тактирование таймера 8MHz это будет 1 / 8000000 = 125 наносекунд.
2.TDTS TIMx_CR1 CKD[1:0]=’01′ или htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2; значит 125 наносекунды * 2 = 250 наносекунд.
3.TIMx_CCMR1 IC1F[3:0]=’0100′ или sConfig.IC1Filter = 4; находим параметр ниже в таблице 0100: fSAMPLING=fDTS/2, N=6 вычисляем 250 наносекунд * 2 * 6 = 3 микросекунды, сигнал меньше этой продолжительности не буде пропускаться фильтром.
Пример настройки входного фильтра.
Описание функций и параметров настройки фильтров находятся в статье.
Пример настройки таймера и фильтров.
static void MX_TIM2_Init(void){
TIM_Encoder_InitTypeDef sConfig = {0};
htim2.Instance = TIM2;
/*Устанавливаем предделитель /2, одна риска один отсчёт*/
htim2.Init.Prescaler = 1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
/*Устанавливаем ограничение счёта до 15*/
htim2.Init.Period = 14;
/*Устанавливаем масимальный делитель для входных фильтров*/
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
sConfig.EncoderMode = TIM_ENCODERMODE_TI1;
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
/*Устанавливаем максимально продолжительный сигнал для входного фильтра входа 1*/
sConfig.IC1Filter = 4;
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
/*Устанавливаем максимально продолжительный сигнал для входного фильтра входа 2*/
sConfig.IC2Filter = 4;
HAL_TIM_Encoder_Init(&htim2, &sConfig);
}htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2 - делитель(на рисунке выше строка TDTS TIMx_CR1 CKD[1:0]=’01′) для всех фильтров таймера входы Capture/Compare и вход TIMx_ETR, за это отвечает регистр TIMx_CR1 биты CKD.
Варианты
.Init.ClockDivision =
TIM_CLOCKDIVISION_DIV1
TIM_CLOCKDIVISION_DIV2
TIM_CLOCKDIVISION_DIV4sConfig.IC1Filter = 4 и sConfig.IC2Filter = 4 - установка делителя для счётчика времени подтверждения(рисунок выше строка TIMx_CCMR1 IC1F[3:0]=’0100′) и продолжительность N времени подтверждения сигнала(на рисунке выше строка Счётчик фильтра N=6), настраиваются в регистре TIMx_CCMR1 биты IC1F и IC2F. Для sConfig.IC3Filter, sConfig.IC4Filter регистр TIMx_CCMR2 биты IC3F и IC4F.
Варианты для входов Capture/Compare
sConfig.IC1Filter, sConfig.IC2Filter, sConfig.IC3Filter и sConfig.IC4Filter =
0000: No filter, sampling is done at fDTS
0001: fSAMPLING=fCK_INT, N=2
0010: fSAMPLING=fCK_INT, N=4
0011: fSAMPLING=fCK_INT, N=8
0100: fSAMPLING=fDTS/2, N=6
0101: fSAMPLING=fDTS/2, N=8
0110: fSAMPLING=fDTS/4, N=6
0111: fSAMPLING=fDTS/4, N=8
1000: fSAMPLING=fDTS/8, N=6
1001: fSAMPLING=fDTS/8, N=8
1010: fSAMPLING=fDTS/16, N=5
1011: fSAMPLING=fDTS/16, N=6
1100: fSAMPLING=fDTS/16, N=8
1101: fSAMPLING=fDTS/32, N=5
1110: fSAMPLING=fDTS/32, N=6
1111: fSAMPLING=fDTS/32, N=8
Варианты для TIMx_ETR входа
0000: No filter, sampling is done at fDTS
0001: fSAMPLING=fCK_INT, N=2
0010: fSAMPLING=fCK_INT, N=4
0011: fSAMPLING=fCK_INT, N=8²
0100: fSAMPLING=fDTS/2, N=6
0101: fSAMPLING=fDTS/2, N=8
0110: fSAMPLING=fDTS/4, N=6²
0111: fSAMPLING=fDTS/4, N=8
1000: fSAMPLING=fDTS/8, N=6
1001: fSAMPLING=fDTS/8, N=8
1010: fSAMPLING=fDTS/16, N=5
1011: fSAMPLING=fDTS/16, N=6
1100: fSAMPLING=fDTS/16, N=8
1101: fSAMPLING=fDTS/32, N=5
1110: fSAMPLING=fDTS/32, N=6
1111: fSAMPLING=fDTS/32, N=8

