STM32. CMSIS. Урок#03: Таймеры общего назначения. Update interrupt, PWM mode.

  Переглядів 4,623

Олег Волков

Олег Волков

День тому

#stm32 #CMSIS #timers
Привет друзья! Вот уже 2 года, как я изучаю STM32.
Самое время, после опыта работы с библиотекой HAL, когда мы уже более менее ознакомились с периферией микроконтроллера, начать осваивать его на низкоуровневой библиотеке CMSIS.
На четвертом занятии мы поработаем с таймерами общего назначения, создадим прерывание по переполнению счетчика и выведем ШИМ сигнал на ножку микроконтроллера.
00:00 Введение
00:35 Про таймеры общего назначения
05:28 Работа с регистрами. Настройка таймера
17:30 Прерывание Update interrupt
17:57 Настройка ШИМ
26:45 Тесты ШИМ(один канал).
28:12 2 канальный ШИМ. Тесты с выбором полярности сигнала.
STM32. Замер частоты внешнего сигнала. Двухканальный частотомер. Супер точность :) Урок 13: • STM32. Замер частоты в...
Материалы из видео: github.com/Solderingironspb/S...
Мои заметки по CMSIS:
github.com/Solderingironspb/S...
Группа вконтакте: solderingiron.stm32
Настройки для VisualGDB: solderingiron.stm32?w=...
Яндекс.Дзен: zen.yandex.ru/id/622208eed2eb...

