LINUX.ORG.RU

TIM1 захват входного сигнала

 , ,


0

0

Всем привет, уже пару дней ломаю голову над этой проблемой - не выходит настроить TIM1 input capture (для измерения длины импульсов, посылаемых HC-SR04 - ультразвуковым дальнометром). Плата - stm32vldiscovery, для разработки использую CMSIS и STDPeriph. Я новичок, если что.

Вкратце для тех кто не в курсе, как устроен протокол HC-SR04 - данный дальнометр располагает двумя пинами - Trigger и Echo. Получив на Trigger 10-микросек. сигнал, дальнометр активируется и определяет расстояние до ближайшей преграды с помощью ультразвука. Далее, он отвечает - на пин Echo посылается сигнал, длительность которого пропорциональна определенному расстоянию. (150-2500 мкс)

Вот скриншот с логического анализатора, как весь этот процесс выглядит: https://imgur.com/a/MXN13ZP. Как видно на этом фото, первая часть (триггер) у меня отлично работает (взят TIM4 CH4).

Проблема выходит со второй частью - я пытаюсь настроить TIM1 для определения длительности импульса Echo, вот код:

static void echo_init()
{
    // reconfigure PA8 to alternative function push-pull
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitTypeDef Gpio;
    GPIO_StructInit(&Gpio);
    
    Gpio.GPIO_Pin = GPIO_Pin_8;
    Gpio.GPIO_Mode = GPIO_Mode_AF_PP;
    //Gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &Gpio);

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_ICInitTypeDef TIM_ICInitStructure;
    
    // enable timer clock
    RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);

    // configure timer
    // PWM frequency = 10 hz with 24,000,000 hz system clock

    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/100000 - 1; // 10 hz or 100 ms cycle
    TIM_TimeBaseStructure.TIM_Period = 10000 - 1; // 0..9999
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    // Channel 1 latches the timer on a rising input on t1
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = 0;
    TIM_ICInitStructure.TIM_ICFilter = 0;
    TIM_ICInit(TIM1, &TIM_ICInitStructure);

    // Channel 2 latches the timer on a falling input on t2
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = 0;
    TIM_ICInitStructure.TIM_ICFilter = 0;
    TIM_ICInit(TIM1, &TIM_ICInitStructure);

    // Configure the timer slave mode with TI1FP1 as reset signal
    TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);
    TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);
    TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);

    // Enable Timer
    TIM_Cmd(TIM1, ENABLE);
}

При этом, по идее, таймер должен быть полностью сконфигурирован, но каждый раз, когда я заглядываю в регистры TIM1->CCR1 и TIM1->CCR2, они пусты! Т.е. хранят 0. Что я делаю не так, может кто-то подскажет?

int ultrasonic_get_distance()
{
    return TIM1->CCR2 - TIM1->CCR1 * 17/100;
    
    //is supposed to return distance in mm
    //always returns zero for some reason
}

ЗЫ: конфиг взят из этой книги, глава 10.2, ну и частично дописан мной.


P.S. Чего я хочу от этой темы - добиться того, чтобы TIM1->CCR1 и TIM1->CCR2 возвращали хоть какое-то значение, отличное от нуля. А там дальше уже разберусь.

По идее, та конфигурация TIM1 должна была активизировать сравнительные регистры CCR1 и CCR2 на захват моментов перехода сигнала High-Low и Low-High соответственно - при каждом переходе, в один из регистров будет записано значение Counter в данный момент. Но хм, почему-то это не работает..

x86- ()

Откровенно говоря, не очень-то этот код похож на CMSIS. На STDPeriph (или как его там) скорее.

Ну да ладно.

Давай начнём с настройки ног.

  • проверь по reference manual, что ты не ошибаешься с номером ноги
  • проверь, какой номер альтернативной функции использует нужный тебе канал.
    //Gpio.GPIO_Mode = GPIO_Mode_AF_PP;
    Gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;

Сейчас настройка режима альтернативной функции на ноге у тебя вообще закомментирована. И не указывается номер альтернативной функции (Регистр GPIO AFR).

apt_install_lrzsz ()
Ответ на: комментарий от apt_install_lrzsz

