Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Таймер STM8

Вт дек 26, 2017 15:19:44

Таймер2 STM8 инициализирую так-
Код:
GPIO_Init(GPIOA,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_FAST); // выход шим
  TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 1, TIM2_OCPOLARITY_LOW);
  TIM2_OC3PreloadConfig(ENABLE);
  TIM2_ARRPreloadConfig(ENABLE);
  TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);


Включаю таймер-
Код:
TIM2_Cmd(ENABLE);


Когда выключаю-
Код:
TIM2_Cmd(DISABLE);

-то иногда на выходе на ноге А3 иногда плюс остается,иногда ноль. Что-то делал в авр для того,чтобы на ноль падал всегда, не могу вспомнить. Посоветуйте.

Re: Таймер STM8

Вт дек 26, 2017 16:08:09

Вот это наверное Вас интересует.

Re: Таймер STM8

Вт дек 26, 2017 17:47:12

Чё то я туплю, как это правильно написать в IAR- "TIM2_CCMR1 биты OC1M[2:0] переводите из режима ШИМ на режим 001" ? :oops:

Re: Таймер STM8

Вт дек 26, 2017 17:48:34

Вы референс откройте и сразу станет понятно. Весь документ то читать не надо, сразу читайте про нужный регистр.

Re: Таймер STM8

Вт дек 26, 2017 17:57:31

Нет, я про синтаксис, как это писать? Пример нужен.

Re: Таймер STM8

Вт дек 26, 2017 18:16:07

TIM2->CCMR1 = TIM4_CR1_CEN;
Или побитно:
Код:
CLK->PCKENR1 = CLK_PCKENR1_TIM1   * 0      // таймер 1
              | CLK_PCKENR1_TIM2      * 1      // таймер 2
              | CLK_PCKENR1_TIM4      * 1      // таймер 4
              | CLK_PCKENR1_UART1      * 1      // UART1
              | CLK_PCKENR1_SPI        * 1      // SPI
              | CLK_PCKENR1_I2C        * 0;   // I2C

Все определения есть в хедерах

Re: Таймер STM8

Вт дек 26, 2017 18:49:29

Как скучно вы живете со своими готовыми функциями.

Предположу что мк STM8S103.

Вы устанавливаете режим PWM1, т.е. записываете в биты OC1M[2:0] 0b110.

Установив в эти биты 0b001 или 0b010 выход порта принудительно установится 1 или 0 соответственно. Таймер останавливать для этого не надо, если конечно другой нет причины для остановки.

Можно использовать вот такие конструкции (структура с битовыми полями).
TIM2_CCMR1_OC1M=0x1; //принудительно в 1.
TIM2_CCMR1_OC1M=0x6;//режим PWM1

Второй вариант, с компилироваться должно короче.
OC1M установлен режим 0b110, т.е. pwm1.
Вам надо принудительно на выходе установить 0. Т.е. режим 0b010 или всего лишь погасить бит OC1M2.
TIM2_CCMR1_OC1M&=0x3;
Вернуть обратно
TIM2_CCMR1_OC1M|=0x4;

Re: Таймер STM8

Ср дек 27, 2017 05:08:47

Ну как скучно..пришлось проездом написать для STM8 прогу, с синтаксисом для IAR запутался, для STM32 побитово писать я пробовал,а тут что то затупил. STM8S003. Какой бит для чего я понял, а вот как писать,чтоб IAR не ругался.. Хидеры конечно же смотрел. TIM2_CCMR1_OC1M&=0x3;-такое не проходит.
А вот это надо запомнить-
CLK->PCKENR1 = CLK_PCKENR1_TIM1 * 0
| CLK_PCKENR1_TIM2 * 1 ....
-биты умножать на ноль и один.

Re: Таймер STM8

Ср дек 27, 2017 05:19:10

dm211 писал(а):TIM2_CCMR1_OC1M&=0x3;-такое не проходит.
В смысле?

Re: Таймер STM8

Ср дек 27, 2017 05:58:36

dm211 писал(а):TIM2_CCMR1_OC1M&=0x3;-такое не проходит.
В смысле?

Только по синтаксису, а за разьяснение-спасибо.

Re: Таймер STM8

Ср дек 27, 2017 06:01:20

у меня работает. Только что проверил.

Добавлено after 1 minute 15 seconds:
Ну погасите бит классически аврским способом. REG&=~(1<<n);

Re: Таймер STM8

Ср дек 27, 2017 06:20:38

Ну тут в названии бита разница, вот такое правильно будет?
TIM2->CCMR1= TIM2_CCMR_OCM & 0x3;

Re: Таймер STM8

Ср дек 27, 2017 06:55:55

У меня в хидере таких определений нет. Вы можете сами это сделать или может у Вас уже есть такие определения.
Однако такой конструкцией Вы погасите остальные биты в регистре.

Видимо TIM2_CCMR_OCM это константа 0x70;
Чтобы выключить бит OCM2, сделайте так.

TIM2->CCMR1&= ~(TIM2_CCMR_OCM & 0x40);

Возможно у Вас определена константа TIM2_CCMR_OCM2 как 0x40. Тогда
TIM2->CCMR1&= ~(TIM2_CCMR_OCM2);

Re: Таймер STM8

Ср дек 27, 2017 07:21:50

Так определен в stm8s.h-
#define TIM2_CCMR_OCM ((uint8_t)0x70) /*!< Output Compare x Mode mask. */

Re: Таймер STM8

Ср дек 27, 2017 08:21:47

Ну вот, сделайте как я сказал и будет Вас счастье. :)

Структуры с битовыми полями определены в файле iostm8s103f3.h . Подключите этот файл, заработает пример с битовыми полями.

Добавлено after 55 minutes 50 seconds:
Z_h_e писал(а):Однако такой конструкцией Вы погасите остальные биты в регистре.
Хотя у Вас они наверное и так выключены (я про остальные биты регистра). Тогда достаточно будет оператора присваивания =, без логических операций.

Re: Таймер STM8

Ср дек 27, 2017 13:42:11

А вот это надо запомнить-
CLK->PCKENR1 = CLK_PCKENR1_TIM1 * 0
| CLK_PCKENR1_TIM2 * 1 ....
-биты умножать на ноль и один.

Так можно просто взять все описания битов из хедера и регулировать в процессе отладки программы.
Поэтому у меня нет функций в настройках периферии, только несколько присваиваний. :))
Ответить