Все работает отлично. Я не уничтожал код а его копировал и добавлял. В результате еще веселее смотрится программа и возможность разных вариантов включения порта. В последнем коде светодиоды загораются по часовой стрелке и против. Немного неточность в конце урока.
Даже не знаю сколь велика будет серия. Это как загуляется. Зависит от моей фантазии, от наличия времени и различных компонентов. Все что в моих силах, сделаю.
повторил код до места где просто лампочки по кругу идут(в итоге горят зелёный, красный и оранжевый светодиод, а должны меняться по кругу). Вообще не понятно где ошибка
@@smidani8132 Оптимизация решает несколько задач, одна из них это ускорение выполнения кода за счет того что компилятор включает свои "мозги" и корректирует код на свое усмотрение.
С дефайнами не очень понял. Изначально в соответствующий регистр прописывали нужное двоичное число (представленное правда в шестнадцатиричной форме) типа GPIOD->ODR = 0xC000; теперь мы с помощью дефайнов, как я понимаю, заменяем идентифиры типа PORTD0, PORTD1...итд на токены 1,2,3...и т д. затем в основной программе вместо шестнадцатиричного числа подставляем идентифир (например PORT12) и совершаем битовый сдвиг влево. Как при этом в регистре оказывается нужное двоичное число непонятно. Может подскажете куда глянуть?
+Дмитрий Попов Это на первых занятиях только. Затем будет конечно в отдельных файлах. В хедерах только дефайны, инклуды и прототипы. Сейчас суть не в этом. Ну и как раз мы увидим, что если функцию написать в заголовочном файле, то она также будет работать. Где-то с 4го занятия я конечно все вынесу уже в одноименные си-файлы. Ну и загромождать main.c я тоже не сторонник. Только вызов функций инициализации и бесконечный цикл.
В любом stm32 есть RTC который может запитываться от батарейки, причем запитывается не только сам RTC, но и некоторая часть SRAM и некоторые регистры (количество зависит от вашей модели микроконтроллера), так вот эти ячейки памяти вы можете использовать для хранения каких-то переменных или настроек.
Спасибо! играю с stm32F429i discovery, полдня пытался понять почему лампочки не моргают, в итоге программа обновляется только после нажатия ресета... ))) А в Си нет встроенного delay? кажется когда-то в студенчестве она была...
Если мне нужно инициализировать только PIN9 порта Е например в output и не инициализировать остальные пины этого порта, то выглядит это так: GPIOE->MODER |= 1
Ошибки нет никакой. Просто я не понял как ваш код работает. как я понял #define PORTD12 12 #define PORTD13 13 Это замена идентификаторов PORTD12 и PORTD13 на числа 12 и 13 соответственно. затем GPIOD->ODR = (1
Здравтсвуйте! Смотрите уроки по программированию на СИ. Как раз мы недавно выводили в консоль различные типы данных. Диапазон int: от -2147483648 до 2147483647.
у вас при запуске сборки почему-то пересобираются файлы Сишные, которые не менялись!!! КАЖДЫЙ РАЗ!!! это "фича" такая у кейла что ли? или что-то в компиляторе неправильно настроено??
Здравствуйте! Ну, отдельно именно на эту плату нет. Но с использованием есть. практически все последние уроки по LAN-модулю ENC28J60 выходят с использованием именно такой платы. Просто дело в том, что чем сложнее уроки, тем более не важным становится, какой именно контроллер и какую плату мы используем в уроке.
Зачем вы так хардкодите задержку тактами? Это очень плохо и нельзя так учить в уроках. Ваш код будет не правильно работать на разных частотах. Тем более что в микроконтроллере есть RTC часы реального времени, то есть уже готовый таймер.
Это один из вариантов, он не самый лучший, но для начинающих так понятнее, в более поздних уроках, особенно там, где важно процессорное время, мы конечно так делать не будем. А RTC не имеет смысл подключать для бегущих огней. Это серьёзная периферия и она создавалась не совсем для этого. Достаточно таймеров вполне.
@@НиколайКрасиков-ы8й Тоже самое было, помог комент vadoooos сверху: пкм по "target 1" ==> Options ==> вкладка "C/C++ (AC6)" ==> Слева ищи "Optimization" и выбирай -О 0. Потом пересобрать проект и все заработает
20 лет назад видел такого учителя - "давайте напишем так, а нет, вот так,Раз и переключил". И так постоянно, больше похоже на запутывание, чем на обучение.
Применив этот первый код. Диоды горят все вместе не в полную силу(синий горит слабее всех), только после нажатия черной кнопки. До этого работал на micropython подключал датчик. Флеш-память очистил. Подскажите кто-нибудь, что может быть не так? Еще при отдельном зажигании диодов. Не горит красный диод. Вместо него загораентся зеленый.
Тоже не могу понять светодиоды горят тускло синий всех слабее горит. Что сделать чтобы исправить? не могу понять. По урокам вроде все хорошо, но пол урока ползать по папкам копировать и прочее это сбивает.
А может есть материалы по 16тиричным числам для 32 разрядных процессоров ? то я не пойму в видео для меня как колдовство эти цифры мои команды по включению пинов выглядят так GPIOC ->ODR|=(1
К регистрам периферии (порт ввода-вывода) можно обращаться через адрес напрямую, тогда код будет непонятным, из звездочек скобочек и магических чисел. Это как писать адрес проживания через GPS координаты. А можно косвенно, с помощью структуры, тогда адрес будет вычислен от базового через несколько шагов, зато код будет ясный и понятный (город/улица/дом/кв). Структура для каждого типа периферии своя, у stm эти структуры описаны в общем *.h файле на каждый МК.
я конечно самый первый крикун что кейл гавно полное, но даже мне кажется что отсутствие интелли сенса вроде полнейший зашквар уже... всё таки мне кажется должна быть подсказка иначе совсем непонятно как работать то в нём ))
Спасибо за уроки, сейчас вспоминаю STM32. Когда-то давно баловался с SPL, сейчас придется привыкать к HAL. Поэтому Ваше видео как нельзя к стати. Странно, что у Вас не работают подсказки в Keil, у меня 5.2 и все отлично. Выбор появляется после 3-го введенного символа.
Уже просмотрел ваши уроки по Кубу. И немного разочаровало меня происшествие с FreeRTOS. Выходит МК и операционка не поддерживают аппаратную многозадачность, а сделано банально на ручном переключение между задачами. Вам приходило в голову сделать хотя бы по таймеру переключение между задачами?
Ну это же не процессор с модулем виртуальной памяти и с несколькими раздельными ядрами. Уже и так хорошо. Раньше мы и об этом лет 20 назад мечтать не могли, когда работали с контроллерами. А в голову мою много чего приходит. И стараюсь её сразу освобождать, делясь всеми этими мыслями с вами.
Все работает отлично. Я не уничтожал код а его копировал и добавлял. В результате еще веселее смотрится программа и возможность разных вариантов включения порта. В последнем коде светодиоды загораются по часовой стрелке и против. Немного неточность в конце урока.
Смотреть лучше на скорости x1.5.
Жаль что нет 1.75, на x2 не смотрабельно
Занятия конечно нужны, серия планируется большая? Давайте больше объяснений, не ЗАЧЕМ вы так написали код , а ПОЧЕМУ именно так...
Даже не знаю сколь велика будет серия. Это как загуляется. Зависит от моей фантазии, от наличия времени и различных компонентов. Все что в моих силах, сделаю.
Отличные уроки, хотелось бы урокои по работе без использования библиотек SPL, HAL.
1 марта выйдет первое видео по LL.
Огромное спасибо!
Все получилось, спасибо!
повторил код до места где просто лампочки по кругу идут(в итоге горят зелёный, красный и оранжевый светодиод, а должны меняться по кругу). Вообще не понятно где ошибка
У меня было то же самое пока не выставил в настройках опций оптимизацию на ноль.
@@СергейГончаров-э4г а где это выставить?
@@ilba8700 пкм по "target 1" ==> Options ==> вкладка "C/C++ (AC6)" ==> Слева ищи "Optimization" и выбирай -О 0
@@СергейГончаров-э4г на что влияет оптимизация?
@@smidani8132 Оптимизация решает несколько задач, одна из них это ускорение выполнения кода за счет того что компилятор включает свои "мозги" и корректирует код на свое усмотрение.
в 5 кейле есть проблема дилей такой не работает, компилятор оптимизирует и пропускает ничего не делающий код
Хотел уточнить, когда мы пишем строку "GPIOD -> ODR = (1
У стм можно по-всякому, там 2 разных регистра, типа как набор кнопок с фиксацией и без.
С дефайнами не очень понял.
Изначально в соответствующий регистр прописывали нужное двоичное число (представленное правда в шестнадцатиричной форме)
типа
GPIOD->ODR = 0xC000;
теперь мы с помощью дефайнов, как я понимаю, заменяем идентифиры типа PORTD0, PORTD1...итд на токены 1,2,3...и т д. затем в основной программе вместо шестнадцатиричного числа подставляем идентифир (например PORT12) и совершаем битовый сдвиг влево.
Как при этом в регистре оказывается нужное двоичное число непонятно.
Может подскажете куда глянуть?
Ошибка какая? Не понял я на Вашем сленге.
#define PORTD2 2
GPIOD->ODR = (1
А зачем вы пишите функции в заголовочном файле? Не лучше тогда уж сделать отдельный .с файл или тогда все в main писать.
+Дмитрий Попов
Это на первых занятиях только. Затем будет конечно в отдельных файлах. В хедерах только дефайны, инклуды и прототипы. Сейчас суть не в этом. Ну и как раз мы увидим, что если функцию написать в заголовочном файле, то она также будет работать. Где-то с 4го занятия я конечно все вынесу уже в одноименные си-файлы. Ну и загромождать main.c я тоже не сторонник. Только вызов функций инициализации и бесконечный цикл.
+narod stream Спасибо за полный ответ. Я тоже сейчас программирую на F4 очень интересно смотреть ваши видео может узнаю чего раньше не знал))
Второй вопрос Stm32 есть ли внутрениий EEProm и как реализовать сохранение данных? Есть ли библиотека?как в atmel studio
В любом stm32 есть RTC который может запитываться от батарейки, причем запитывается не только сам RTC, но и некоторая часть SRAM и некоторые регистры (количество зависит от вашей модели микроконтроллера), так вот эти ячейки памяти вы можете использовать для хранения каких-то переменных или настроек.
В контроллерах L-серии (малопотребляющей) кажется есть встроенный еепром.
Спасибо! играю с stm32F429i discovery, полдня пытался понять почему лампочки не моргают, в итоге программа обновляется только после нажатия ресета... ))) А в Си нет встроенного delay? кажется когда-то в студенчестве она была...
нету, вместо delay в Си используют for(i = 0; i < ...; i++) {}
нету, вместо for(i = 0; i < ...: i++) {} используют таймеры
Если мне нужно инициализировать только PIN9 порта Е например в output и не инициализировать остальные пины этого порта, то выглядит это так: GPIOE->MODER |= 1
Ошибки нет никакой. Просто я не понял как ваш код работает.
как я понял
#define PORTD12 12
#define PORTD13 13
Это замена идентификаторов PORTD12 и PORTD13 на числа 12 и 13 соответственно.
затем
GPIOD->ODR = (1
Многие понимают наоборот
Сдвигаемое чило всегда справа, то есть стоит первым, потом направление, а потом значение сдвига
Я же вае рассказывал
Поэтоме сдвигаем мы всегда единицу
В данном случае на 12 и на 13 пунктов
здравствуйте скажите почему число 2000000 помещается в тип int в функции delay
Здравтсвуйте!
Смотрите уроки по программированию на СИ. Как раз мы недавно выводили в консоль различные типы данных.
Диапазон int: от -2147483648 до 2147483647.
у вас при запуске сборки почему-то пересобираются файлы Сишные, которые не менялись!!! КАЖДЫЙ РАЗ!!!
это "фича" такая у кейла что ли? или что-то в компиляторе неправильно настроено??
автор прототипы функций не в хидеры кинул а в сишные файлы.
Добрый день. А у Вас есть уроки по плате stm32f103? Заранее благодарю
Здравствуйте!
Ну, отдельно именно на эту плату нет. Но с использованием есть. практически все последние уроки по LAN-модулю ENC28J60 выходят с использованием именно такой платы. Просто дело в том, что чем сложнее уроки, тем более не важным становится, какой именно контроллер и какую плату мы используем в уроке.
Зачем вы так хардкодите задержку тактами? Это очень плохо и нельзя так учить в уроках. Ваш код будет не правильно работать на разных частотах. Тем более что в микроконтроллере есть RTC часы реального времени, то есть уже готовый таймер.
Это один из вариантов, он не самый лучший, но для начинающих так понятнее, в более поздних уроках, особенно там, где важно процессорное время, мы конечно так делать не будем. А RTC не имеет смысл подключать для бегущих огней. Это серьёзная периферия и она создавалась не совсем для этого. Достаточно таймеров вполне.
И где DMA и прерывания? Вы сами начинали изучать микроконтроллеры с RTC ? Браво! Рассмешили! А автору огромное спасибо!
@@narodstream552 у меня почему-то горят все 4 лампочки, а не по 1 или по 2, видимо из-за этого или почему? Я полностью повторил код до середины((
@@НиколайКрасиков-ы8й Добрый вечер! Получилось исправить?
@@НиколайКрасиков-ы8й Тоже самое было, помог комент vadoooos сверху: пкм по "target 1" ==> Options ==> вкладка "C/C++ (AC6)" ==> Слева ищи "Optimization" и выбирай -О 0. Потом пересобрать проект и все заработает
20 лет назад видел такого учителя - "давайте напишем так, а нет, вот так,Раз и переключил". И так постоянно, больше похоже на запутывание, чем на обучение.
Применив этот первый код. Диоды горят все вместе не в полную силу(синий горит слабее всех), только после нажатия черной кнопки. До этого работал на micropython подключал датчик. Флеш-память очистил. Подскажите кто-нибудь, что может быть не так? Еще при отдельном зажигании диодов. Не горит красный диод. Вместо него загораентся зеленый.
Была аналогичная ситуация, я перезалил файлы .h с папки inc и тогда заработало нормально!
@@АнтонГореев благодарю за отклик. Я через настройки
исправил тогда.
@@Gerotero-r1o а у Вас как через настройки получилось исправить?
Тоже не могу понять светодиоды горят тускло синий всех слабее горит. Что сделать чтобы исправить? не могу понять.
По урокам вроде все хорошо, но пол урока ползать по папкам копировать и прочее это сбивает.
@@АнтонГореев а как перезалили? не могу понять все тоже самое
Маленькая помарка: GPIOD->OTYPER не за резисторы отвечает
А за что ?
А может есть материалы по 16тиричным числам для 32 разрядных процессоров ? то я не пойму в видео для меня как колдовство эти цифры мои команды по включению пинов выглядят так GPIOC ->ODR|=(1
@@LinArt Битовые и логические операции гораздо нагляднее, компилятор все равно преобразует вашу запись из битовых операций в одно число.
Не до конца понятна конструкция "->". Как я понял, это работа со структурой через указатель. Но, здесь не совсем понятно как...
К регистрам периферии (порт ввода-вывода) можно обращаться через адрес напрямую, тогда код будет непонятным, из звездочек скобочек и магических чисел. Это как писать адрес проживания через GPS координаты. А можно косвенно, с помощью структуры, тогда адрес будет вычислен от базового через несколько шагов, зато код будет ясный и понятный (город/улица/дом/кв). Структура для каждого типа периферии своя, у stm эти структуры описаны в общем *.h файле на каждый МК.
прототипы лишнее...
я конечно самый первый крикун что кейл гавно полное, но даже мне кажется что отсутствие интелли сенса вроде полнейший зашквар уже... всё таки мне кажется должна быть подсказка иначе совсем непонятно как работать то в нём ))
А в двоичной системе компилятор не понимает? Тут было бы удобнее написать типа 0b1100, а не в шестнадцатеричной форме.
Спасибо за уроки, сейчас вспоминаю STM32. Когда-то давно баловался с SPL, сейчас придется привыкать к HAL. Поэтому Ваше видео как нельзя к стати.
Странно, что у Вас не работают подсказки в Keil, у меня 5.2 и все отлично. Выбор появляется после 3-го введенного символа.
Спасибо Вам огромное за Ваши уроки.
И Вам спасибо за внимание к каналу!
у меня вопрос есть две библиотеки. ну я вашим урокам увидел HAL и SPL /какая лучше.?
Насколько я знаю, все на HAL переходят
лайк))))
Аааа!
Все. Теперь понял. )))
А почему не используете CubeMX для генерации проекта и настройки МК?
А Вы все уроки канала по STM посмотрели?
Уже просмотрел ваши уроки по Кубу.
И немного разочаровало меня происшествие с FreeRTOS.
Выходит МК и операционка не поддерживают аппаратную многозадачность, а сделано банально на ручном переключение между задачами.
Вам приходило в голову сделать хотя бы по таймеру переключение между задачами?
Ну это же не процессор с модулем виртуальной памяти и с несколькими раздельными ядрами. Уже и так хорошо. Раньше мы и об этом лет 20 назад мечтать не могли, когда работали с контроллерами.
А в голову мою много чего приходит. И стараюсь её сразу освобождать, делясь всеми этими мыслями с вами.
стм 32 гавнище! куча лишних движений там где они не нужны. В мусор!
А что по вашему не "гавнище" ?
Посмотрите курсы, где через регистры учат работать. Здесь реально много лишнего, особенно если начинать через HAL и CUBE.