STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

1. DMA1_Channel2 привязан к DMAMUX1_Channel1. Нумерация у них разная.
2. RequestGenerator тебе не нужен.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

VladislavS, о, спасибо! Я и не обратил внимания, что у MUX с нуля нумерация, а у DMA - с единицы. Вот же засранцы!
О RequestGenerator понял. Получил одну передачу, но прерывание не отработало. Это уж буду смотреть, где я накосячил.
А, все просто: я забыл в функции usart3_sendbuf() вставить строчку

Код: Выделить всё

DMA1_Channel2->CCR &= ~DMA_CCR_EN;
в самом начале - иначе настройки не прокатывают же.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Eddy_Em, ну вот зачем все эти

Код: Выделить всё

DMA1_Channel2->CCR &= ~DMA_CCR_EN; 
DMA1_Channel2->CCR |= DMA_CCR_EN;
Можно же проще сделать

Код: Выделить всё

void Send_USART2_DMA(uint32_t cnt)
{    
  uint32_t ccr = _VAL2FLD(DMA_CCR_MSIZE,0) | _VAL2FLD(DMA_CCR_PSIZE,0) | DMA_CCR_DIR | DMA_CCR_MINC;
  DMA1_Channel1->CCR = ccr;
  DMA1_Channel1->CNDTR = cnt;
  DMA1_Channel1->CCR = ccr | DMA_CCR_EN;
}
Задефайнить ccr константой или сделать параметром шаблона это уже тонкости реализации, но смысл в том что это константная часть, которую ты сам же раньше и задал. Зачем её вычитывать из DMA чтобы добавить один-два бита?
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

VladislavS, вроде как классика ☺
Но да, согласен, так лучше - не нужно лишних операций проводить.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4349809#p4349809"]

Код: Выделить всё

USART3->BRR = 640000 / 1152;
[/uquote]
Вот это я понимаю оптимизация, целых четыре нолика сократил :) На С++ я бы так написал:

Код: Выделить всё

USART3->BRR = (64_MHz + 115'200 / 2) / 115'200;
И результат, кстати, будет 556, а не 555, как у тебя.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Reflector, 115'200 - это макрос что ли? Зачем там апостроф?
Ну, а разница между 555 и 556 невелика, ничего страшного - работает же.
С помощью всех собравшихся, особенно Владислава, таки получилось. USART полностью на DMA (и Tx, и Rx). Конец строки - как обычно - '\n'. В случае переполнения буфера возвращается флаг, что предыдущее сообщение пошло коту под хвост.
P.S. Кстати, в Cortex-M0+ ведь тоже деление не завезли! Уныло, однако. Уж флоаты-то почти никогда не нужны на МК, а вот деление!..
Теперь, пожалуй, еще I2C прикручу к G070, да на этом пока удовлетворюсь. Надо еще какую-нибудь железяку с полноценным SPI прикупить, чтобы SPI тестировать, а то у меня все, что есть - MOSI only.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4349883#p4349883"]115'200 - это макрос что ли? Зачем там апостроф?[/uquote]
Обычный разделитель, будет и в С23. А 64_MHz - это строковый литерал, по сути константа, задается следующим образом:

Код: Выделить всё

consteval uint32_t operator "" _MHz(unsigned long long val) { return val * 1'000'000; }
Eddy_Em писал(а):Ну, а разница между 555 и 556 невелика, ничего страшного - работает же.
Здесь невелика, а для других частот и скоростей может и 1% получится. Или тебе парочки инструкций жалко?

Добавлено after 2 minutes 35 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4349883#p4349883"]Надо еще какую-нибудь железяку с полноценным SPI прикупить, чтобы SPI тестировать, а то у меня все, что есть - MOSI only.[/uquote]
Соедини SPI1 с SPI2 и тестируй :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Reflector, ну, ОК, для красоты и точности:

Код: Выделить всё

#define USART_BRR(speed)    ((64000000 + speed/2) / speed)
...
USART3->BRR = USART_BRR(115200);
Добавлено after 40 seconds:
Соедини SPI1 с SPI2 и тестируй :)
Для этого сначала надо убедиться, что оно работает в обе стороны ☺
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4349762#p4349762"][uquote="Dimon456",url="/forum/viewtopic.php?p=4349725#p4349725"]Что-то вас совсем не пойму.[/uquote]Всё просто. Если задача не сделать, а найти причину не делать - результат очевиден.[/uquote]
почти угадали: нет задачи, которую надо решить, есть желание чем-то занять свободное время с пользой. но совсем не хочется потратить его впустую в борьбе с ПО, если существует вариант обойтись без этого. я скорее заставляю себя ковырять ARM, нежели испытываю острое желание это делать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

ARV, ну вот, коль времени свободного полно - как раз в кайф будет изучить с нуля. Написать Makefile, сделать стартап, линкер под себя написать…
А IDE - это уже последнее, о чем стоит думать. Отлаживать крайне удобно в консоли при помощи gdb. Хотя я все еще считаю отладку нафиг ненужной штукой, но когда вот так, как я, тупишь: смотришь в свой говнокод и очевидных косяков не видишь - да, отладка может помочь. Но, с другой стороны, если ты - не раззвиздяй, как я, то отладчик тебе никогда не понадобится.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Eddy_Em писал(а):отладчик тебе никогда не понадобится
Давайте тогда и протеус удалим, и будем методом тыка, типа работает не работает, как в старые добрые времена.
Eddy_Em писал(а):Отлаживать крайне удобно в консоли при помощи gdb.
А можете небольшое видео снять, как это выглядит на деле.
Это не хвост, это антенна
Сообщения: 1337
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Сообщение tonyk »

Reflector, ну, ОК, для красоты и точности:
Код:
#define USART_BRR(speed) ((64000000 + speed/2) / speed)
...
USART3->BRR = USART_BRR(115200);
Это отнюдь не "ОК". А дробная часть (досчёт) в UART у G0 отсутствует? Её почему не вычисляешь? И тупо вписывать частоту как-то нехорошо, впрочем, как и делитель для шины. Так-то в CMSIS есть SystemCoreClock, и код делителя для шины тоже должен быть в регистрах конфигурации.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4349977#p4349977"]Давайте тогда и протеус удалим[/uquote]
Я без понятия, что это и зачем оно нужно. И вообще, мастдайки у меня на домашних и рабочих компьютерах уже не меньше 15 (а то и всех 20) лет нет!
А можете небольшое видео снять, как это выглядит на деле.
А смысл? Тупо пишешь "b function" - добавил брейк, "watch var" - добавил трассировку изменения переменной (таким образом, кстати, можно еще, как у убогого сеггера, выводить отладочные сообщения и прочую лабуду), ^C - остановил выполнение, "s" - перешел на шаг, "p /x var" - отобразил переменную в 16-ной форме и т.д., и т.п. Все вполне легко и непринужденно делается. И мыша вообще не нужна.
Но я сам отладку стал лишь последние пару недель использовать, когда совсем уж последние мозги пробухал и просто внимательно свой же код читать уже не мог. Если вылечусь, то все будет хорошо, и дебаггер мне больше никогда не понадобится.

Добавлено after 4 minutes 24 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=4349985#p4349985"]Это отнюдь не "ОК". А дробная часть (досчёт) в UART у G0 отсутствует?[/uquote]
Никогда про такое не слышал. Разве где-то такое бывает, чтобы частоту "неровно" делили? В любом случае, погрешность в пределах 5% от скорости для UART'а — вообще ни о чем! Там критическая погрешность где-то с 10% начинается.
Так-то в CMSIS есть SystemCoreClock
А мне-то какое дело? Я вообще не смотрю, что там "внутри" есть. Я только макросы использую, да настройку systick. Об этой переменной впервые слышу!
И да: если сюда записать вместо констант или макросов переменную, то будет лишняя операция деления. Мелочь, а неприятно. Тут вон, Владислав за лишние операции чтения и логических и/или переживал, а то такая адово длинная дичь, как софтовое деление!!!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Eddy_Em писал(а):А смысл?
Охота в реальности увидеть, как это там усе происходит.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Dimon456, дык, а самому попробовать - слабо что ли?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Это не хвост, это антенна
Сообщения: 1337
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Сообщение tonyk »

Eddy_Em писал(а):Никогда про такое не слышал.
А ты не слушай, а читай документацию.
Вложения
Screenshot_454.jpg
(66.62 КБ) 37 скачиваний
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="tonyk",url="/forum/viewtopic.php?p=4349985#p4349985"]А дробная часть (досчёт) в UART у G0 отсутствует? Её почему не вычисляешь?[/uquote]
Если оверсемплинг равен 16, то она на автомате вычисляется.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

tonyk, у меня оверсемплинг равен 16. Нафиг его вообще в 8 ставить?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Это не хвост, это антенна
Сообщения: 1337
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Сообщение tonyk »

Eddy_Em писал(а):Я вообще не смотрю, что там "внутри" есть
Вылезай из анального огорода и посмотри вокруг, особенно на то, что уже сделано другими.
Eddy_Em писал(а):И да: если сюда записать вместо констант или макросов переменную, то будет лишняя операция деления. Мелочь, а неприятно. Тут вон, Владислав за лишние операции чтения и логических и/или переживал, а то такая адово длинная дичь, как софтовое деление!!!
В твоих проектах катастрофическая нехватка ПЗУ?
Настройка UART делается не часто, поэтому даже софтовое деление погоды не сделает, зато один раз разобрался, вдумчиво написал, чтобы потом просто перекидывать код из одного проекта в другой. Если не ошибаюсь, то такой же UART и в G4, H7 и, вроде, F7.

Добавлено after 1 minute 45 seconds:
Eddy_Em писал(а):Нафиг его вообще в 8 ставить?
В других UART это удваивает скорость обмена.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Мне 10Мбод от уарта не нужно.
Что до "вбивания гвоздями" этих чисел, то у меня-то абсолютно все проекты абсолютно одинаково тактируются. Если там есть HSI48, тактирование от него идет, если нет - от кварца 8МГц. Да и вообще, давненько уже я не делал железяк, на которых бы не было USB. Даже если они должны работать на CAN-шине, то USB используется для конфигурации и отладки (да и просто глянуть, что за пакеты в сети бегают: воткнул смартфон в USB, да смотри себе).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Ответить

Вернуться в «ARM»