Например TDA7294

Форум РадиоКот • Просмотр темы - Nucleo-64 STM32F411 PWM CMSIS
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Чт дек 18, 2025 17:17:46

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Nucleo-64 STM32F411 PWM CMSIS
СообщениеДобавлено: Вт ноя 22, 2022 20:07:19 
Родился

Зарегистрирован: Вт ноя 22, 2022 19:59:46
Сообщений: 5
Рейтинг сообщения: 0
Не могу включить ШИМ на указанном камне. Использую пин PA5, TIM2.
Дайте пожалуйста подсказку!
На этим пине висит светодиод, хочу плавно повключать его)))

Собственно код:

Код:
#include "stm32f4xx.h"
//GPIOA5 TIM2_CH1

int main(void) {
  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // Timer 2 enable
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // Port A enable
  GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEED5_1 | GPIO_OSPEEDR_OSPEED5_0; // High speed
  GPIOA->OTYPER &= GPIO_OTYPER_OT5; // PP output
  GPIOA->MODER |= GPIO_MODER_MODER5_1; //AF mode
  GPIOA->AFR[0] |= GPIO_AFRL_AFRL5_1; //AF1 - timer 2
 
  TIM2->PSC = 800;
  TIM2->ARR = 7000;
  TIM2->CCR1 = 1000;
  TIM2->CCER |= TIM_CCER_CC1E; // Enable timer to output
  TIM2->CCER &= TIM_CCER_CC1P; // Select active high polarity
  TIM2->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; //PWM mode 1
  TIM2->CR1 |= TIM_CR1_CEN; // Start timer

  while(1){ };
}



Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Nucleo-64 STM32F411 PWM CMSIS
СообщениеДобавлено: Вт ноя 22, 2022 22:27:31 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пн апр 02, 2012 15:56:23
Сообщений: 144
Рейтинг сообщения: 0
Код:
TIM2->CCER &= TIM_CCER_CC1P; // Select active high polarity
Вы это операцией И сбросили бит CC1E.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Nucleo-64 STM32F411 PWM CMSIS
СообщениеДобавлено: Ср ноя 23, 2022 06:08:45 
Родился

Зарегистрирован: Вт ноя 22, 2022 19:59:46
Сообщений: 5
Рейтинг сообщения: 0
Код:
TIM2->CCER &= TIM_CCER_CC1P; // Select active high polarity
Вы это операцией И сбросили бит CC1E.

Убрал эту строчку, результат такой же ;(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Nucleo-64 STM32F411 PWM CMSIS
СообщениеДобавлено: Ср ноя 23, 2022 08:26:21 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Код:
PA5<PinMode::AF_PushPull_LowSpeed<1>>::mode();
 
TIM2->PSC = 800;
TIM2->ARR = 7000;
TIM2->CCR1 = 1000;
TIM2->CCMR1 = _VAL2FLD(TIM_CCMR1_CC1S,0) | _VAL2FLD(TIM_CCMR1_OC1M,6) | TIM_CCMR1_OC1PE;
TIM2->CCER = TIM_CCER_CC1E;
TIM2->CR1 = TIM_CR1_CEN;


YuriSh, альтернативная функция пина неправильно задана. GPIO_MODER_MODER5_1 это же двойка.
Пользуйтесь макросами из CMSIS. Вот так меньше вероятность ошибиться _VAL2FLD(GPIO_AFRL_AFSEL5,1);

Оператором &= неправильно пользуетесь. Чтобы сбросить бит в регистре надо вот так делать
Код:
GPIOA->OTYPER &= ~GPIO_OTYPER_OT5;


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Nucleo-64 STM32F411 PWM CMSIS
СообщениеДобавлено: Ср ноя 23, 2022 09:58:36 
Родился

Зарегистрирован: Вт ноя 22, 2022 19:59:46
Сообщений: 5
Рейтинг сообщения: 0
VladislavS, я же правильно понимаю, чтобы настроить пин на режим альтернативной функции мне необходимо первый бит перевести в единицу? разве оно не так делается?
Код:
GPIOA->MODER |= GPIO_MODER_MODER5_1;

Изображение

требуется альтернативная функция 1
Изображение,

следовательно, нулевой бит в единицу:
Код:
GPIOA->AFR[0] |= GPIO_AFRL_AFRL5_0

Изображение

настроить пин на пуш-пул, сделал, как вы сказали:
Код:
GPIOA->OTYPER &= ~GPIO_OTYPER_OT5;

Изображение

Подскажите, пожалуйста, я правильно понял, как выставлять биты в регистрах?

Добавлено after 16 minutes 20 seconds:
В общем разобрался, всем огромное спасибо. Итоговый код:
Спойлер
Код:
#include "stm32f4xx.h"
//GPIOA5 TIM2_CH1

int main(void) {
  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // Timer 2 enable
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; // Port A enable
  GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEED5_1 | GPIO_OSPEEDR_OSPEED5_0; // High speed
  GPIOA->OTYPER &= ~GPIO_OTYPER_OT5; // PP output
  GPIOA->MODER |= GPIO_MODER_MODER5_1; //AF mode
  GPIOA->AFR[0] |= GPIO_AFRL_AFRL5_0; //AF1 - timer 2

 
  TIM2->PSC = 50;
  TIM2->ARR = 1000;
  TIM2->CCR1 = 200;
  TIM2->CCER |= TIM_CCER_CC1P; // Select active high polarity
  TIM2->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; //PWM mode 1
  TIM2->CCER |= TIM_CCER_CC1E; // Enable timer to output
  TIM2->CR1 |= TIM_CR1_CEN; // Start timer

  while(1){ };
}

Ошибка была в строчке
GPIOA->AFR[0] |= GPIO_AFRL_AFRL5_1; //AF1 - timer 2, необходимо было выставить 5_0


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Nucleo-64 STM32F411 PWM CMSIS
СообщениеДобавлено: Ср ноя 23, 2022 10:27:24 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
YuriSh, рекомендую поставить бит TIM_CCMR1_OC1PE. Вы же будете рулить скважностью на ходу. И вы злоупотребляете оператором |=. Посмотрите мой код инициализации таймера.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Nucleo-64 STM32F411 PWM CMSIS
СообщениеДобавлено: Ср ноя 23, 2022 10:35:01 
Родился

Зарегистрирован: Вт ноя 22, 2022 19:59:46
Сообщений: 5
Рейтинг сообщения: 0
VladislavS, принял, спасибо вам.
Начну глубже изучать битовые операции в С


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Nucleo-64 STM32F411 PWM CMSIS
СообщениеДобавлено: Ср ноя 23, 2022 11:32:39 
Собутыльник Кота
Аватар пользователя

Карма: -12
Рейтинг сообщений: -24
Зарегистрирован: Пт июл 12, 2019 22:52:01
Сообщений: 2516
Рейтинг сообщения: 0
YuriSh, лучше как-то так писать, чтобы понятней было:
Код:
GPIOA->AFR[0] = ((GPIOA->AFR[0] &~GPIO_AFRL_AFRL0)) | 1 << (5 * 4);

Где 5 - номер пина, 1 - значение AF. Сбросить все 4 бита до присваивания нового значения нужно обязательно, если нет уверенности, что эта строчка будет вызываться сразу после инициализации МК (а не где-нибудь, когда в других функциях уже что-то будет туда позаписано или, тем паче, если меняется на лету альтернативная функция).
Можно какой-нибудь макрос забахать, вроде:
Код:
#define AFRL(n, v)   (v << (n*4))
#define AFRH(n, v)  (v << ((n-8)*4))

и пользоваться как-то так:
Код:
GPIOA->AFR[0] = ((GPIOA->AFR[0] &~GPIO_AFRL_AFRL0)) | AFRL(5, 1);

У VladislavS все наворочено на шаблонах и констэкспрах С++, а нам, убогим сишникам, приходится макросами выкручиваться…

_________________
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Nucleo-64 STM32F411 PWM CMSIS
СообщениеДобавлено: Ср ноя 23, 2022 12:08:15 
Родился

Зарегистрирован: Вт ноя 22, 2022 19:59:46
Сообщений: 5
Рейтинг сообщения: 0
Eddy_Em, Интересный способ на макросах, спасибо!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Nucleo-64 STM32F411 PWM CMSIS
СообщениеДобавлено: Ср ноя 23, 2022 13:26:26 
Мучитель микросхем

Карма: 4
Рейтинг сообщений: 80
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Сообщений: 445
Откуда: 69.Ржев
Рейтинг сообщения: 0
Здесь все корректно ? у сдвига же приоритет выше чем у ИЛИ
GPIOA->AFR[0] = ((GPIOA->AFR[0] &~GPIO_AFRL_AFRL0)) | 1 << (5 * 4);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Nucleo-64 STM32F411 PWM CMSIS
СообщениеДобавлено: Ср ноя 23, 2022 13:46:24 
Собутыльник Кота
Аватар пользователя

Карма: -12
Рейтинг сообщений: -24
Зарегистрирован: Пт июл 12, 2019 22:52:01
Сообщений: 2516
Рейтинг сообщения: 0
a797945, все корректно. Приоритет же выше!

_________________
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y