Программирование МК STM32. УРОК 2. Бегущие огни

Поделиться
HTML-код
  • Опубликовано: 11 июл 2024
  • Программирование на СИ в среде Keil μVision.
    Пишем код под микроконтроллер STM32F407VG на плате STM32F4DISCOVERY.
    Создаем следующий проект в Keil из старого проекта, применив определенные хитрости. Оформляем код грамотно в модули, пишем код задержки, мигаем всеми четырьмя светодиодами, а также подключаем к схеме внешний светодиод.
    Купить отладочную плату STM32F4-DISCOVERY можно здесь ali.pub/178fif
    Навигация по видео:
    00:00 Введение
    00:51 Создание проекта на основе существующего
    04:38 Зажжем все светодиоды
    07:18 Заголовочный файл
    10:45 Функция инициализации порта
    12:15 Задержка
    20:11 Макросы
    23:27 Бесконечный цикл
    26:03 Испытаем внешнюю ножку порта
    Ссылка на видео по распаковке посылки с платой и с первым знакомством с ней • STM32F407 DISCOVERY из...
    Рекомендуется также перед просмотром данного урока просмотреть данное видео:
    Урок 1. Установка Keil μVision • Программирование МК ST...
    Текстовая версия урока и исходный код здесь narodstream.ru/stm-urok-2-begu...
    Группа в контакте club116656325
    Группа в Одноклассниках ok.ru/group/52987126153436
    Группа в Facebook / 236905359999556
    Мой сайт "Программирование МК" narodstream.ru
    Форум narodstream.ru/forum
    Вы можете помочь проекту:
    ЮMoney
    yoomoney.ru/to/41001176473465
    Webmoney
    Z341906933112
    Карта Сбербанка (МИР)
    2202201799288929
    Можно в USDT
    1) Сеть:TRC20
    Адрес: TBBPFk5Widf1CYvF7Xk5ssKXeiPJHwtMgS
    2) Сеть: BSC BNB Smart Chain (BEP20) (комиссия намного меньше)
    Адрес: 0x2e38754DF1e54649Bf0D5CD6fD6D8c96a9f22f17
    3) Сеть: Huobi ECO Chain (HECO) (комиссия еще меньше)
    Адрес: 0x2e38754DF1e54649Bf0D5CD6fD6D8c96a9f22f17