Хотя, если речь идёт о серии F1xx, то там вроде как не альтернативная функция, а ремап. Не помню точно, как он делается.

Поэтому может попробуй для начала настроить линию в режим GPIO и посмотреть, захватывает ли она вообще сигнал.

Если захватывает, значит можно перевести её обратно в режим AF и взяться за настройку таймера.

apt_install_lrzsz ()
Ответ на: комментарий от apt_install_lrzsz

Откровенно говоря, не очень-то этот код похож на CMSIS. На STDPeriph (или как его там) скорее.

Да, это CMSIS + STDPeriph. Сейчас уточню в заголовке, спасибо.

  • Подключенный пин - PA8, здесь ошибок точно нет. Он присоединен к Echo.
  • К нему привязаны три альт. функции - USART1_CK / MCO / TIM1_CH1

Сейчас настройка режима альтернативной функции на ноге у тебя вообще закомментирована.

Проблема еще вот в чем - если выполнить ряд следующих действий:

  1. Закомментируем Gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  2. Раскомментируем Gpio.GPIO_Mode = GPIO_Mode_AF_PP;

На PA8 висит сплошная единица. https://imgur.com/a/83NUd8C

А вот как указать номер альтернативной функции - я не знаю. При поиске «AFR» в используемых библиотеках результат нулевой. Не подскажешь, как это делается?

x86- ()
Ответ на: комментарий от anonymous

Сейчас покопаюсь, спасибо.

Update: там задействованы прерывания, я хочу обойтись без них - оба таймера ввода и вывода работают автономно после конфига, без необходимости каких-либо внешних вмешательств.

x86- ()
Последнее исправление: x86- (всего исправлений: 1)
Ответ на: комментарий от x86-

А вот как указать номер альтернативной функции - я не знаю. При поиске «AFR» в используемых библиотеках результат нулевой. Не подскажешь, как это делается?

Если у тебя микроконтроллер сотой серии, то там нет такого регистра. А альтернативная функция настраивается иначе. Через remap, вроде.

Здесь лучше всё же изучи ссылку на гитхаб, которую выше скинули. Тот товарищ разбирается в сотой серии.

apt_install_lrzsz ()
Ответ на: комментарий от apt_install_lrzsz

А, действительно. Но, нет, альтернативные функции настраиваются стандартным образом. Вот, например, работающая конфигурация UART2:

static void uart2_init()
{
    USART_InitTypeDef USART_InitStructure; 
    GPIO_InitTypeDef GPIO_InitStructureTx; 
    GPIO_InitTypeDef GPIO_InitStructureRx;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    // Configure TX pin

    GPIO_InitStructureTx.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructureTx.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructureTx.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_Init(GPIOA, &GPIO_InitStructureTx);

    // Configure RX pin

    GPIO_InitStructureRx.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructureRx.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructureRx);

    // Configure the UART

    USART_StructInit(&USART_InitStructure); 
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_Mode  = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART2,&USART_InitStructure); 
    USART_Cmd(USART2, ENABLE);
}

А по ссылке выше задействованы прерывания, да и используется другая библиотека - libopencm3. Что ж.

x86- ()
Ответ на: комментарий от anonymous

Тоже без него обойтись хочется. Разве нельзя просто настроить таймер на Capture Mode, а после этого - время от времени читать содержимое CCR1 и CCR2? Без смс и регистрации. Вся нужная информация с захвата (значение Counter), по идее, должна храниться в них.

x86- ()
Ответ на: комментарий от x86-

Можно и так, но где гарантии, что ты прочитал уже готовый результат, а не изменяющийся в процессе измерения? Поэтому только либо прерывание, либо DMA.

И ничего страшного в DMA нет, кроме того, что каналов DMA крайне мало (мне, например, зачастую не хватает их количества! в итоге приходится комбинировать: что-то на DMA, что-то — на прерываниях). А еще нет DMA у CAN, почему, для меня - загадка (с DMA можно было бы CAN намного шустрей разогнать, а так получается, что на больших скоростях ты теряешь часть пакетов)!

anonymous ()
Ответ на: комментарий от x86-

да и используется другая библиотека - libopencm3