КОМЕНТАРІ: 26
@ajdarseidzade688
@ajdarseidzade688 Рік тому
Комментарий в поддержку этого отличного канала.
@Gleb_Godlevski
@Gleb_Godlevski Рік тому
Если регистр не буферизирован, он моментально обновляется (для TIMxCR1 обновляются значения PSC, ARR). Если буферизирован , то обновление новых значений только после события Update Event (после переполнения счетчика). Если нужно на ходу обновить ARR, PSC при установленном бите ARPE(Auto-reload preload): 1) Меняем в программе значения ARR, PSC 2) Вызываем IRQ: TIMx->EGR |= TIM_EGR_UG 3) Сбрасываем флаг UIF: TIMx->SR &= ~TIM_SR_UIF
@avr_stm_pro2955
@avr_stm_pro2955 Рік тому
Спасибо 👍 всё-таки перешли на GDB
@dobroliub1908
@dobroliub1908 Рік тому
Спасибо, как раз с шимом хотел поиграть.
@masterkit9517
@masterkit9517 Рік тому
Супер!
@svbHiTek
@svbHiTek 3 місяці тому
И переписал код инициализации и работы таймера в своем проекте, все сделал на регистрах, прикольно, и у камушка stm32030f4 всего то 16кБ флеша, HAL жрет так память, будто ее там 2Гб, вообще странно, что она не старается экономить память там где ее мало, было бы супер.
@OpenFrimeTVcom
@OpenFrimeTVcom Рік тому
о спасибо)
@igornikitine6020
@igornikitine6020 Рік тому
👍👍👍👍👍
@svbHiTek
@svbHiTek 3 місяці тому
Ух...., запустил ШИМ на отладочной плате stm32f030f4, есть там светодиод пользовательский на РА4 ножке, подключен он а каналу 1 таймера 14
@smart_electrics_il
@smart_electrics_il 7 місяців тому
мне одно интересно, не проще в самом начале сбросить одной строчкой, например CR1 = 0 ? Хотя вроде после сброса МК, там и так всё по 0.
@serggorod1423
@serggorod1423 Рік тому
Я первый лайк!
@serggorod1423
@serggorod1423 Рік тому
28:20 важный момент.
@artv71suturin61
@artv71suturin61 Місяць тому
Спасибо, а как сдвинуть по фазе один из сигналов, например на 90*
@hybridinnovate
@hybridinnovate 14 днів тому
Надо шим сделать в рамках счета 0-1000, к примеру 200-500. Аппаратно не сделать? Только в прерываниях ногой дрыгать?
@Solderingironspb
@Solderingironspb 14 днів тому
Так в данном видео никто ногой не дрыгает. Все аппаратно
@hybridinnovate
@hybridinnovate 14 днів тому
@@Solderingironspb в видео, да. Но как сделать, при счёте таймера вверх или вниз. Возможно отключать канал только до конца счета таймера, тоесть я хочу немножко вмешиваться в длительность ШИМ посреди счета таймера
@ciklomat
@ciklomat Рік тому
А точно нужно включать тактирование ножки при использовании ШИМ?
@micromaster4405
@micromaster4405 Рік тому
В стм для любой периферии включается тактирование, а в случае если периферия имеет выход наружу то и соответствующих портов gpio
@Solderingironspb
@Solderingironspb Рік тому
Все верно)
@Wip85
@Wip85 3 місяці тому
А как скважность менять?
@Solderingironspb
@Solderingironspb 3 місяці тому
TIMx->CCRx = значение.
@dekus80
@dekus80 Рік тому
Все время вижу глупую ошибку на просторах. На 8:39 пример. Правильный вариант TIM1->CR1 &= ~(TIM_CR1_xxx | TIM_CR1_xxx | ..). Неправильный вариант в видео TIM1->CR1 &= ~(TIM_CR1_ххх); TIM1->CR1 &= ~(TIM_CR1_xxx); ... То есть вместо того чтобы сделать запись все за один раз, ты дергаешь регистр на изменение каждого бита. А одна эта строчка у кортекса это 3 операции: считать, изменить, записать и ты их бессмысленно дублируешь по каждому биту. А регистры как бы volatile то есть не следует оптимизировать. И ещё, когда тебе нужно сконфигурировать какие то регистры, как в случае инита таймера, когда тебе без разницы что там в них до этого было не нужно по маске сначала что то сбрасывать и потом через или ставить, то есть в 6 операций (чтение/изменение/запись 2 раза), когда можно просто в одну операцию записать нужное значение, естественно понимая что каждый бит значит (но обычно значение reset регистра 0 и все просто). TIM1->CR1 = (TIM1_CR1_xxx |...); Сорян, весь Видос не смотрел, на это место просто ткнул и все что увидел. Может ещё б чего сказал. Вот простейший инит, не самый лучший, с просто константами делителей, но просто для понимания, на прерывание через определенное время, никаких & и | с регистрами таймера, они тут просто не нужны, т.к что было до не имеет значение и нам не нужно сохранять. Понятно что нужно все делать с умом, а не просто не напрягая серое вещество все везде лепить по одному шаблону. RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; TIM2->PSC = xxx - 1; TIM2->ARR = xxx - 1; // Load PSCR (это если нужно чтоб уже первый раз сработал именно после установленного промежутка, то есть с выставленными делителямя, нужно тут загрузить самостоятельно в теневой) TIM2->CR1 = TIM_CR1_URS; TIM2->EGR = TIM_EGR_UG; TIM2->DIER = TIM_DIER_UIE; // UIE: Update interrupt enable TIM2->CR1 = (TIM_CR1_ARPE | TIM_CR1_CEN); // CEN: Counter enable, ARPE: Auto-reload preload enable NVIC_EnableIRQ(TIM2_IRQn);
@Solderingironspb
@Solderingironspb Рік тому
Я это все понимаю, НО. Какая разница, сколько операций кортекс сделает. Это же инициализация. Делается раз и все) Разницы мы не ощутим. К тому же, когда делаешь по биту - можно быстро менять настройки(удобней для восприятия, заменив SET на CLEAR, нежели удалить бит из одной пачки и прописать в другую). Ну и конечно же не забываем про то, что иногда нельзя сразу все биты назначить, т.к. нужно соблюдать порядок.
@dekus80
@dekus80 Рік тому
@@Solderingironspb Я это тоже понимаю. Но это же обучение для других. Лучше уж видеть и изучать как правильнее. А уж потом свой подчерк формировать. Мы ж учимся писать буквы и слова с примера как должно быть, а не по кривому подчерку конкретного человека как видит и смог для себя он и что сильно отличается от как должно быть. Я думаю мысль понятна )
@smart_electrics_il
@smart_electrics_il 7 місяців тому
А если у одного регистра нужно один бит сбросить, а другой установить, одной строчкой оботись то можно ?
@dekus80
@dekus80 7 місяців тому
@@smart_electrics_il можно. Используя макрос. Но это будет только написание в виде строчки. МК в любом случае будет делать и отдельно, или отдельно.
STM32. CMSIS. Урок#04: Настройка: ADC + DMA. Прерывания.
36:16
Олег Волков
Переглядів 4,1 тис.
0% Respect Moments 😥
00:27
LE FOOT EN VIDÉO
Переглядів 30 млн
Что будет с кроссовком?
00:35
Аришнев
Переглядів 2 млн
ЧТО ДЕЛАТЬ, ЕСЛИ НЕ ХВАТАЕТ ДЕНЕГ НА ВОССТАНОВЛЕНИЕ ТАЧКИ?
47:52
MQA - ловушка для аудиофила. FX-AUDIO- DR07
26:41
💪Установи свой Home Assistant за 5 минут! 🏠 Умный Дом это просто!
6:04
STM32 #7. PWM - для изменения яркости LEDs
27:40
NR.electronics
Переглядів 5 тис.
Уроки Ардуино. ПИД регулятор
28:57
Заметки Ардуинщика
Переглядів 446 тис.
Redis за 20 минут
23:22
suchkov tech
Переглядів 67 тис.
STM32. Таймеры общего назначения. Часть 1.
25:39
ФРТК МФТИ
Переглядів 8 тис.
iPhone - телефон для нищебродов?!
0:53
ÉЖИ АКСЁНОВ
Переглядів 3,5 млн
Распаковка айфона под водой!💦(🎥: @saken_kagarov on IG)
0:20
Взрывная История
Переглядів 10 млн
RTX 4070 Super слишком хороша. Меня это бесит
15:22
Рома, Просто Рома
Переглядів 87 тис.