Например TDA7294

Форум РадиоКот • Просмотр темы - (STM32) Не записываются значения напрямую в регистр
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср дек 17, 2025 03:59:05

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


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



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: (STM32) Не записываются значения напрямую в регистр
СообщениеДобавлено: Вт окт 08, 2024 12:13:56 
Прорезались зубы

Зарегистрирован: Чт апр 08, 2021 09:46:48
Сообщений: 225
Рейтинг сообщения: 0
Доброго дня, форумчане!
Кодю в keil(язык си), на stm32f401ccu6.
Проблема такая: реализовал я 2 ШИМ сигнала для сервоприводов(TIM и TIM2), хочу реализовать третью ШИМку на TIM3, но почему то сигнала нет. Все делаю через CUBEMX. Почитал в инете люди пишут что у них тоже так было якобы CUBEMX тупит. После этого я решил реализовать ШИМку записями значений напрямую в регистр и тут возникает у меня основная проблема: значения в регистры тупо не записываются(смотрите фото).

На таймере два у меня уже реализована ШИМка через CubeMX и все работает норм, для теста я решил реализовать ШИМку на TIM2 через записями напрямую в регистры. реализовал, захожу под отладку и при записи значения в регистр ничего не изменяется(то есть значения не записываются), что самое интересное именно во все регистры таймера (TIM2->CR1; TIM2->ARR; и тд) ничего не записывается а во все регистры GPIO все записывается как надо.

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


Вложения:
Screenshot_11.png [117.24 KiB]
Скачиваний: 48
Screenshot_10.png [46.18 KiB]
Скачиваний: 40
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: (STM32) Не записываются значения напрямую в регистр
СообщениеДобавлено: Вт окт 08, 2024 12:26:35 
Мучитель микросхем

Карма: 1
Рейтинг сообщений: 48
Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 475
Рейтинг сообщения: 0
Значит тактирование таймера не включено в регистре APB1ENR.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: (STM32) Не записываются значения напрямую в регистр
СообщениеДобавлено: Вт окт 08, 2024 13:06:11 
Прорезались зубы

Зарегистрирован: Чт апр 08, 2021 09:46:48
Сообщений: 225
Рейтинг сообщения: 0
Действительно. пропустил этот момент! Спасибо))

Добавлено after 12 minutes 13 seconds:
Реализация ШИМки на TIM2(для сервопривода, канал 3). Ножка PB10


RCC->APB1ENR |= (1<<0);
TIM2->CR1 = 0x00000001;
TIM2->ARR = 0x00000668;
TIM2->PSC = 0x00000400;
TIM2->EGR = 0x00000000;
TIM2->CCER = 0x00000100;
TIM2->CR2 = 0x00000000;
TIM2->CCMR2 =0x00000068;
TIM2->CCR3 = 0x00000000;
GPIOB->OSPEEDR = 0x000300C0;
GPIOB->OTYPER = 0x00000000;
GPIOB->PUPDR = 0x00000100;
GPIOB->AFR[1] = 0x00000100;
GPIOB->MODER = 0x00210280;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: (STM32) Не записываются значения напрямую в регистр
СообщениеДобавлено: Вт окт 08, 2024 18:20:35 
Нашел транзистор. Понюхал.

Карма: 4
Рейтинг сообщений: 20
Зарегистрирован: Чт сен 19, 2024 19:18:28
Сообщений: 159
Рейтинг сообщения: 0
На будущее - вместо "магических цифр" общепринято использовать текстовые дефайны: RCC_APB1ENR_TIM2EN, TIM_CCER_CC3E и тд.
TIM2->PSC = 1000 - 1; // предделитель = 1000. (потому что коэф.деления равен PSC+1)
TIM2->ARR = 500 - 1; // максимальный счет до 499 (то же самое, значение ARR на 1 меньше коэф.деления)
GPIOB->MODER |= (2 << (10 * 2)) или лучше GPIO_MODER_MODER10_1

Так вам самим понятнее будет, что там понаписано. Запомнить обозначения несложно, они состоят из трех частей, разделенных _ . Первая часть - имя модуля (вернее, структуры регистров), например GPIO или TIM (номер таймера или буква порта не указывается). Вторая часть - имя регистра - MODER, CCER. И в конце - имя бита или группы бит - TIM2EN, MODER10. В группе бит для обозначения отдельного бита после _ идет его номер в группе - MODER10_1.
Потому что на память мало кто помнит именно позиции битов, а тут еще и переводить вначале в двоичный вид из хекс-вида.

Так же следует изучить, что такое операция |= в языке Си. А также, операция &= и ~. Эти операции применяются, когда нужно изменить только часть битов в регистре. Например,
GPIOB->MODER |= GPIO_MODER_MODER10_1 | GPIO_MODER_MODER11_1; // установить только биты MODER10_1 и MODER11_1
RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN); // сбросить только биты TIM2EN и TIM3EN


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: (STM32) Не записываются значения напрямую в регистр
СообщениеДобавлено: Ср окт 09, 2024 04:56:37 
Мучитель микросхем
Аватар пользователя

Карма: 8
Рейтинг сообщений: 105
Зарегистрирован: Ср сен 02, 2015 07:47:20
Сообщений: 420
Рейтинг сообщения: 0
Так вам самим понятнее будет, что там понаписано. Запомнить обозначения несложно, они состоят из трех частей, разделенных _ . Первая часть - имя модуля (вернее, структуры регистров), например GPIO или TIM (номер таймера или буква порта не указывается). Вторая часть - имя регистра - MODER, CCER. И в конце - имя бита или группы бит - TIM2EN, MODER10. В группе бит для обозначения отдельного бита после _ идет его номер в группе - MODER10_1.
Потому что на память мало кто помнит именно позиции битов, а тут еще и переводить вначале в двоичный вид из хекс-вида.

Более того, составные части имён этих дефайнов совпадают с таковыми в букваре и всегда можно там поискать через Ctrl+F.

_________________
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 6 декабря 2025 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: (STM32) Не записываются значения напрямую в регистр
СообщениеДобавлено: Ср окт 09, 2024 16:53:17 
Говорящий с текстолитом

Карма: -7
Рейтинг сообщений: 187
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1649
Рейтинг сообщения: 0
RCC->APB1ENR |= (1<<0);
Операции чтения-модификации-записи регистров периферии, в которых один и тот же регистр может использоваться различными драйверами устройств (так как его биты относятся к разной периферии), лучше заключать внутрь критической секции. Или эту чтение-модификацию-запись выполнять посредством инструкций эксклюзивной записи Cortex-M (LDREX/STREX).
Подумайте - почему.

Кроме того - после такого включения тактирования неплохо было бы добавить инструкцию барьера или сделать обратное чтение RCC->APB1ENR: { int i = RCC->APB1ENR; }
Чтобы была уверенность, что к началу следующей команды записанное значение подействовало.
Так же следует поступать при программировании через регистры разных периферийных блоков, которые зависят друг от друга, но могут сидеть на разных сегментах внутренних шин МК.
Если это:
RCC->APB1ENR |= (1<<0);
TIM2->CR1 = 0x00000001;
заработало так как есть (и при макс. оптимизации), значит - просто повезло. Так как обычный буфер записи, который есть во многих ARM, поставит крест на таком коде.


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

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


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

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


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

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


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