Комментарии • 78

  • @user-xc9fk3oo2v
    @user-xc9fk3oo2v 7 лет назад +2

    Спасибо Вам огромное за Ваши уроки.

    • @narodstream552
      @narodstream552  7 лет назад

      И Вам спасибо за внимание к каналу!

  • @barkas2589
    @barkas2589 4 года назад

    Все получилось, спасибо!

  • @user-ed2wz9nw2n
    @user-ed2wz9nw2n 3 года назад

    Огромное спасибо!

  • @AVKrobotics
    @AVKrobotics 6 лет назад

    Все работает отлично. Я не уничтожал код а его копировал и добавлял. В результате еще веселее смотрится программа и возможность разных вариантов включения порта. В последнем коде светодиоды загораются по часовой стрелке и против. Немного неточность в конце урока.

  • @TheLongolier
    @TheLongolier 7 лет назад

    Аааа!
    Все. Теперь понял. )))

  • @alexhub5916
    @alexhub5916 7 лет назад +1

    Спасибо за уроки, сейчас вспоминаю STM32. Когда-то давно баловался с SPL, сейчас придется привыкать к HAL. Поэтому Ваше видео как нельзя к стати.
    Странно, что у Вас не работают подсказки в Keil, у меня 5.2 и все отлично. Выбор появляется после 3-го введенного символа.

  • @merv8543
    @merv8543 5 лет назад +1

    Отличные уроки, хотелось бы урокои по работе без использования библиотек SPL, HAL.

    • @narodstream552
      @narodstream552  5 лет назад +2

      1 марта выйдет первое видео по LL.

  • @Wasteomindy
    @Wasteomindy 7 лет назад +11

    Смотреть лучше на скорости x1.5.
    Жаль что нет 1.75, на x2 не смотрабельно

  • @DrargonsM
    @DrargonsM 8 лет назад

    лайк))))

  • @jdm_jzs141
    @jdm_jzs141 Год назад +1

    в 5 кейле есть проблема дилей такой не работает, компилятор оптимизирует и пропускает ничего не делающий код

  • @alekseybazilevich1368
    @alekseybazilevich1368 4 года назад +1

    Если мне нужно инициализировать только PIN9 порта Е например в output и не инициализировать остальные пины этого порта, то выглядит это так: GPIOE->MODER |= 1

  • @dimmid4109
    @dimmid4109 8 лет назад +3

    Занятия конечно нужны, серия планируется большая? Давайте больше объяснений, не ЗАЧЕМ вы так написали код , а ПОЧЕМУ именно так...

    • @narodstream552
      @narodstream552  8 лет назад +4

      Даже не знаю сколь велика будет серия. Это как загуляется. Зависит от моей фантазии, от наличия времени и различных компонентов. Все что в моих силах, сделаю.

  • @user-gh4tc2wo5k
    @user-gh4tc2wo5k 5 лет назад +1

    Хотел уточнить, когда мы пишем строку "GPIOD -> ODR = (1

    • @dazzershell
      @dazzershell 4 года назад +1

      У стм можно по-всякому, там 2 разных регистра, типа как набор кнопок с фиксацией и без.

  • @TheLongolier
    @TheLongolier 7 лет назад +2

    С дефайнами не очень понял.
    Изначально в соответствующий регистр прописывали нужное двоичное число (представленное правда в шестнадцатиричной форме)
    типа
    GPIOD->ODR = 0xC000;
    теперь мы с помощью дефайнов, как я понимаю, заменяем идентифиры типа PORTD0, PORTD1...итд на токены 1,2,3...и т д. затем в основной программе вместо шестнадцатиричного числа подставляем идентифир (например PORT12) и совершаем битовый сдвиг влево.
    Как при этом в регистре оказывается нужное двоичное число непонятно.
    Может подскажете куда глянуть?

    • @narodstream552
      @narodstream552  7 лет назад

      Ошибка какая? Не понял я на Вашем сленге.

    • @CanchezAK
      @CanchezAK 5 лет назад +2

      #define PORTD2 2
      GPIOD->ODR = (1

  • @user-do3fu3hh9g
    @user-do3fu3hh9g 7 лет назад

    Добрый день. А у Вас есть уроки по плате stm32f103? Заранее благодарю

    • @narodstream552
      @narodstream552  7 лет назад

      Здравствуйте!
      Ну, отдельно именно на эту плату нет. Но с использованием есть. практически все последние уроки по LAN-модулю ENC28J60 выходят с использованием именно такой платы. Просто дело в том, что чем сложнее уроки, тем более не важным становится, какой именно контроллер и какую плату мы используем в уроке.

  • @user-nn3io7fy4x
    @user-nn3io7fy4x 5 лет назад

    у меня вопрос есть две библиотеки. ну я вашим урокам увидел HAL и SPL /какая лучше.?

    • @DeckardTheBladeRunner
      @DeckardTheBladeRunner 5 лет назад +1

      Насколько я знаю, все на HAL переходят

  • @Vivavatnik
    @Vivavatnik 7 лет назад +1

    Спасибо! играю с stm32F429i discovery, полдня пытался понять почему лампочки не моргают, в итоге программа обновляется только после нажатия ресета... ))) А в Си нет встроенного delay? кажется когда-то в студенчестве она была...

    • @slavik5375
      @slavik5375 7 лет назад +2

      нету, вместо delay в Си используют for(i = 0; i < ...; i++) {}

    • @enderman4
      @enderman4 6 лет назад +3

      нету, вместо for(i = 0; i < ...: i++) {} используют таймеры

  • @user-nn3io7fy4x
    @user-nn3io7fy4x 5 лет назад +1

    Второй вопрос Stm32 есть ли внутрениий EEProm и как реализовать сохранение данных? Есть ли библиотека?как в atmel studio

    • @yukhnevich
      @yukhnevich 5 лет назад +1

      В любом stm32 есть RTC который может запитываться от батарейки, причем запитывается не только сам RTC, но и некоторая часть SRAM и некоторые регистры (количество зависит от вашей модели микроконтроллера), так вот эти ячейки памяти вы можете использовать для хранения каких-то переменных или настроек.

    • @dazzershell
      @dazzershell 4 года назад

      В контроллерах L-серии (малопотребляющей) кажется есть встроенный еепром.

  • @AleksandrArtroom
    @AleksandrArtroom 7 лет назад +4

    А почему не используете CubeMX для генерации проекта и настройки МК?

    • @narodstream552
      @narodstream552  7 лет назад

      А Вы все уроки канала по STM посмотрели?

    • @AleksandrArtroom
      @AleksandrArtroom 7 лет назад

      Уже просмотрел ваши уроки по Кубу.
      И немного разочаровало меня происшествие с FreeRTOS.
      Выходит МК и операционка не поддерживают аппаратную многозадачность, а сделано банально на ручном переключение между задачами.
      Вам приходило в голову сделать хотя бы по таймеру переключение между задачами?

    • @narodstream552
      @narodstream552  7 лет назад +13

      Ну это же не процессор с модулем виртуальной памяти и с несколькими раздельными ядрами. Уже и так хорошо. Раньше мы и об этом лет 20 назад мечтать не могли, когда работали с контроллерами.
      А в голову мою много чего приходит. И стараюсь её сразу освобождать, делясь всеми этими мыслями с вами.

  • @user-et8or4cc3b
    @user-et8or4cc3b 5 лет назад

    здравствуйте скажите почему число 2000000 помещается в тип int в функции delay

    • @narodstream552
      @narodstream552  5 лет назад

      Здравтсвуйте!
      Смотрите уроки по программированию на СИ. Как раз мы недавно выводили в консоль различные типы данных.
      Диапазон int: от -2147483648 до 2147483647.

  • @dev_zloi
    @dev_zloi 8 лет назад +5

    А зачем вы пишите функции в заголовочном файле? Не лучше тогда уж сделать отдельный .с файл или тогда все в main писать.

    • @narodstream552
      @narodstream552  8 лет назад +4

      +Дмитрий Попов
      Это на первых занятиях только. Затем будет конечно в отдельных файлах. В хедерах только дефайны, инклуды и прототипы. Сейчас суть не в этом. Ну и как раз мы увидим, что если функцию написать в заголовочном файле, то она также будет работать. Где-то с 4го занятия я конечно все вынесу уже в одноименные си-файлы. Ну и загромождать main.c я тоже не сторонник. Только вызов функций инициализации и бесконечный цикл.

    • @dev_zloi
      @dev_zloi 8 лет назад +1

      +narod stream Спасибо за полный ответ. Я тоже сейчас программирую на F4 очень интересно смотреть ваши видео может узнаю чего раньше не знал))

  • @TheLongolier
    @TheLongolier 7 лет назад +1

    Ошибки нет никакой. Просто я не понял как ваш код работает.
    как я понял
    #define PORTD12 12
    #define PORTD13 13
    Это замена идентификаторов PORTD12 и PORTD13 на числа 12 и 13 соответственно.
    затем
    GPIOD->ODR = (1

    • @narodstream552
      @narodstream552  7 лет назад

      Многие понимают наоборот
      Сдвигаемое чило всегда справа, то есть стоит первым, потом направление, а потом значение сдвига

    • @narodstream552
      @narodstream552  7 лет назад +4

      Я же вае рассказывал
      Поэтоме сдвигаем мы всегда единицу
      В данном случае на 12 и на 13 пунктов

  • @SIM31r
    @SIM31r 6 лет назад +1

    А в двоичной системе компилятор не понимает? Тут было бы удобнее написать типа 0b1100, а не в шестнадцатеричной форме.

  • @user-kg9qk8rt1e
    @user-kg9qk8rt1e 4 года назад

    у вас при запуске сборки почему-то пересобираются файлы Сишные, которые не менялись!!! КАЖДЫЙ РАЗ!!!
    это "фича" такая у кейла что ли? или что-то в компиляторе неправильно настроено??

    • @electrod9041
      @electrod9041 4 года назад

      автор прототипы функций не в хидеры кинул а в сишные файлы.

  • @smidani8132
    @smidani8132 3 года назад +2

    повторил код до места где просто лампочки по кругу идут(в итоге горят зелёный, красный и оранжевый светодиод, а должны меняться по кругу). Вообще не понятно где ошибка

    • @user-ox7qz8wv3r
      @user-ox7qz8wv3r 3 года назад +1

      У меня было то же самое пока не выставил в настройках опций оптимизацию на ноль.

    • @ilba8700
      @ilba8700 3 года назад +1

      @@user-ox7qz8wv3r а где это выставить?

    • @vados1y652
      @vados1y652 3 года назад +2

      @@ilba8700 пкм по "target 1" ==> Options ==> вкладка "C/C++ (AC6)" ==> Слева ищи "Optimization" и выбирай -О 0

    • @smidani8132
      @smidani8132 3 года назад

      @@user-ox7qz8wv3r на что влияет оптимизация?

    • @user-ox7qz8wv3r
      @user-ox7qz8wv3r 3 года назад

      @@smidani8132 Оптимизация решает несколько задач, одна из них это ускорение выполнения кода за счет того что компилятор включает свои "мозги" и корректирует код на свое усмотрение.

  • @user-sd4pv6bc8v
    @user-sd4pv6bc8v 3 года назад

    Применив этот первый код. Диоды горят все вместе не в полную силу(синий горит слабее всех), только после нажатия черной кнопки. До этого работал на micropython подключал датчик. Флеш-память очистил. Подскажите кто-нибудь, что может быть не так? Еще при отдельном зажигании диодов. Не горит красный диод. Вместо него загораентся зеленый.

    • @user-yi7pc3sf1w
      @user-yi7pc3sf1w 3 года назад +1

      Была аналогичная ситуация, я перезалил файлы .h с папки inc и тогда заработало нормально!

    • @user-sd4pv6bc8v
      @user-sd4pv6bc8v 3 года назад

      @@user-yi7pc3sf1w благодарю за отклик. Я через настройки
      исправил тогда.

    • @user-yi7pc3sf1w
      @user-yi7pc3sf1w 3 года назад

      @@user-sd4pv6bc8v а у Вас как через настройки получилось исправить?

    • @user-tl6vg1ot9h
      @user-tl6vg1ot9h Год назад

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

    • @user-tl6vg1ot9h
      @user-tl6vg1ot9h Год назад

      @@user-yi7pc3sf1w а как перезалили? не могу понять все тоже самое

  • @batonprog6560
    @batonprog6560 6 лет назад +1

    Маленькая помарка: GPIOD->OTYPER не за резисторы отвечает

    • @LinArt
      @LinArt 6 лет назад

      А за что ?

    • @LinArt
      @LinArt 6 лет назад

      А может есть материалы по 16тиричным числам для 32 разрядных процессоров ? то я не пойму в видео для меня как колдовство эти цифры мои команды по включению пинов выглядят так GPIOC ->ODR|=(1

    • @dazzershell
      @dazzershell 4 года назад

      @@LinArt Битовые и логические операции гораздо нагляднее, компилятор все равно преобразует вашу запись из битовых операций в одно число.

  • @user-gh4tc2wo5k
    @user-gh4tc2wo5k 5 лет назад

    Не до конца понятна конструкция "->". Как я понял, это работа со структурой через указатель. Но, здесь не совсем понятно как...

    • @dazzershell
      @dazzershell 4 года назад +1

      К регистрам периферии (порт ввода-вывода) можно обращаться через адрес напрямую, тогда код будет непонятным, из звездочек скобочек и магических чисел. Это как писать адрес проживания через GPS координаты. А можно косвенно, с помощью структуры, тогда адрес будет вычислен от базового через несколько шагов, зато код будет ясный и понятный (город/улица/дом/кв). Структура для каждого типа периферии своя, у stm эти структуры описаны в общем *.h файле на каждый МК.

  • @vladimirrogovoj9949
    @vladimirrogovoj9949 4 года назад +3

    20 лет назад видел такого учителя - "давайте напишем так, а нет, вот так,Раз и переключил". И так постоянно, больше похоже на запутывание, чем на обучение.

  • @yukhnevich
    @yukhnevich 5 лет назад +7

    Зачем вы так хардкодите задержку тактами? Это очень плохо и нельзя так учить в уроках. Ваш код будет не правильно работать на разных частотах. Тем более что в микроконтроллере есть RTC часы реального времени, то есть уже готовый таймер.

    • @narodstream552
      @narodstream552  5 лет назад +5

      Это один из вариантов, он не самый лучший, но для начинающих так понятнее, в более поздних уроках, особенно там, где важно процессорное время, мы конечно так делать не будем. А RTC не имеет смысл подключать для бегущих огней. Это серьёзная периферия и она создавалась не совсем для этого. Достаточно таймеров вполне.

    • @vitalivit8701
      @vitalivit8701 5 лет назад +1

      И где DMA и прерывания? Вы сами начинали изучать микроконтроллеры с RTC ? Браво! Рассмешили! А автору огромное спасибо!

    • @user-px4tj9cp9u
      @user-px4tj9cp9u 4 года назад +4

      @@narodstream552 у меня почему-то горят все 4 лампочки, а не по 1 или по 2, видимо из-за этого или почему? Я полностью повторил код до середины((

    • @user-mj6dq8mm8s
      @user-mj6dq8mm8s 4 года назад

      @@user-px4tj9cp9u Добрый вечер! Получилось исправить?

    • @IliveInAlmaty
      @IliveInAlmaty 3 года назад

      @@user-px4tj9cp9u Тоже самое было, помог комент vadoooos сверху: пкм по "target 1" ==> Options ==> вкладка "C/C++ (AC6)" ==> Слева ищи "Optimization" и выбирай -О 0. Потом пересобрать проект и все заработает

  • @user-pc9br8yt6j
    @user-pc9br8yt6j 4 года назад

    прототипы лишнее...

  • @user-kg9qk8rt1e
    @user-kg9qk8rt1e 4 года назад

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

  • @user-gf4uv9ys4p
    @user-gf4uv9ys4p 4 года назад

    стм 32 гавнище! куча лишних движений там где они не нужны. В мусор!

    • @pomidorka7699
      @pomidorka7699 4 года назад

      А что по вашему не "гавнище" ?

    • @dazzershell
      @dazzershell 4 года назад

      Посмотрите курсы, где через регистры учат работать. Здесь реально много лишнего, особенно если начинать через HAL и CUBE.