Перейти к содержанию
    

stm32f103 и выход таймера

Никак не получается вывести сигнал с таймера на вывод МК. До этого не работал с 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
------

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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МГц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 часов назад, gab сказал:

Регистра BDTR, как я понял, в 103-м нет

Есть, в TIM1 и TIM8. В расширенных таймерах.

У вас в инициализации вроде бы всё нормально, но надо ножки включить в режим Alternate output.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 появился.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Столкнулась со странным поведением таймера, хотя не исключаю того, что это поведение кажется странным только мне по неведению.

Дело в том, что при попытке изменить частоту генерации на выходе таймера "на лету" с помощью задания таймеру новых значений:

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? Или же таймер сбрасывается лишь при их точном совпадении?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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? Или же таймер сбрасывается лишь при их точном совпадении?

Только при точном совпадении.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, HardEgor сказал:

UG надо менять

Ну, а что произойдет на линии, если я раньше срока запишу единичку в EGR? Инвертируется ли в этот момент сигнал на выходном пине или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 19.03.2023 в 23:24, Xenia сказал:

Ну, а что произойдет на линии, если я раньше срока запишу единичку в EGR? Инвертируется ли в этот момент сигнал на выходном пине или нет?

Произойдет UEV (Update event) и все сигналы перейдут в соответствующие состояния.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 часов назад, Xenia сказал:

Ну, а что произойдет на линии, если я раньше срока запишу единичку в EGR? Инвертируется ли в этот момент сигнал на выходном пине или нет?

Состояние выхода зависит от значения счётчика на входе компаратора и режима работы, всё. Меняется состояние счётчика по счёту или каким-то внешним воздействием - компаратору по барабану.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 (нисходящий счет).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...