Большое спасибо за ролики. Пытаюсь перейти с ардуино на стм. Подобных видео много в интернете, и только ваши заходят на ура. Есть несколько вопросов: 1. Как вы делаете автоформатирование текста кода в труСтудио? 2. Как правильно выставлять время ожидания отправки и какому времени равно 0xFFFF?
Мне приятно, что Вам нравится)) Ответ: 1. Ctrl+Shift+F. Работает и в CubeIDE. 2. На счет правильности выставления времени ожидания. Это очень сложно, т.к. это Вам каждое сообщение нужно будет прогонять через логический аналзатор и смотреть, сколько времени требуется под то или иное сообщение. 0xFFFF = 65535. Это я просто максимальное время выставил. Его не обязательно записывать в hex формате. Можете и в dec записывать). Я не уверен на 100%, но я думаю там устроено так, что он отправил за какое-то время данные и дальше ждать уже не будет. Поэтому можете ставить и 100 и больше. Главное, чтоб оно успевало отправлять. А вообще блокирующей функцией пользоваться не советую, т.к. она все тормозит.
@@Solderingironspb я знаю , но она идентична тому что вы в начале урока отправляли без прерывания. А по поводу прерывания чтобы проверить свободен или нет UART можно просто вместо где у вас IF ставить цикл while( HAL_UART_GetState (&huart1) == HAL_UART_STATE_BUSY_TX ) ; получается пока шина занята мы крутимся в цикле как шина освободится то покидаем его, единственное блокируем код , если не хотим блокировать то тогда как вы показывали в видео с флагами. А по поводу отладочной информации ее лучше выводить не в UART ( ардуиновская привычка ) а через SWO ( ресурсы МК практически не используются, единственное работает только на передачу )
UART используется ж не только для отладки) Полностью согласен с Вами на счет работы с swo в режиме дебага) в начале видео, если присмотритесь к программатору моему, он перепаян. Там и swo и rst выведены)
Около месяца назад увлекся микроконтроллерами и просматриваю в том числе и ваши уроки, мне нравиться как вы преподносите материал, и тоже учусь на TrueSTUDIO, но настораживает что у IDE нет уже поддержки, хочется узнать ваше мнение по этому моменту.
@@Solderingironspb я тоже сегодня пересел на CubeIDE, но вот простая программа по передаче по UART не получается собирается без ошибок но терминал не видит данные, хотя если запускаю в KEIl то все нормально, но Keil не не нравиться, хочется как то что бы CubeIDE получалось
@@Solderingironspb Проще чем по вашему уроку , активирую через CubeMX режим USART1 в асинхронном режиме, выставляю тактирование, перехожу через Project Manager в среду программирования, в main.c прописываю массив со строкой и функцию HAL_UART_Transmit(), передаю ей массив, в блок while(), когда перехожу в KEIL все сразу работает (то есть терминал получает сообщение в виде строки), когда после тех же операций перехожу в CubeIDE терминал не видит сообщений, хотя сборка прошла спешно , вот на этом я пока и застрял..
хм....в ардуино скорее всего блокирующая функция прописана, НО утверждать не буду, не разбирался в ее внутренностях) По поводу Stm32: первый способ - это блокирующая функция, пользоваться ей крайне не желательно, т.к. она будет тормозить весь код (аналогично использованию Delay). Второй способ - работает на прерываниях. Писать сложней, но зато ничего не блокируется. МК кинул данные на отправку и занимается другими делами. Потом только проверяет, можно ли еще одну передачу осуществить или рано еще. Третий способ считается самым продвинутым. Меньше нагружает ядро. Работает еще быстрее. Как-то так...
Ардуиновский? по UART кидаю данные на USB TTL конвертер. Он в компьютере определен, как Com port. Я его просто открываю в Arduino IDE(монитор порта). Можно вместо USB TTL конвертера использовать любую Arduino плату, ту же Arduino nano. Ресет на ардуино закорачиваем на землю и все(Система мк не запускается, плата просто работает, как USB TTL конвертер). Только в данном случае UART соединение между STM32 и платой ардуино будет не Tx->Rx, Rx->Tx, а Tx->Tx, Rx->Rx.
Ок, вопрос))) ПИшем символы и они передаются по UART перекодируясь потом по коду ASCII в двоичный код. А как мне отправить например число 5? Ну или число 10 например, чтобы UART отправил его не как два числа 1 и 0 , а именно 10?
Скажите пожалуйста, как можна приемать и передават данни по UART, каторые представляют целье натуралнье числа - стойности переменная, а не символами-числа типа char? Я пробвал разные варианть, но не успел. Функция UART сделана так, что можно передается только символами. В Ардуино ето очень просто, делается по умолчание, но сюда не так...
Я протокол свой делал. Для примера можете глянуть мое видео: «Практика #06». Мне так куда больше нравится работать, т.к. с проверкой CRC надежней получается.
а в чем проблема? Там немного отличается от F1, но не прям кардинально. Я попробовал на STM32F411CEU6 на CMSIS поработать. вроде получается. Вот тут есть некоторые функции: github.com/Solderingironspb/STM32F411CEU6_CMSIS_notes Тут главное тактирование поднять и понять, как с GPIO работать, т.к. отличие от F1 большие. А интерфейсы настраиваются почти аналогично.
Отправка по прерыванию - реально говнокод ) Прерывание работает не так. Флаги как раз в прерывании и надо обнулять - первый буфер улетел - флаг выставили. ВТорой отправляем - проверяем флаг. Первый отправился, прерывание сработало - флаг обнулили, можем отправлять следующее. А так обычная очередь, прерывание здесь ничего не делает абсолютно.
Попробовал как-то так сделать, вроде работает. Когда все сообщения отправлены то просто ничего не происходит, но каждую секунду обнуляется счетчик и передача происходит заново. Единственный нюанс - странная проблема с дебагом. Когда перехожу к выводу второй строки tx_buffer1 то в консоли выводится дубликат первой строки tx_buffer. Видимо где-то ошибка... обработчик прерываний: HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { queue++; } цикл While: if (queue == 1){ HAL_UART_Transmit_IT(&huart1, tx_buffer, sizeof tx_buffer / sizeof tx_buffer[0]); } if (queue == 2){ HAL_UART_Transmit_IT(&huart1, tx_buffer1, sizeof tx_buffer1 / sizeof tx_buffer1[0]); } if ((HAL_GetTick() - T >= 1000) && queue > 2) { T = HAL_GetTick(); queue = 1; }
Не понятно почему у СТМ нету возможности настраивать юарт на 7 бит. В тех же АВР есть такая функция. И в своей практике встречал устройства которые обмениваются именно так.
В некоторых Stm32 есть 7мибитный USART. Вот, как пример. (стр. 700) www.st.com/resource/en/reference_manual/DM00031936-.pdf Programmable data word length (7, 8 or 9 bits) STM32F04x STM32F07x STM32F09x поддерживают 7мибитный USART.
Здравствуйте, Олег. Делаю все как у вас, перечитал кучу страниц в интернете. Не получается у меня выводить текст. Ни русский, ни английский. В порт сыплет кракозябры. Где то может не совпадают кодировки или еще что? 3 дня бьюсь, все без толку. Можете мне помочь? Моя почта asdfgj@mail.ru
А у меня вопреки всему на ардуинском мониторе и на сторонних терминалах из UART идут кракозябры независимо от установки шрифта и кодировки!!! Где ключ от фокуса? SOS! SOS! SOS!
Спасибо большое.
Не забывайте в плейлист добавлять все уроки, многие люди по плейлистам ориентируются.
Спасибо) учту)
Не столько порадовало слово кюекюе, сколько буси :D
Очень понятный урок! Спасибо!
Спасибо за уроки🎉
Большое спасибо за ролики. Пытаюсь перейти с ардуино на стм. Подобных видео много в интернете, и только ваши заходят на ура. Есть несколько вопросов:
1. Как вы делаете автоформатирование текста кода в труСтудио?
2. Как правильно выставлять время ожидания отправки и какому времени равно 0xFFFF?
Мне приятно, что Вам нравится))
Ответ: 1. Ctrl+Shift+F. Работает и в CubeIDE.
2. На счет правильности выставления времени ожидания. Это очень сложно, т.к. это Вам каждое сообщение нужно будет прогонять через логический аналзатор и смотреть, сколько времени требуется под то или иное сообщение. 0xFFFF = 65535. Это я просто максимальное время выставил. Его не обязательно записывать в hex формате. Можете и в dec записывать). Я не уверен на 100%, но я думаю там устроено так, что он отправил за какое-то время данные и дальше ждать уже не будет. Поэтому можете ставить и 100 и больше. Главное, чтоб оно успевало отправлять. А вообще блокирующей функцией пользоваться не советую, т.к. она все тормозит.
Выводим сразу в UART функция UART_Printf() форматированный вывод
#include
#include
void UART_Printf(const char* fmt, ...) {
char buff[256];
va_list args;
va_start(args, fmt);
vsnprintf(buff, sizeof(buff), fmt, args);
HAL_UART_Transmit(&huart1, (uint8_t*)buff, strlen(buff),
HAL_MAX_DELAY);
va_end(args);
}
Константин, в данном случае функция является блокирующей, что не есть хорошо для оптимальной работы. Лучше использовать прерывания.
@@Solderingironspb я знаю , но она идентична тому что вы в начале урока отправляли без прерывания. А по поводу прерывания чтобы проверить свободен или нет UART можно просто вместо где у вас IF ставить цикл while( HAL_UART_GetState (&huart1) == HAL_UART_STATE_BUSY_TX ) ; получается пока шина занята мы крутимся в цикле как шина освободится то покидаем его, единственное блокируем код , если не хотим блокировать то тогда как вы показывали в видео с флагами. А по поводу отладочной информации ее лучше выводить не в UART ( ардуиновская привычка ) а через SWO ( ресурсы МК практически не используются, единственное работает только на передачу )
UART используется ж не только для отладки) Полностью согласен с Вами на счет работы с swo в режиме дебага) в начале видео, если присмотритесь к программатору моему, он перепаян. Там и swo и rst выведены)
спасибо. теперь понял зачем очередь)
получается нужно смотреть все ролики подряд а не выборочно.
Да) поэтому я и нумерую их)
Около месяца назад увлекся микроконтроллерами и просматриваю в том числе и ваши уроки, мне нравиться как вы преподносите материал, и тоже учусь на TrueSTUDIO, но настораживает что у IDE нет уже поддержки, хочется узнать ваше мнение по этому моменту.
Я сейчас пересел на CubeIDE. Полет нормальный. В принципе, одно и то же)) По поводу TrueSTUDIO остались теплые воспоминания))
@@Solderingironspb я тоже сегодня пересел на CubeIDE, но вот простая программа по передаче по UART не получается собирается без ошибок но терминал не видит данные, хотя если запускаю в KEIl то все нормально, но Keil не не нравиться, хочется как то что бы CubeIDE получалось
@@СергейГончаров-э4г значит делаете что-то не так. IDE не влияет на код. Вы по моему уроку с UART работали?
@@Solderingironspb Проще чем по вашему уроку , активирую через CubeMX режим USART1 в асинхронном режиме, выставляю тактирование, перехожу через Project Manager в среду программирования, в main.c прописываю массив со строкой и функцию HAL_UART_Transmit(), передаю ей массив, в блок while(), когда перехожу в KEIL все сразу работает (то есть терминал получает сообщение в виде строки), когда после тех же операций перехожу в CubeIDE терминал не видит сообщений, хотя сборка прошла спешно , вот на этом я пока и застрял..
@@СергейГончаров-э4г Интересно, чем все закончилось, решили проблему?)))))))
Бомба
Вы используете три способа отправки в юарт, подскажите в каких случаях какой способ применять и какой способ используется в ардуино?
хм....в ардуино скорее всего блокирующая функция прописана, НО утверждать не буду, не разбирался в ее внутренностях) По поводу Stm32: первый способ - это блокирующая функция, пользоваться ей крайне не желательно, т.к. она будет тормозить весь код (аналогично использованию Delay). Второй способ - работает на прерываниях. Писать сложней, но зато ничего не блокируется. МК кинул данные на отправку и занимается другими делами. Потом только проверяет, можно ли еще одну передачу осуществить или рано еще. Третий способ считается самым продвинутым. Меньше нагружает ядро. Работает еще быстрее. Как-то так...
А как вы терминал открываете в компиляторе?И у меня панель другая.Это не Cubeide/ Atolic truestudio
Ардуиновский? по UART кидаю данные на USB TTL конвертер. Он в компьютере определен, как Com port. Я его просто открываю в Arduino IDE(монитор порта).
Можно вместо USB TTL конвертера использовать любую Arduino плату, ту же Arduino nano. Ресет на ардуино закорачиваем на землю и все(Система мк не запускается, плата просто работает, как USB TTL конвертер). Только в данном случае UART соединение между STM32 и платой ардуино будет не Tx->Rx, Rx->Tx, а Tx->Tx, Rx->Rx.
Ок, вопрос))) ПИшем символы и они передаются по UART перекодируясь потом по коду ASCII в двоичный код. А как мне отправить например число 5? Ну или число 10 например, чтобы UART отправил его не как два числа 1 и 0 , а именно 10?
uint8_t A = 10;
HAL_UART_Transmit(&huart1, &A, 1, 10);
Скажите пожалуйста, как можна приемать и передават данни по UART, каторые представляют целье натуралнье числа - стойности переменная, а не символами-числа типа char? Я пробвал разные варианть, но не успел. Функция UART сделана так, что можно передается только символами. В Ардуино ето очень просто, делается по умолчание, но сюда не так...
Я протокол свой делал. Для примера можете глянуть мое видео: «Практика #06». Мне так куда больше нравится работать, т.к. с проверкой CRC надежней получается.
@@Solderingironspb Спасибо. Библиотека сделана очень грамотно.
сними видео для CMSIS желателно STM32f4
а в чем проблема? Там немного отличается от F1, но не прям кардинально. Я попробовал на STM32F411CEU6 на CMSIS поработать. вроде получается. Вот тут есть некоторые функции: github.com/Solderingironspb/STM32F411CEU6_CMSIS_notes
Тут главное тактирование поднять и понять, как с GPIO работать, т.к. отличие от F1 большие. А интерфейсы настраиваются почти аналогично.
Отправка по прерыванию - реально говнокод )
Прерывание работает не так. Флаги как раз в прерывании и надо обнулять - первый буфер улетел - флаг выставили. ВТорой отправляем - проверяем флаг. Первый отправился, прерывание сработало - флаг обнулили, можем отправлять следующее.
А так обычная очередь, прерывание здесь ничего не делает абсолютно.
Попробовал как-то так сделать, вроде работает. Когда все сообщения отправлены то просто ничего не происходит, но каждую секунду обнуляется счетчик и передача происходит заново.
Единственный нюанс - странная проблема с дебагом. Когда перехожу к выводу второй строки tx_buffer1 то в консоли выводится дубликат первой строки tx_buffer. Видимо где-то ошибка...
обработчик прерываний:
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
queue++;
}
цикл While:
if (queue == 1){
HAL_UART_Transmit_IT(&huart1, tx_buffer, sizeof tx_buffer / sizeof tx_buffer[0]);
}
if (queue == 2){
HAL_UART_Transmit_IT(&huart1, tx_buffer1, sizeof tx_buffer1 / sizeof tx_buffer1[0]);
}
if ((HAL_GetTick() - T >= 1000) && queue > 2) {
T = HAL_GetTick();
queue = 1;
}
Наблюдение: все корректно работает на STM32F103C8T6, но с STM Discovery на STM32F407VGT6 наблюдаются траблы со скоростью порта и выходит непонятно что
любопытно почему так
Не понятно почему у СТМ нету возможности настраивать юарт на 7 бит. В тех же АВР есть такая функция. И в своей практике встречал устройства которые обмениваются именно так.
В некоторых Stm32 есть 7мибитный USART. Вот, как пример. (стр. 700) www.st.com/resource/en/reference_manual/DM00031936-.pdf
Programmable data word length (7, 8 or 9 bits)
STM32F04x STM32F07x STM32F09x поддерживают 7мибитный USART.
@@Solderingironspb спасибо. Но все равно это странно. У них так много настроек а такое элементарное не сделали
Ну да)
Еще хотел спросить, как вас найти в контакте?
В описании ссылка есть на группу) в группе я админ) так и найдете)
Здравствуйте, Олег. Делаю все как у вас, перечитал кучу страниц в интернете. Не получается у меня выводить текст. Ни русский, ни английский. В порт сыплет кракозябры. Где то может не совпадают кодировки или еще что? 3 дня бьюсь, все без толку. Можете мне помочь? Моя почта asdfgj@mail.ru
А у меня вопреки всему на ардуинском мониторе и на сторонних терминалах из UART идут
кракозябры независимо от установки шрифта и кодировки!!! Где ключ от фокуса?
SOS! SOS! SOS!
Скорость выставлена правильно? Кодировка совпадает?
Да всё проверил. Уже закипел как чайник. Всё скопировал "от и до".
SWO работает правильно.
Кодировки проверял UTF8 и Cp1251 латинницу и кириллицу. ВЕЗДЕ кракозябры. :(
Без паники) можете написать мне Вконтакте. Подберем удобное время для Вас и меня. Подключусь удаленно или так разберемся с проблемой)