gab 0 8 января, 2023 Опубликовано 8 января, 2023 · Жалоба Никак не получается вывести сигнал с таймера на вывод МК. До этого не работал с 1хх серией. Таймер считает (CNT считает до ARR и сбрасывается). При желании даже прерывания с него ловятся (UG), но вывод (PB4) остаётся в высоком состоянии. Регистра BDTR, как я понял, в 103-м нет. Вот состояния регистров: ---- TIM3: CR1: 0001 CR2: 0000 SMCR: 0000 DIER: 0000 SR: 001F EGR: 0000 CCMR1: 6868 CCMR2: 0068 CCER: 0113 CNT: 00B5 PSC: 0047 ARR: 00C8 RCR: 0000 CCR[0]: 0032 [1]: 0032 [2]: 0032 [3]: 0000 BDTR: 0000 DCR: 0000 DMAR: 0001 OR: 0000 CCMR3: 0000 CCXR[0]: 0000 [1]: 0000 ------ GPIO1: CRL: 33BBB338 CRH: B4B833FF IDR: 00005BFD BSRR: 00000000 BRR: 00000000 LCKR: 00000000 ------ AFIO: EVCR: 00000000 MAPR: 00000802 EXTICR[0]: 00000000 [1]: 00000000 [2]: 00000000 [3]: 00000000 MAPR2: 00000000 ------ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 8 января, 2023 Опубликовано 8 января, 2023 · Жалоба STM32Cube_FW_F1_V1.8.4\Projects\STM3210E_EVAL\Examples\TIM\TIM_PWMOutput Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gab 0 8 января, 2023 Опубликовано 8 января, 2023 · Жалоба 1 hour ago, x893 said: STM32Cube_FW_F1_V1.8.4\Projects\STM3210E_EVAL\Examples\TIM\TIM_PWMOutput Отлично. А без HAL? У меня просто: ---- TIM3->PSC=72-1; TIM3->ARR = 100-1; TIM3->CCMR1 |= TIM_CCMR1_OC1PE; TIM3->CCMR1 |= TIM_CCMR1_OC2PE; TIM3->CCMR2 |= TIM_CCMR2_OC3PE; TIM3->CCMR1 |= (TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1);//OC1M = 110 - PWM mode 1 TIM3->CCMR1 |= (TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1);//OC2M = 110 - PWM mode 1 TIM3->CCMR2 |= (TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1); // 110 - PWM mode 1 TIM3->CCR1 = 50; TIM3->CCR2 = 50; TIM3->CCR3 = 50; TIM3->CCER |= TIM_CCER_CC3E | TIM_CCER_CC2E | TIM_CCER_CC1E; TIM3->CCER |= TIM_CCER_CC1P; TIM3->CR1 |= TIM_CR1_CEN; ----- Тактовая - 72МГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 9 января, 2023 Опубликовано 9 января, 2023 · Жалоба 11 часов назад, gab сказал: Регистра BDTR, как я понял, в 103-м нет Есть, в TIM1 и TIM8. В расширенных таймерах. У вас в инициализации вроде бы всё нормально, но надо ножки включить в режим Alternate output. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gab 0 9 января, 2023 Опубликовано 9 января, 2023 · Жалоба 15 hours ago, AHTOXA said: Есть, в TIM1 и TIM8. В расширенных таймерах. У вас в инициализации вроде бы всё нормально, но надо ножки включить в режим Alternate output. Есть ремэп: AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP_PARTIALREMAP; //ch1 / pb4 Вывод PB4 сконфигурирован как alternate push/pull (0xB) регистры GPIO1: (GPIOB) CRL: 33BBB338 CRH: B4B833FF IDR: 000053FD BSRR: 00000000 BRR: 00000000 LCKR: 00000000 регистры AFIO: EVCR: 00000000 MAPR: 00000802 EXTICR[0]: 00000000 [1]: 00000000 [2]: 00000000 [3]: 00000000 MAPR2: 00000000 тактовая AF разрешена: rccEnableAPB2(RCC_APB2ENR_AFIOEN, true); Замыканий на плате нет. Проверял и свою и китайскую BluePill, благо по схемотехнике и кварцам почти одинаковы. Если вывод перевести в обычный push/pull и просто им дёргать - дёргается. На alternate push/pull - просто стоит в высоком состоянии. В общем, таймер крутится, а на выходе единица. Соседние каналы (TIM3CH2, TIM3CH3) - тоже стабильная единица ------------------- Сделал AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP_NOREMAP GPIO0: CRL: 8B884B84 CRH: 888F44BB IDR: 0000B7F3 BSRR: 00000000 BRR: 00000000 LCKR: 00000000 AFIO: EVCR: 00000000 MAPR: 00000002 EXTICR[0]: 00000000 [1]: 00000000 [2]: 00000000 [3]: 00000000 MAPR2: 00000000 И на PA6 появился ШИМ. Как теперь это перенести на PB4? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gab 0 9 января, 2023 Опубликовано 9 января, 2023 · Жалоба 2 hours ago, gab said: Есть ремэп: AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP_PARTIALREMAP; //ch1 / pb4 Вывод PB4 сконфигурирован как alternate push/pull (0xB) регистры GPIO1: (GPIOB) CRL: 33BBB338 CRH: B4B833FF IDR: 000053FD BSRR: 00000000 BRR: 00000000 LCKR: 00000000 регистры AFIO: EVCR: 00000000 MAPR: 00000802 EXTICR[0]: 00000000 [1]: 00000000 [2]: 00000000 [3]: 00000000 MAPR2: 00000000 тактовая AF разрешена: rccEnableAPB2(RCC_APB2ENR_AFIOEN, true); Замыканий на плате нет. Проверял и свою и китайскую BluePill, благо по схемотехнике и кварцам почти одинаковы. Если вывод перевести в обычный push/pull и просто им дёргать - дёргается. На alternate push/pull - просто стоит в высоком состоянии. В общем, таймер крутится, а на выходе единица. Соседние каналы (TIM3CH2, TIM3CH3) - тоже стабильная единица ------------------- Сделал AFIO->MAPR |= AFIO_MAPR_TIM3_REMAP_NOREMAP GPIO0: CRL: 8B884B84 CRH: 888F44BB IDR: 0000B7F3 BSRR: 00000000 BRR: 00000000 LCKR: 00000000 AFIO: EVCR: 00000000 MAPR: 00000002 EXTICR[0]: 00000000 [1]: 00000000 [2]: 00000000 [3]: 00000000 MAPR2: 00000000 И на PA6 появился ШИМ. Как теперь это перенести на PB4? Отвечаю сам себе: AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_1 | AFIO_MAPR_TIM3_REMAP_PARTIALREMAP; //ch1 / pb4 Вот как правильно! PB4 по умолчанию завязан на JTAG. Нужно выставить вот этот режим: "001: Full SWJ (JTAG-DP + SW-DP) but without NJTRST" ШИМ на PB4 появился. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 19 марта, 2023 Опубликовано 19 марта, 2023 · Жалоба Столкнулась со странным поведением таймера, хотя не исключаю того, что это поведение кажется странным только мне по неведению. Дело в том, что при попытке изменить частоту генерации на выходе таймера "на лету" с помощью задания таймеру новых значений: TIM1->PSC = новый_делитель; TIM1->ARR = новая_планка_сброса; его частота изменялась не сразу, а лишь после того, так счетчик TIM1->CNT доберется до TIM1->ARR и сбросится. И лишь после этого начинается генерация новой частоты. Например: Положим, что изначально таймер работал с длинным периодом 25 секунд: TIM1->PSC = 36000-1; // 36000/72 MHz = 0.5 ms TIM1->ARR = 50000-1; // 50000 * 0.5 ms = 25000 ms = 25 s И вот, где-то внутри этого 25-секундного интервала я задаю частоту 1 МГц: TIM1->PSC = 0; // 72 MHz TIM1->ARR = 72-1; // 72 MHz / 2 = 1 MHz Тем не менее, получаю тот эффект, что мне приходится ждать, пока не истекут все 25 секунд предыдущего периода, прежде чем частота таймера увеличится до 1 МГц. Что это? Нормальная работа таймера или я что-то делаю не так? Чтобы удалить эффект задержки, пыталась занулить счетчик: TIM1->CNT = 0; но от этого стало только хуже - теперь приходится ждать все 25 секунд, пока частота не изменится. А вот этот приём сразу же помог: TIM1->CNT = TIM1->ARR - 1; по-видимому из-за того, что на следующем тике таймер сбросится. Заодно задам и такой вопрос: сбросится ли таймер, если задать CNT больше, чем ARR? Или же таймер сбрасывается лишь при их точном совпадении? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 83 19 марта, 2023 Опубликовано 19 марта, 2023 · Жалоба В 19.03.2023 в 21:45, Xenia сказал: его частота изменялась не сразу, а лишь после того, так счетчик TIM1->CNT доберется до TIM1->ARR и сбросится. И лишь после этого начинается генерация новой частоты. Bits 15:0 PSC[15:0]: Prescaler value The counter clock frequency CK_CNT is equal to fCK_PSC / (PSC[15:0] + 1). PSC contains the value to be loaded in the active prescaler register at each update event (including when the counter is cleared through UG bit of TIMx_EGR register or through trigger controller when configured in “reset mode”). В 19.03.2023 в 21:45, Xenia сказал: Заодно задам и такой вопрос: сбросится ли таймер, если задать CNT больше, чем ARR? Или же таймер сбрасывается лишь при их точном совпадении? Только при точном совпадении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 19 марта, 2023 Опубликовано 19 марта, 2023 · Жалоба 49 минут назад, HardEgor сказал: (including when the counter is cleared through UG bit of TIMx_EGR register or through trigger controller when configured in “reset mode”). В этом месте не поняла смысла. Скажем, если я сделаю так: TIM1->EGR |= TIM_EGR_UG; то PSC и ARR обновятся, но изменится ли от этого CNT? (ведь он тоже "counter") И вообще, что случится, если после обновления PSC и ARR, записью бита в EGR, окажется так, что CNT превышает новую величину ARR? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 83 19 марта, 2023 Опубликовано 19 марта, 2023 · Жалоба В 19.03.2023 в 23:08, Xenia сказал: то PSC и ARR обновятся, но изменится ли от этого CNT? (ведь он тоже "counter") Не знаю) UG надо менять This bit can be set by software, it is automatically cleared by hardware. 0: No action 1: Re-initialize the counter and generates an update of the registers. Note that the prescaler counter is cleared too (anyway the prescaler ratio is not affected). The counter is cleared if the center-aligned mode is selected or if DIR=0 (upcounting), else it takes the auto-reload value (TIMx_ARR) if DIR=1 (downcounting). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 19 марта, 2023 Опубликовано 19 марта, 2023 · Жалоба 4 минуты назад, HardEgor сказал: UG надо менять Ну, а что произойдет на линии, если я раньше срока запишу единичку в EGR? Инвертируется ли в этот момент сигнал на выходном пине или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 83 19 марта, 2023 Опубликовано 19 марта, 2023 · Жалоба В 19.03.2023 в 23:24, Xenia сказал: Ну, а что произойдет на линии, если я раньше срока запишу единичку в EGR? Инвертируется ли в этот момент сигнал на выходном пине или нет? Произойдет UEV (Update event) и все сигналы перейдут в соответствующие состояния. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Variant99 7 20 марта, 2023 Опубликовано 20 марта, 2023 · Жалоба В 08.01.2023 в 23:11, gab сказал: TIM3: CR1: 0001 CR2: 0000 SMCR: 0000 DIER: 0000 SR: 001F EGR: 0000 CCMR1: 6868 CCMR2: 0068 О боже, что это? 🥵 альтернативная вселенная? Я никогда не видел такой формы записи кода. А скажите, автор сам это хоть как-то понимает? Я вот чисто по памяти опознаю CR1: 0001 - это TIM3->CR1 = TIM_CR1_CEN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 20 марта, 2023 Опубликовано 20 марта, 2023 · Жалоба 13 часов назад, Xenia сказал: Ну, а что произойдет на линии, если я раньше срока запишу единичку в EGR? Инвертируется ли в этот момент сигнал на выходном пине или нет? Состояние выхода зависит от значения счётчика на входе компаратора и режима работы, всё. Меняется состояние счётчика по счёту или каким-то внешним воздействием - компаратору по барабану. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Variant99 7 20 марта, 2023 Опубликовано 20 марта, 2023 · Жалоба EGR - регистр принудительной (программной) генерации событий. Вот что говорит манулал по этому поводу: Bit 1 CC1G: Capture/Compare 1 generation This bit is set by software in order to generate an event, it is automatically cleared by hardware. 0: No action 1: A capture/compare event is generated on channel 1: If channel CC1 is configured as output: CC1IF flag is set, Corresponding interrupt or DMA request is sent if enabled. If channel CC1 is configured as input: The current value of the counter is captured in TIMx_CCR1 register. The CC1IF flag is set, the corresponding interrupt or DMA request is sent if enabled. The CC1OF flag is set if the CC1IF flag was already high. Bit 0 UG: Update generation This bit can be set by software, it is automatically cleared by hardware. 0: No action 1: Reinitialize the counter and generates an update of the registers. Note that the prescaler counter is cleared too (anyway the prescaler ratio is not affected). The counter is cleared if the center-aligned mode is selected or if DIR=0 (upcounting), else it takes the auto-reload value (TIMx_ARR) if DIR=1 (downcounting). Бит 1 CC1G: генерация захвата/сравнения Этот бит устанавливается программно для генерации события, он автоматически сбрасывается аппаратно. 0: нет действия 1: Событие захвата/сравнения генерируется на канале 1: Если канал CC1 сконфигурирован как выход: Флаг CC1IF установлен, соответствующее прерывание или запрос DMA отправляется, если включен. Если канал CC1 сконфигурирован как вход: Текущее значение счетчика фиксируется в регистре TIMx_CCR1. Флаг CC1IF установлен, соответствующее прерывание или запрос DMA отправляется, если включен. Флаг CC1OF устанавливается, если флаг CC1IF уже был высоким. Бит 0 UG: Генерация обновления Этот бит может быть установлен программно, он автоматически сбрасывается аппаратно. 0: никаких действий 1: Повторная инициализация счетчика и обновление регистров. Обратите внимание, что счетчик предварительного делителя также очищается (в любом случае коэффициент предварительного делителя не затрагивается). Счетчик очищается, если выбран режим выравнивания по центру или если DIR=0 (прямой счет), в противном случае он принимает значение автоматической перезагрузки (TIMx_ARR), если DIR=1 (нисходящий счет). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться