Решил чуть по подробнее разобраться с DMA+USART точнее по каким флагам все это завершается.
Пока не понятно, какие флаги состояния сбрасываются, при считывании USART_SR ?
Дело в том что бы дождаться физической завершения передачи, надо:
0) Сбросить флаг USART_SR_TC (считыванием USART_SR )
1) Дождаться самой передачи смотрел DMA_ISR_HTIF2 или DMA_ISR_TCIF2
2) и после этих флагов уже ожидать завершения по USART_SR_TC
В даташите пишут: "Bit 6TC: Transmission complete
This bit is set by hardware ifthe transmission of a frame containing data is complete and if
TXE is set. An interrupt is generated if TCIE=1in the USART_CR1 register. It is cleared by a
software sequence (a read from the USART_SR register followed by a write to the
USART_DR register). The TC bit can also be cleared by writing a '0' to it. This clearing
sequence is recommended only for multibuffer communication.
0: Transmission is not complete
1: Transmission is complete"
А зачем Вам флаги USART если передачей управляет DMA ? USART сам говорит DMA когда ему подавать следующий байт, а DMA сообщит Вам когда отправит все байты в USART.
Как узнать когда USART+DMA закончила принимать данные ? В случае переменной длины ответного пакета (СТАРТ,ДАННЫЕ[],СТОП)
Я так понял что флаг DMA_ISR_TCIF3 выставиться, только тогда когда CNDTR==0
т.е изначально надо знать длину ответного пакета, что бы её занести в CNDTR
Можно принять заголовок пакета по прерываниям, в нем указать количество данных, а потом запустить дма и ,желательно, таймер таймаута. Если не дождались всех данных указанных в заголовке, отключаем дма, включаем прерывания, ждем следующий заголовок.
[uquote="Myp3ik",url="/forum/viewtopic.php?p=3396002#p3396002"]Можно принять заголовок пакета по прерываниям[/uquote]
А в чем смысл изменять способ приема для заголовка (не по dma)?
Чтобы убедиться,что это наш пакет и узнать его длину, затем записать счетчик дма, запутить дма, принять данные.
Если у Вас пакеты разной длины, как Вы организуете приём с помощью дма ?
Заголовки тоже разной длины? Мне просто не понятен смысл инженерного решения.
- Если можно заголовки принимать по прерыванию, зачем хвост принимать по DMA (ведь производительности и так хватает)
- Если заголовок фиксированной длины, почему бы его тоже не принимать по DMA.
С моей точки зрения, есть задача, где надо принимать данные переменной длины. Она сводится к задаче приема 2 чанков известной длины. Менять способ приема байтов для этого не требуется. Либо вы в неявном виде решали какую-то еще задачу, которую не озвучили. Поэтому я спросил, зачем вы так сделали.
Я бы предложил найти по вкусу библиотеку FSM, и научиться расписывать состояния конечного автомата, включая отработку таймаутов. И не пытаться заниматься блочной обработкой, пока с побайтовой не станет получаться идеально (делать через обычные прерывания и не лезть в дма).
pvit, все так и сделал, с прерываниями мне не нравиться, что оно может дергать другие процессы 50-60 раз. В последнее время FSM, начал юзать через адрес функции, а не через swith case, так что в последнем варианте наворотил аж 4 события на каждую команду (передача,прием, передача ок, таймаут)
PS: При помощи DMA сократилось несколько состояний, хотя возможно предыдущий вариант на case был не оптимально написан.
Расскажите мне пожалуйста, неужели нельзя сделать какую-нибудь методичку по СТМ32 для идиотов? Ну, для меня т.е.
Как вы умудрились разобраться с ними?
Читал мануал на русском языке по ним. Да, все красиво расписано и даже почти понятно. Читал у Ди-Халта, читал на каком-то сайте Программирование АРМ, смотрел Ютуб...
Однако, создать первый же проект в Кейле вызывает столько трудностей, что я два дня разбирался что и где и сколько скачать и установить, чтобы можно было МК выбрать тот, что у меня.
А у меня STM32А103C8T6 на платке китайской.
Как подключить к нему 4мя проводками СТ-ЛинкV2 вроде разобрался. Но надо ли ставить какие драйвера на сам СТ-Линк не знаю.
От компа зашитая в платку демо-программа тупо мигает светодиодиком.
Потом читал всяческие сайты про ассемблер к СТМ32. И про организацию памяти. Так и не сумев откомпилировать предложенные наборы строк в проекте.
А организация памяти - это вообще отдельная песня! Какие-то от нуля. В десятичных мне говорят, что у него 64 кБайта памяти. А отображают ее в ШЕСТНАДЦАТЕРИЧНЫХ!
Еще и с какими-то дикими нулями... типа 0х200000000
Что это за цифра такая?
почему у нее огромное значение такое? Неужели мне надо переводить все в десятичные?
Я вычитал где-то что у этих МК памяти органзовано (или адресного пространства) до 4 Гбайт.
И как же в этих цифрах ориентироваться теперь?
А вот это вообще меня в ступор загоняет и в уныние. 0хDFFFFFFF.
И почему у него так дико регистры названы? типа: RTE_USART_TX_PORT_ID_DEF GPIO. Как можно это запомнить? Зачем было столько аббревиатур через нижнее подчеркивание перечислять?
Кто-нибудь может популярно и доходчиво объяснить "почему у машины колеса крутятся"? А то я такими темпами быстрее брошу всю эту лабуду.
В видеороликах на Ютубе одно бешенство. Там все сводится к тому, чтобы установить тупой загрузчик от Ардуино и пользоваться АрдуиноИДЕ. Меня это не устраивает.
И всякие ХАЛ и СПЛ пока в сторонку. И всякие визарды-конструкторы тоже.
Хочу разобраться в самой сути этих МК.
З.Ы. Хорошо усвоил зато, что регистры не такие сложные у них, ну по описанию. Все чем-то похоже на АВР. Ставь себе нолики и единички по даташиту и будет работать так, как там и написано. И очень хорошо усвоил, что вся перефирия у него отключена по умолчанию. И чтобы что-то запустить, то это надо разрешать в регистрах.
Понял, что у него ФАПЧ (ПЛЛ) есть, который умножит частоту моего кварца, чтобы работало АЛУ быстрее.
Понял, что у него есть ДМА, которая позволяет без использования АЛУ выкидывать массивы данных быстренько в порты, причем, пока одно выкидывает, другое само подготавливается. Можно клевенько управлять кучей светодиодов типа ВС2812 например.
Ну и другие интересные штучки.
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3397914#p3397914"]И как же в этих цифрах ориентироваться теперь?[/uquote]
Никак, пиши как все нормальные люди на C/C++ и с этими цифрами практически никогда не будешь пересекаться.
СКАЗОЧНИК писал(а):Однако, создать первый же проект в Кейле вызывает столько трудностей, что я два дня разбирался что и где и сколько скачать и установить, чтобы можно было МК выбрать тот, что у меня.
СКАЗОЧНИК писал(а):Но надо ли ставить какие драйвера на сам СТ-Линк не знаю.
Установите STM32 ST-LINK Utility в дистрибутиве которой есть в т. ч. драйвер для ST-Link.
СКАЗОЧНИК писал(а):А организация памяти - это вообще отдельная песня!
Она линейная с адресным пространством 4ГБ.
СКАЗОЧНИК писал(а):В десятичных мне говорят, что у него 64 кБайта памяти.
В STM32F103C8T6 128 кб флеша, только производитель об этом умалчивает.
СКАЗОЧНИК писал(а):Еще и с какими-то дикими нулями... типа 0х200000000
Это адрес начала ОЗУ. Это вам знать не нужно. Компилятор сам поместит переменные по требуемым адресам.
СКАЗОЧНИК писал(а):И всякие ХАЛ и СПЛ пока в сторонку.
Хал может быть, а SPL вполне годная библиотека для начала. Она устроена просто и можно смотреть ее функции чтобы лучше понять как работать с той или иной периферией МК.
СКАЗОЧНИК писал(а):Хочу разобраться в самой сути этих МК.
СКАЗОЧНИК писал(а):Понял, что у него есть ДМА, которая позволяет без использования АЛУ выкидывать массивы данных быстренько в порты, причем, пока одно выкидывает, другое само подготавливается. Можно клевенько управлять кучей светодиодов типа ВС2812 например.
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3397914#p3397914"]Потом читал всяческие сайты про ассемблер к СТМ32. И про организацию памяти.[/uquote]
В детстве, когда дури было много, я из интереса взялся нарисовать шифратор AES на ассемблере, под StrongARM. Было интересно, что получится по сравнению с C. В итоге обнаружил у себя 2 пропущенные оптимизации и 2 ошибки. Больше подобной фигней с ассемблером не страдал. Чего и вам желаю.
Ладно-ладно. Пусть не ассемблер.
однако же где-то было написано, что вся программа может быть на Си. Но обработчики прерывания на ассемблере.. Типа, что АРМ Кортекс-М3 не понимает по другому. Ну, я так понял из прочитанного.
Просто нарвался на сайт типа радиохлама, где про СТМ так уроки подаваются на ассемблере. ))))
Добавлено after 6 minutes 23 seconds:
О!! Тупо стереть флеш с этой платы у меня получилось.
Добавлено after 2 minutes 20 seconds:
Больше не мигает светодиодом... Похоже, что это говорит, что драйвер на СТ-Линк у меня уже установлен совместно с Кейлом.
Кстати, не хочу рассматривать другую среду разработки. Эта бесплатна для вполне себе большого кода. И вроде как официальна нормальная.
А если не хватит, то мы ее крякнем.
СКАЗОЧНИК писал(а):однако же где-то было написано, что вся программа может быть на Си. Но обработчики прерывания на ассемблере.. Типа, что АРМ Кортекс-М3 не понимает по другому.
Там сказки рассказывали. Проект может быть полностью на C или C++ включая стартап. А может быть на бейсике или паскале, кому как больше нравится.
Есть какая-нибудь школа, методичка, сказка для детей, как работать с этими СТМ32? Так, чтобы занимательно, понятно. Но в то же время не по ардуиновски. Чтобы все же самому можно было туже библиотечку к 1602 ручками сочинить, а не готовую только использовать.