Ты плохо смотрел: в директориях «nolib» не используется никакой дряни, только чистый CMSIS. Я с opencm3 уже давно соскочил — отстойная библиотека (правда, всяко лучше калокуба или SPL).

Да, не используй SPL: от него даже сами ST отказались в пользу калокуба (правда, теперь там еще больше оверхеда и ошибок).

anonymous ()
Ответ на: комментарий от x86-

Но, нет, альтернативные функции настраиваются стандартным образом.

Я веду к тому, что в более новых сериях они настраиваются иначе. В серии F4xx, например, указывается явно номер альтернативной функции. В то время как в F1xx надо только указать, что нога в режиме альтернативной функции, а выбор – какой именно, делается иначе.

Какая у тебя точно медуль микроконтроллера на плате? F100?

В нём в RM говорится, что для таймера

Bits 7:6 TIM1_REMAP[1:0]: TIM1 remapping
These bits are set and cleared by software. They control the mapping of TIM1 channels 1 to
4, 1N to 3N, external trigger (ETR) and Break input (BKIN) on the GPIO ports.
00: No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12,
CH1N/PB13, CH2N/PB14, CH3N/PB15)
01: Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6,
CH1N/PA7, CH2N/PB0, CH3N/PB1)
10: not used
11: Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15,
CH1N/PE8, CH2N/PE10, CH3N/PE12)

Если я всё правильно понимаю, то 00: No remap (ETR/PA12, CH1/PAё8 <– ремап не нужен. Всё уже должно быть ок.

Далее, надо настраивать таймер.

apt_install_lrzsz ()
Ответ на: комментарий от x86-

Можно. Но это зависит от того, как именно у тебя посылаются импульсы. Если по команде от пользователя, то можно и просто читать руками, когда по расчётам процесс измерения должен закончиться.

Если измерения периодические, то надёжнее по прерыванию.

Если периодические и очень частые, то нужно DMA.

apt_install_lrzsz ()
Ответ на: комментарий от anonymous

Знаю, но прерывания и DMA рассмотрены в главе 11 и 12, а я пока на десятой. Хотелось бы двигаться по-порядку в изучении. Позже обязательно добавлю что-то из них, но сейчас придется обойтись тем, что имеем.

x86- ()
Ответ на: комментарий от anonymous

Ты плохо смотрел: в директориях «nolib» не используется никакой дряни, только чистый CMSIS. Я с opencm3 уже давно соскочил — отстойная библиотека (правда, всяко лучше калокуба или SPL).

В nolib просто нет примеров с таймерами в режиме Capture.

Да, не используй SPL: от него даже сами ST отказались в пользу калокуба (правда, теперь там еще больше оверхеда и ошибок).

Ага, после прохождения книги собираюсь слезть с SPL. Но, кстати, чем он так плох? Вроде же это не более чем обертка над различными операциями с периферией?

x86- ()
Ответ на: комментарий от x86-

Я для TIM2 в серии L делал так:

// Максимальная частота таймера
WRITE_REG(TIM2->PSC, 0);

// Период (TIM2 32 бита)
WRITE_REG(TIM2->ARR, 160000000);

// Режим одиночных импульсов
SET_BIT(TIM2->CR1, TIM_CR1_OPM);

// CH1 на вход. Is mapped on TI1
SET_BIT(TIM2->CCMR1, TIM_CCMR1_CC1S_0);
CLEAR_BIT(TIM2->CCMR1, TIM_CCMR1_CC1S_1);

// Включить захват
SET_BIT(TIM2->CCER, TIM_CCER_CC1E);

// Включить таймер
SET_BIT(TIM2->CR1, TIM_CR1_CEN);

Дополнительно у меня ещё были прерывания и DMA.

apt_install_lrzsz ()
Последнее исправление: apt_install_lrzsz (всего исправлений: 1)
Ответ на: комментарий от x86-

разве что значение периода и частоты таймера… Которые у меня тоже ни на что не влияют, как ни экспериментирую с ними.

На всякий случай проверь, тикает ли вообще таймер. ARR почитай, например.

apt_install_lrzsz ()
Ответ на: комментарий от ox55ff

Калокуб - и есть кактус. Для извращенцев. Если тебе не нужно поддерживать продукт, а надо просто сделать одноразовую тяп-ляп поделку, калокуб вполне сгодится. Иначе - ни в коем случае!

anonymous ()
Ответ на: комментарий от anonymous

Сам то писал, что в кубе удобно схемы тактирования настраивать. А щас кактус.

И вообще, производителю виднее, что лучше. Если сделали куб и hal, значит надо использовать.

ox55ff ★★★★ ()
Ответ на: комментарий от ox55ff

Сам то писал, что в кубе удобно схемы тактирования настраивать.

Где я такое писал? Я куб использую лишь изредка - чтобы по-быстрому распределить функционал по ногам. Для тактирования калокуб не годится.

И вообще, производителю виднее, что лучше.

Бугога! То-то у «огрызка» самая уродливая гей-ось в мире, а у гугола — «андроид». Офигенно «удобные»!.. Ну или у мелкомягких - что?

Производитель рассчитывает на то, что его клиент - тупорогий баран, поэтому и делает такой говнософт. Вон, у тех же сименсов ПЛКшки ты просто так не настроишь, тебе понадобится мастдайка и «фирменное ПО», где будешь мышкой тыкать всякую фигню. Вместо того, чтобы просто взять образцовый конфиг-файл, изменить там, что тебе нужно, да залить в ПЛК при помощи cat file > /dev/ttyUSB0.

В общем, калокуб используют лишь совсем отмороженные идиоты.

anonymous ()
Ответ на: комментарий от anonymous

Эх, Эдик. Я твою жжешечку знаю лучше тебя.

Я вот все хаял этот «куб», пока не решил попробовать. Очень рекомендую: налицо все конфликты по периферии, тактирование обозначается удобной схемой…

Спешите видеть, Эдик хвалит куб.

ox55ff ★★★★ ()
Ответ на: комментарий от apt_install_lrzsz

Нет! ARR, оказывается, тоже остается нулевым. А еще, меня напрягает то, что после конфигурации TIM1, его нога переходит в состояние исключительного «High»: https://imgur.com/a/83NUd8C

Все еще не могу понять, что именно нужно изменить в конфигурации, чтобы таймер заработал.. Пойду сейчас проверю, рабочий ли он вообще (погенерирую ШИМ сигнал на нем)

x86- ()
Последнее исправление: x86- (всего исправлений: 1)
Ответ на: комментарий от anonymous

Только что замечено: вместо

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);

