Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Вс авг 19, 2018 20:03:37
Модератор
Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4564 Откуда: Планета Земля
Рейтинг сообщения:2 Медали: 1
VladislavS, ну почему же нечем. Она сказала, что тыкалась осциллом. Этого достаточно, чтобы оценить работоспособность.
dosikus, к слову. Лет десять назад я начал работать на одну контору. Мои знания об UART'е были не больше чем у этой девушки. А код был такой, что мне сейчас стыдно смотреть на него. Но никто мне пинка под зад не давал, а говорили - развивайся, что нужно - говори. Хотя могли вполне себе нанять более опытного. Сейчас меня уважают и ценят. И заказы мне все оплачивают без всяких проблем, от мелочи (МК, детали, ...) до дорогого оборудования. Так что, прав каждый, но по-своему ... .
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Пн авг 20, 2018 18:35:31
Встал на лапы
Зарегистрирован: Вс мар 01, 2009 20:41:19 Сообщений: 125
Рейтинг сообщения:0
Здравствуйте, писал парсер intel hex формата, обратил внимание на 1 момент, отсутствует адреса 01ac - 01af , кто подскажет их значения 0x00 или (0xFF по умолчанию значения сектора после отчистки) ? Спойлер
Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Вт авг 21, 2018 07:29:46
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
bezzabotna писал(а):
К слову, модуль все равно не отвечает, если смотреть осциллографом и без всяких задержек. Скорее всего, модуль неисправен
А передачу из МК в модуль осциллограф видит? А то, может быть, что-то не сошлось в инициализации, и модуль молчит, потому, что ему не на что отвечать?
Да, обновил кубики, попробовал тот свой проект, где пытался воевать с FATFS. Увы, для SDIO не предлагают драйвер LL. (Для FATFS тоже, но это вполне объяснимо.) А так - Project->Setting, на закладке Advanced Setting, в верхней ее половине, перечислены все задействованные компоненты, для каждого предложен драйвер HAL, некоторым этот HAL можно заменить на LL.
Попробовал закопаться в тот кубик, который HAL-драйвер SDIO. Увы, похоже, обмена с SDIO без ожидания не может быть, и ожидание - только прополкой. 100%-й уверенности в этом у меня, конечно, нет, но процентов 90 - точно. То есть, для моего отложенного проекта мне не светит собрать FATFS из кубиков. Ладно, как говорят у нас на востоке, если гора не идет к Магомету, Аллах с ними обоими...
На всякий случай, вот ссылка на обмен с SD уровня CMSIS/SPL. Автор нашел в примерах какого-то старого Кейла нечто, вроде драйвера для SD-card. Я попытался найти это в новом Кейле - увы. Однако, в том проекте нужные файлы есть и новый Кейл их молча съел. В общем, вроде-бы, все работает. Осталось взять FATFS Чана и дописать в его diskio.c вызовы подпрограмм из утянутой по ссылке (sdcard.c + sdcard.h), но пока я отложил это дело.
Добавлено after 44 minutes 7 seconds:
arkhnchul писал(а):
почти. Но буфер однобайтовый. Если оттуда не успели забрать предыдущий байт к моменту прихода следующего - поезд ушел.
Даже так? А на хрена тогда нужен такой драйвер "высокого" уровня? Неудивительно, что народ не любит этот HAL. Если бы я делал драйвер высокого уровня для USART'а, я бы обязательно прикрутил к нему кольцевой буфер и, при обращении за очередным байтом, выдавал его оттуда. Или сигнал ошибки, если его нет. Элементарно, функция чтения имеет тип int, получил 0-255 - очередной считанный байт, получил -1 - ошибка. А по ошибке лезь в структуру управления этим USART'ом и смотри, что это - байт не поступил, или что хуже.
Повторюсь, о HAL я не знаю, практически, ничего. Поэтому я и не отреагировал на эту ошибку - я-то подумал, что драйвер HAL действительно высокого уровня...
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
А на хрена тогда нужен такой драйвер "высокого" уровня?
там не все так прям плохо) HAL_UART_Receive принимает указатель на буфер; количество байт, которые в него надо запихать; таймаут, за который это надо сделать. Возвращает коды ошибок. Т.е. в принципе вполне рабочая функция. Однако что у нас деется в данном случае:
посылаем в устройство команду и ждем две секунды - за это время ответ, буде таковой возымеет место, давно пройдет, и в DR будет в лучшем случае его последний байт, а в SR - Overrun error. И только потом натравливаем функцию на несчастный huart - только затем, чтобы через четыре с половиной часа (0xFFFFFF миллисекунд) получить от нее HAL_TIMEOUT.
Заголовок сообщения: Re: STM32 новичку в ARM что к чему
Добавлено: Вт авг 21, 2018 18:02:55
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
arkhnchul писал(а):
там не все так прям плохо) HAL_UART_Receive принимает указатель на буфер; количество байт, которые в него надо запихать; таймаут, за который это надо сделать. Возвращает коды ошибок. Т.е. в принципе вполне рабочая функция.
Я бы не сказал, что она вполне рабочая. Такое годится только для общения блоками наперед заданного размера. Это во-первых. И, во-вторых, на время приема этого блока основная задача встанет колом - работать будет только то, что в прерываниях. Даже и не соображу, где такое можно применить? Ну, разве что под управлением полноформатной многозадачной ОС с вытеснением менее приоритетных потоков более приоритетным при его готовности.
В общем, непродуманная ерунда. А нужен именно драйвер с кольцевым буфером, который в прерываниях сам снимает принятые байты и складывает в этот буфер, а в основной задаче выдает их оттуда или сигналит, что новый байт не поступил. Тут вполне работают и записи неопределенной длины (с разделителем в виде CR, например), и посимвольная активация, и все, что хочешь. И, в частности, позволит основной задаче не затыкаться наглухо, если очередной байт еще не пришел.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
в прерываниях сам снимает принятые байты и складывает в этот буфер, а в основной задаче выдает их оттуда или сигналит, что новый байт не поступил
какбэ этсамое, на блокирующих методах все не заканчивается
Код:
This subsection provides a set of functions allowing to manage the UART asynchronous and Half duplex data transfers.
(#) There are two modes of transfer: (++) Blocking mode: The communication is performed in polling mode. The HAL status of all data processing is returned by the same function after finishing transfer. (++) Non blocking mode: The communication is performed using Interrupts or DMA, these APIs return the HAL status. The end of the data processing will be indicated through the dedicated UART IRQ when using Interrupt mode or the DMA IRQ when using DMA mode. The HAL_UART_TxCpltCallback(), HAL_UART_RxCpltCallback() user callbacks will be executed respectively at the end of the transmit or receive process. The HAL_UART_ErrorCallback() user callback will be executed when a communication error is detected.
(#) Non Blocking mode APIs with Interrupt are: (++) HAL_UART_Transmit_IT() (++) HAL_UART_Receive_IT() (++) HAL_UART_IRQHandler()
(#) Non Blocking mode functions with DMA are: (++) HAL_UART_Transmit_DMA() (++) HAL_UART_Receive_DMA() (++) HAL_UART_DMAPause() (++) HAL_UART_DMAResume() (++) HAL_UART_DMAStop()
(#) A set of Transfer Complete Callbacks are provided in non blocking mode: (++) HAL_UART_TxHalfCpltCallback() (++) HAL_UART_TxCpltCallback() (++) HAL_UART_RxHalfCpltCallback() (++) HAL_UART_RxCpltCallback() (++) HAL_UART_ErrorCallback()
Такое годится только для общения блоками наперед заданного размера.
кто-то мешает указать размер буфера, а не ожидаемого блока?
Дело в том, что готовность установится только когда буфер заполнится. Но это пол беды. Если на юарт вешать модбас, то там к нему в пару на каждом байте запускается таймер, чтобы отловить 3,5 символа паузы, понять что пакет таки приехал и начинать его разбирать.
Во всяком случае, есть DMA, с кольцевым буфером, все как любите. +активируем прерывание самого юарта, в обработчик засовываем запуск/перезапуск таймера, и когда он протикал наших 3,5 символа - разбираем буфер. Я так понимаю, счетчик байтов DMA тоже как-то можно подцепить, так что начало следующего пакета будет известно. Все так просто, сам не ожидал.
Добавлено after 2 minutes 4 seconds: у Вас подгорает, что все идет к тому что любой неуч потыкав мышкой сделает бОльшую часть Вашей работы, что обесценивает Ваши знания. Согласен, обидно.
Счас у тебя подгорит, в новых линейках есть аппаратная поддержка модбас. Но ты продолжай грызть калокуб... А сказки о "гениальных" натыкивателях можешь нубам втюхивать...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения