У тебя initDmfDevice реализована в cpp файле, а вызывается из с файла. С не знает ничего о срр. Функцию надо засунуть внутрь extern "C"{}
Э...не понял, main.c подключает dmfcomm.h, в которой прописано определение процедуры, которая в dmfcomm.cpp. Просьба разъяснить что не так.
точно не знаю как и где этот механизм работает ,наверное в каждой среде по разному - в IARe вроде среда программирования решает какой компилятор вызывать(с или с++) на основании окончания файла . то есть если у вас "обычная функция" в файле *.cpp , вызываеться из файла *.c , то есть шанс ,что линковщик Си, просто не увидит вашу фунцию в .cpp .Для того что бы увидел ,для этого в файле .cpp , явно указывается что некие функции должны копмилироваться/линковаться при помощи Си компилятора/линкера. , в GCC делается так
сделал обработчик по прерыванию , все хорошо, все работает
во многих инструкциях интернета используется вот такая строка в прерывании
while (!(USART2->ISR & USART_ISR_TC));
т е ждет как байт уйдет и в USART2->TDR кладем следующий. Но ведь получается что мы ждем....и утекают лишние микро и милли секунды. Пока вышел из положения в основной цикл поставил проверку если что отправлять и МК готов - кладем байт из fIFO буфера
Вот и вопрос у меня, получается что software wait из диаграммы я могу засунуть только в основной while(1) программы.
ну почему же ?если настроить прерывания на отправку , то после отправки первгово байта из буфера , можно " заниматься" своими делами а при срабатывании прерывания проверять флаг окончания отправки и подкидывать следуюший байт для отправки пока не отравится весь буффер
Прерывание на отправку срабатывает один раз или по окончании байта или всей отправки, соответственно если в буфер пусто, то отправка не пройдёт и это логично. А теперь какая то другая часть программы через X время положил в буфер байт, прерывание уже до него не доберётся. Я уже попробовал данный вариант.
Вижу ещё решение при складировании в fifo очередной партии данных, смотреть флаг МК и выкладывать из очереди. Но что то не нравиться мне этот вариант.
если настроить прерывания на отправку , то после отправки первгово байта из буфера , можно " заниматься" своими делами а при срабатывании прерывания проверять флаг окончания отправки и подкидывать следуюший байт для отправки пока не отравится весь буффер
Ви картинко хот сматрель ??? ))))))))
"Не давайте глупых советов, ибо это уже выглядит глупо!"(с)...
ssss, при всем уважении, я за последние несколько дней пересмотрел много чужого кода в интернете. Они все такое ощущение копипаст с одной статьи. Если есть код который отправляет без условий ожидания флага окончания отправки байта МК, просьба показать.
Uodate: в смысле не флага, а как проверять буфер по какому то времени или сигналу или таймеру чтоб байт в отправку послать.
Думаю прикрутить к миллисекундному таймеру...
PS. Нет, это устройство, которое должно быть постоянно на связи с mqtt брокером, используется три uart, связь с модемом, лог и снятие кадров с фотокамеры. + чтение с пина по таймеру сигнала с контрольного устройства доступа + управление исполнительным устройством и все это в режиме 27/7 без участия человека с восстановлением связи. На atmega328p уже все сделал, но на чтение фото с камеры уже быстродействия и uart тупо не хватает, вот и пришлось на stm32 сесть.
Все подряд -это ниочем.
Если нужно максимальное быстродействие то только DMA.
У меня такое ощущение что вы пытаетесь софтовый ногодрыг с авр натянуть на стм.
Все подряд -это ниочем.
Если нужно максимальное быстродействие то только DMA.
У меня такое ощущение что вы пытаетесь софтовый ногодрыг с авр натянуть на стм.
PS. Нет, это устройство, которое должно быть постоянно на связи с mqtt брокером, используется три uart, связь с модемом, лог и снятие кадров с фотокамеры. + чтение с пина по таймеру сигнала с контрольного устройства доступа + управление исполнительным устройством и все это в режиме 27/7 без участия человека с восстановлением связи.
Три ЮАРТ... И как... позвольте узнать... вы все это хотите разруливать... чтобы все быстро и не мешало друг другу... без ДМА???
Операционку тулить будете ??? И чего вы так ДМА боитесь ??? Таймера и ДМА... основная фишка СТМ32...
Логанализатор... референс... и терпение... Потом сами удивитесь... как все легко и просто...
Заносим указатель на буфер, заносим длину транзакции, включаем трансфер.
Все. В прерывании DMA по окончанию трансфера проверяем флаг TC(это мизер по сравнению с ручной посылкой) выставляем флаг окончания транзакции посылки. Сей флаг мониторим перед очередной посылкой.
Процессор свободен транзакция происходит автоматически...
Вообщем связка DMA и UART создает полный автомат .
Для которого достаточно ввести параметры и пнуть..
как проверять буфер по какому то времени или сигналу или таймеру чтоб байт в отправку послать. Думаю прикрутить к миллисекундному таймеру...
Можно и таймером... но это если данные постоянной длины... но опять... чтобы все выровнять до такта... нужен логанализатор... Лучше ДМА... железо само крутить будет...
PS. Нет, это устройство, которое должно быть постоянно на связи с mqtt брокером, используется три uart, связь с модемом, лог и снятие кадров с фотокамеры. + чтение с пина по таймеру сигнала с контрольного устройства доступа + управление исполнительным устройством и все это в режиме 27/7 без участия человека с восстановлением связи.
Три ЮАРТ... И как... позвольте узнать... вы все это хотите разруливать... чтобы все быстро и не мешало друг другу... без ДМА???
Операционку тулить будете ??? И чего вы так ДМА боитесь ??? Таймера и ДМА... основная фишка СТМ32...
Логанализатор... референс... и терпение... Потом сами удивитесь... как все легко и просто...
Легко)
Два uart прекрасно на atmega328p работает. Я не говорю что DMA боюсь)
Фразу сейчас нашёл хорошую "Если вам нужно передавать (или принимать) через USART массыв данных, тогда есть смысл использовать DMA"
На уже провереной практике стабильно по gprs одним потоком на mqtt брокер уходит за раз байт 600, при размере фотки ~5 кбайт, это уйдёт за 10 частей. Для этого случая да, DMA нужен, реализую. Во всх остальных отправках несколько байт это бессмысленно.
Всем привет. Может не в тему. Есть вопрос. Может и глупый( я не спец). Может кто найдет минутку и ответит. Приехала платка с АЛИ STM32F103CB . случайно наверно положили. Вот 2 день изучаю. У меня нет программатора для нее, но зато в стационарном компе 4 компорта. есть программатор SPI - USBASP для ардуино.
1 . Почему нельзя достучаться до флешпамяти контроллера через SPI(или ни кто загрузчик не хочет писать)
2.Можно ли использовать компорт(другие TTL технологии без проблем, например LON)
USB-UART это переходник на последовательный(RX,TX, GRD) поскольку в современных компах их(компортов) нет. Все чипы программаторов и 2303 и 2102 и CH340 являются конвертерами в RS232(компорт)
Всем привет. Может не в тему. Есть вопрос. Может и глупый( я не спец). Может кто найдет минутку и ответит. Приехала платка с АЛИ STM32F103CB . случайно наверно положили. Вот 2 день изучаю. У меня нет программатора для нее, но зато в стационарном компе 4 компорта. есть программатор SPI - USBASP для ардуино.
1 . Почему нельзя достучаться до флешпамяти контроллера через SPI(или ни кто загрузчик не хочет писать)
2.Можно ли использовать компорт(другие TTL технологии без проблем, например LON)
А лон , так это просто можно было через USB-COM 2102 чип, а можно напрямую через COM1 c этими контроллерами соединятся. Я даже тут где то нашел человека, который исполдьзует программатор для STM как компорт.
Я как понимаю такую операцию со сменой загрузчика нужно сделать только один раз, потом можно работать через встроенный USB
блин, вам же дали ссылку выше, где все описано? - но вы явно ее не читали, а вместо этого стали нести бред про "железный компорт". Прочитайте ссылку-то уже...
COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка generic_boot20_pc13.bin >>> получаем мапл мини, через USB на плате грузим программы для себя.
COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка stlinkv2_1.bin>>> припаиваем 3 резистора и 1 конденсатор, получаем программатор ST-LINK и через него в любой среде по SWD грузим прошивки в другие СТМки и отлаживаем где можно. Каждый выбирает сам.
COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка generic_boot20_pc13.bin >>> получаем мапл мини, через USB на плате грузим программы для себя.
COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка stlinkv2_1.bin>>> припаиваем 3 резистора и 1 конденсатор, получаем программатор ST-LINK и через него в любой среде по SWD грузим прошивки в другие СТМки и отлаживаем где можно. Каждый выбирает сам.
Простиреть или расширшить познания не вопрос, если тебе это надо и есть над чем поиздеваться. Готов поучаствовать в простирации в мере сил, опять же если ты сам хочешь. В принципе к завтрашнему утру уже можно в руках иметь полный рабочий набор начинающего стмщика.
У тебя initDmfDevice реализована в cpp файле, а вызывается из с файла. С не знает ничего о срр. Функцию надо засунуть внутрь extern "C"{}
У тебя initDmfDevice реализована в cpp файле, а вызывается из с файла. С не знает ничего о срр. Функцию надо засунуть внутрь extern "C"{}
Э...не понял, main.c подключает dmfcomm.h, в которой прописано определение процедуры, которая в dmfcomm.cpp. Просьба разъяснить что не так.
У тебя initDmfDevice реализована в cpp файле, а вызывается из с файла. С не знает ничего о срр. Функцию надо засунуть внутрь extern "C"{}
точно не знаю как и где этот механизм работает ,наверное в каждой среде по разному - в IARe вроде среда программирования решает какой компилятор вызывать(с или с++) на основании окончания файла . то есть если у вас "обычная функция" в файле *.cpp , вызываеться из файла *.c , то есть шанс ,что линковщик Си, просто не увидит вашу фунцию в .cpp .Для того что бы увидел ,для этого в файле .cpp , явно указывается что некие функции должны копмилироваться/линковаться при помощи Си компилятора/линкера. , в GCC делается так
да, видел эти конструкции в исходниках SPL, понял, спасибо.
В итоге собрал проект с нуля с те ми же файликами - все заработало, так что где то просто ошибся или глюк.
вопрос опытным по логике работы USART
сделал обработчик по прерыванию , все хорошо, все работает
во многих инструкциях интернета используется вот такая строка в прерывании
т е ждет как байт уйдет и в USART2->TDR кладем следующий. Но ведь получается что мы ждем....и утекают лишние микро и милли секунды. Пока вышел из положения в основной цикл поставил проверку если что отправлять и МК готов - кладем байт из fIFO буфера
но как то это грубо и не кошерно :(
вижу только одну мысль как от этого избавиться - сделать новый таймер на несколько микросекунд
Флаг TC используется для потока а не для отправки одиночного байта, и проверяется конец передачи фрейма . Используйте TXE для одиночных транзакций.
Флаг TC используется для потока а не для отправки одиночного байта, и проверяется конец передачи фрейма . Используйте TXE для одиночных транзакций.
да, точно, спасибо, ща исправлю
Если что - вот картинкО из RM .
Обратите внимание на то когда какой флаг выставляется и на последовательность в комментах...
Вот и вопрос у меня, получается что software wait из диаграммы я могу засунуть только в основной while(1) программы.
ну почему же ?если настроить прерывания на отправку , то после отправки первгово байта из буфера , можно " заниматься" своими делами а при срабатывании прерывания проверять флаг окончания отправки и подкидывать следуюший байт для отправки пока не отравится весь буффер
Прерывание на отправку срабатывает один раз или по окончании байта или всей отправки, соответственно если в буфер пусто, то отправка не пройдёт и это логично. А теперь какая то другая часть программы через X время положил в буфер байт, прерывание уже до него не доберётся. Я уже попробовал данный вариант.
Вижу ещё решение при складировании в fifo очередной партии данных, смотреть флаг МК и выкладывать из очереди. Но что то не нравиться мне этот вариант.
если настроить прерывания на отправку , то после отправки первгово байта из буфера , можно " заниматься" своими делами а при срабатывании прерывания проверять флаг окончания отправки и подкидывать следуюший байт для отправки пока не отравится весь буффер
Ви картинко хот сматрель ??? ))))))))
"Не давайте глупых советов, ибо это уже выглядит глупо!"(с)...
Если просто чтобы работало... найдите чужой код... готовый...
Если хотите разобраться в железе... основательно... логанализатор вам в помощь... иначе в трех байтах запутаетесь...
ssss, при всем уважении, я за последние несколько дней пересмотрел много чужого кода в интернете. Они все такое ощущение копипаст с одной статьи. Если есть код который отправляет без условий ожидания флага окончания отправки байта МК, просьба показать.
Uodate: в смысле не флага, а как проверять буфер по какому то времени или сигналу или таймеру чтоб байт в отправку послать.
Думаю прикрутить к миллисекундному таймеру...
Используйте DMA. А вообще - что изобретаете, не modbus часом ?
Посмотрите эту книжку(первая в списке, доступно бесплатно) в ней в разделе 11.5 есть подробное обьяснение с примерами кода:
https://www.st.com/content/st_com/en/support/learning/stm32-education/text-books.html
Посмотрите эту книжку(первая в списке, доступно бесплатно) в ней в разделе 11.5 есть подробное обьяснение с примерами кода:
https://www.st.com/content/st_com/en/support/learning/stm32-education/text-books.html
Спасибо, скачал, изучаю
Хорошо, спрошу по другому - что отправляете, строку, пакет или что?
в UART ? в log который - строки, в UART для модема и камеры все подряд. Т е все потоки данных uart должны быть максимально независимы.
Все подряд -это ниочем.
Если нужно максимальное быстродействие то только DMA.
У меня такое ощущение что вы пытаетесь софтовый ногодрыг с авр натянуть на стм.
Если нужно максимальное быстродействие то только DMA.
У меня такое ощущение что вы пытаетесь софтовый ногодрыг с авр натянуть на стм.
Возможно и не прав, пошёл повторно читать про DMA
Три ЮАРТ... И как... позвольте узнать... вы все это хотите разруливать... чтобы все быстро и не мешало друг другу... без ДМА???
Операционку тулить будете ??? И чего вы так ДМА боитесь ??? Таймера и ДМА... основная фишка СТМ32...
Логанализатор... референс... и терпение... Потом сами удивитесь... как все легко и просто...
Заносим указатель на буфер, заносим длину транзакции, включаем трансфер.
Все. В прерывании DMA по окончанию трансфера проверяем флаг TC(это мизер по сравнению с ручной посылкой) выставляем флаг окончания транзакции посылки. Сей флаг мониторим перед очередной посылкой.
Процессор свободен транзакция происходит автоматически...
Вообщем связка DMA и UART создает полный автомат .
Для которого достаточно ввести параметры и пнуть..
Можно и таймером... но это если данные постоянной длины... но опять... чтобы все выровнять до такта... нужен логанализатор... Лучше ДМА... железо само крутить будет...
Три ЮАРТ... И как... позвольте узнать... вы все это хотите разруливать... чтобы все быстро и не мешало друг другу... без ДМА???
Операционку тулить будете ??? И чего вы так ДМА боитесь ??? Таймера и ДМА... основная фишка СТМ32...
Логанализатор... референс... и терпение... Потом сами удивитесь... как все легко и просто...
Легко)
Два uart прекрасно на atmega328p работает. Я не говорю что DMA боюсь)
Фразу сейчас нашёл хорошую "Если вам нужно передавать (или принимать) через USART массыв данных, тогда есть смысл использовать DMA"
На уже провереной практике стабильно по gprs одним потоком на mqtt брокер уходит за раз байт 600, при размере фотки ~5 кбайт, это уйдёт за 10 частей. Для этого случая да, DMA нужен, реализую. Во всх остальных отправках несколько байт это бессмысленно.
Всем спасибо, начну реализовывать.
Всем привет. Может не в тему. Есть вопрос. Может и глупый( я не спец). Может кто найдет минутку и ответит. Приехала платка с АЛИ STM32F103CB . случайно наверно положили. Вот 2 день изучаю. У меня нет программатора для нее, но зато в стационарном компе 4 компорта. есть программатор SPI - USBASP для ардуино.
1 . Почему нельзя достучаться до флешпамяти контроллера через SPI(или ни кто загрузчик не хочет писать)
2.Можно ли использовать компорт(другие TTL технологии без проблем, например LON)
Загрузчик есть у любого стм32 с завода.
Минимально нужен USB-UART...
USB-UART это переходник на последовательный(RX,TX, GRD) поскольку в современных компах их(компортов) нет. Все чипы программаторов и 2303 и 2102 и CH340 являются конвертерами в RS232(компорт)
Всем привет. Может не в тему. Есть вопрос. Может и глупый( я не спец). Может кто найдет минутку и ответит. Приехала платка с АЛИ STM32F103CB . случайно наверно положили. Вот 2 день изучаю. У меня нет программатора для нее, но зато в стационарном компе 4 компорта. есть программатор SPI - USBASP для ардуино.
1 . Почему нельзя достучаться до флешпамяти контроллера через SPI(или ни кто загрузчик не хочет писать)
2.Можно ли использовать компорт(другие TTL технологии без проблем, например LON)
https://easystm32.ru/useful-things/42-bootloader-stm32/ Все ответы можно найти здесь в ещё в куче мест.
это все понятно, может кто глубже копался, но все равно спасибо за интересную ссылку
Простите а глубже это куда? Есть мануал на чип. RM00008 называется. Там всё расписано.
И это не AVR. По spi не программируется. А что такое LON?
Я понял.. Хотел обойти тему с программатором. Попробую с физическим компортом завтра .
А лон , так это просто можно было через USB-COM 2102 чип, а можно напрямую через COM1 c этими контроллерами соединятся. Я даже тут где то нашел человека, который исполдьзует программатор для STM как компорт.
Я понял.. Хотел обойти тему с программатором. Попробую с физическим компортом завтра .
не нужен там никакой "физический компорт", все отлично работает через USB-UART, можно даже через ардуину
Присоединяюсь. Физический компорт убьёт стмку. Не переносит она -12 вольт.
А как через ардуинку
Я как понимаю такую операцию со сменой загрузчика нужно сделать только один раз, потом можно работать через встроенный USB
Bootloader вы не смените и не затрете ни чем, залочить/запороть чип сможете ...
Bootloader вы не смените и не затрете ни чем, залочить/запороть чип сможете ...
да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?
Я как понимаю такую операцию со сменой загрузчика нужно сделать только один раз, потом можно работать через встроенный USB
блин, вам же дали ссылку выше, где все описано? - но вы явно ее не читали, а вместо этого стали нести бред про "железный компорт". Прочитайте ссылку-то уже...
Bootloader вы не смените и не затрете ни чем, залочить/запороть чип сможете ...
да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?
нет, читать про ноги BOOT0 и BOOT1.
да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?
Нет, бутлодер прошивается на заводе, он нестираемый. А вот потом, он позволяет прошить usb загрущик. Это 2 разные вещи
да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?
Нет, бутлодер прошивается на заводе, он нестираемый. А вот потом, он позволяет прошить usb загрущик. Это 2 разные вещи
дед, usb загрузчик и по SWD/JTAG можно записать.
Bootloader вы не смените и не затрете ни чем, залочить/запороть чип сможете ...
да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?
Не спорьте с Алексеем... "Это вредно для вашего здоровья!"(с)...
да ладно? А как же USB-загрузчик для СТМ-ардуино? - или это не бутлоадер?
Нет, бутлодер прошивается на заводе, он нестираемый. А вот потом, он позволяет прошить usb загрущик. Это 2 разные вещи
дед, usb загрузчик и по SWD/JTAG можно записать.
Можно, да. Но можно и железным загрузчиком по Uart. Переходники ch340 у всех есть, а swd нет. У мня вот нету.
COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка generic_boot20_pc13.bin >>> получаем мапл мини, через USB на плате грузим программы для себя.
COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка stlinkv2_1.bin>>> припаиваем 3 резистора и 1 конденсатор, получаем программатор ST-LINK и через него в любой среде по SWD грузим прошивки в другие СТМки и отлаживаем где можно. Каждый выбирает сам.
COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка generic_boot20_pc13.bin >>> получаем мапл мини, через USB на плате грузим программы для себя.
COM-USB->TTL (boot0 boot1) >>перепайка резистора 10к на 1.5к >> загрузка stlinkv2_1.bin>>> припаиваем 3 резистора и 1 конденсатор, получаем программатор ST-LINK и через него в любой среде по SWD грузим прошивки в другие СТМки и отлаживаем где можно. Каждый выбирает сам.
Столь далеко мои познания в stm не простираюца
Простиреть или расширшить познания не вопрос, если тебе это надо и есть над чем поиздеваться. Готов поучаствовать в простирации в мере сил, опять же если ты сам хочешь. В принципе к завтрашнему утру уже можно в руках иметь полный рабочий набор начинающего стмщика.
Я его еще только начал щюпать. Пока мне для моих нехитрых задач хватает 328й, не вижу, куда можно применить монстра stm. :-)