Из-за опечатки было

RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);

!!!

Изменяем. После изменения, при подаче питания ARR доходит до 9999, а затем останавливается на этом значении. Это уже хоть какой-то прогресс. Но сравнительные регистры по-прежнему возвращают 0.

x86- ()
Ответ на: комментарий от x86-

Сказано - сделано, настраиваем TIM1 на ШИМ Output Compare вместо Input Capture. Используем этот код для конфига:

static void echo_init()
{
    // reconfigure PA8 to alternative function push-pull
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitTypeDef Gpio;
    GPIO_StructInit(&Gpio);
    
    Gpio.GPIO_Pin = GPIO_Pin_8;
    Gpio.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &Gpio);

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    
    // enable timer clock
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
    
    // configure timer
    // PWM frequency = 10 hz with 24,000,000 hz system clock

    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/100000 - 1; // 10 hz or 100 ms cycle
    TIM_TimeBaseStructure.TIM_Period = 10000 - 1; // 0..9999
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    // PWM1 Mode configuration: Channel1
    // Edge-aligned; not single pulse mode

    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);

    // Enable Timer
    TIM_Cmd(TIM1, ENABLE);

    // Turn on pwm (1000/10000 = 10% pulse width)

    TIM_SetCompare1(TIM1, 1000);
}

Этот код точь-в-точь такой же, как для настройки Trigger, только TIM4 заменено на TIM1, CH4 заменено на CH1, номер ноги заменен, и установлена другая ширина пульса. В итоге - он не работает, ничего не генерирует (на Trigger эта же самая конфигурация отлично генерирует ШИМ). Проблема либо в:

  1. Опечатке? Но конфиг проверен несколько раз, и должен быть в порядке.
  2. Отличии TIM1 от TIM4? Но Reference manual говорит об обратном - у TIM1 тоже доступен режим генерации PWM.
  3. Неисправности таймера на моей плате? Такое вообще возможно теоретически?
x86- ()
Ответ на: комментарий от x86-

Не очень понимаю, где в этом коде выбирается канал.

Неисправности таймера на моей плате? Такое вообще возможно теоретически?

Всё бывает в этой жизни, но предлагаю не думать в этом направлении.

Однако, попробуй заменить TIM1 на TIM2, например. На той плате вроде все ноги контроллера выведены на пины.

По коду не вижу какой-то явной проблемы.

apt_install_lrzsz ()
Ответ на: комментарий от apt_install_lrzsz

Не очень понимаю, где в этом коде выбирается канал.

TIM_OC1Init(...); TIM_SetCompare1(...); - здесь на каждый канал выделено по функции, т.е., например, для четвертого канала нужно использовать

TIM_OC4Init(...); TIM_SetCompare4(...);

Однако, попробуй заменить TIM1 на TIM2, например. На той плате вроде все ноги контроллера выведены на пины.

Ок, сейчас попробую.

x86- ()
Ответ на: комментарий от ox55ff

Тактирование в кубе действительно довольно удобно смотреть.

Однако проблема куба в том, что там попадаются баги, которые несколько затруднительно в коде HAL выискивать и патчить. Неоднократно слышал негативные отзывы и от коллег, и в интернете о проблемах именно HAL. Сам тоже натыкался ранее на недоработки, из-за которых надо было в регистры периферии всё равно руками лезть.

Так что, с одной стороны, новичку сложно настраивать аппаратуру чисто на регистрах, с другой стороны, если в HAL ошибка попадётся, то тоже голову сломаешь. Шило на мыло.

apt_install_lrzsz ()
Ответ на: комментарий от apt_install_lrzsz

С TIM2 Input Capture выходит та же проблема: сам таймер заводится, регистр CNT возвращает нормальные значения в диапазоне 0…9999. Но вот CCR1 и CCR2 стабильно возвращают 0.

На всякий случай, вот код конфигурации TIM2:

static void echo_init()
{
    // reconfigure PA1 to alternative function push-pull
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  
    GPIO_InitTypeDef Gpio;
    GPIO_StructInit(&Gpio);
    
    Gpio.GPIO_Pin = GPIO_Pin_1;
    Gpio.GPIO_Mode = GPIO_Mode_AF_PP;
    //Gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &Gpio);

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_ICInitTypeDef TIM_ICInitStructure;
    
    // enable timer clock
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);

    // configure timer
    // PWM frequency = 10 hz with 24,000,000 hz system clock

    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock/100000 - 1; // 10 hz or 100 ms cycle
    //TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_Period = 10000 - 1; // 0..9999
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    // Channel 1 latches the timer on a rising input on t1
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = 0;
    TIM_ICInitStructure.TIM_ICFilter = 0;
    TIM_ICInit(TIM2, &TIM_ICInitStructure);

    // Channel 2 latches the timer on a falling input on t2
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = 0;
    TIM_ICInitStructure.TIM_ICFilter = 0;
    TIM_ICInit(TIM2, &TIM_ICInitStructure);

    // Enable Timer
    //TIM_Cmd(TIM1, ENABLE);

    // Configure the timer slave mode with TI1FP1 as reset signal
    TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);
    TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
    TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);

    // Enable Timer
    TIM_Cmd(TIM2, ENABLE);
}
x86- ()
Ответ на: комментарий от x86-

А все линии правильно настроены и подключены? Судя по reference manual:

  • ch1 – PA0
  • ch2 – PA1

И на всякий случай проверь сначала генерацию ШИМ на втором таймере. Для верности, что выводы работают.

apt_install_lrzsz ()
Ответ на: комментарий от apt_install_lrzsz

А все линии правильно настроены и подключены?

Да, использую ch2 - PA1.

И на всякий случай проверь сначала генерацию ШИМ на втором таймере. Для верности, что выводы работают.

Ага, уже проверена - работает.

x86- ()