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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

ARV писал(а):без всяких апгрейдов и т.п.?
Что-то вас совсем не пойму.
IAR не подходит, хотя V1 поддерживает.
Eclipse CubeIDE подходит, но V1 не поддерживает.
CoIDE тот же самый eclipse ему не подходит, хотя V1 поддерживает.

Хотя IAR по возможностям отладки куда лучше, поддерживает оба языка С и С++, но до eclipse IARу далеко, за-то работает из коробки без всяких танцев с бубном и прочей виртуальной лабуды, на поиграться хватит, а может и еще на что.
Реклама
Это не хвост, это антенна
Сообщения: 1379
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Сообщение tonyk »

КРАМ писал(а):ДМА блокирует исполнение кода в части доступа к ОЗУ
Не всегда. Для этого делают несколько банков ОЗУ, причём к некоторым у DMA может не быть доступа. Тут уже нужно смотреть, в каком банке буфер какой периферии размещать.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 26041
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="tonyk",url="/forum/viewtopic.php?p=4349731#p4349731"]Не всегда. Для этого делают несколько банков ОЗУ[/uquote]
Это общеизвестно. Но привязка каналов ДМА к определенным сегментам, во-первых, есть только у самых старших МК, а во вторых частенько ограничивает возможности ее использования в конкретной задаче.
Еще в приснопамятных dsPIC33FJ для решения этой проблемы ДМА привязывали к фиксированной области памяти и делали эту область двухпортовой. Тоже решение.... :tea:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18809
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4349725#p4349725"]
ARV писал(а):без всяких апгрейдов и т.п.?
Что-то вас совсем не пойму.
IAR не подходит, хотя V1 поддерживает.
Eclipse CubeIDE подходит, но V1 не поддерживает.
CoIDE тот же самый eclipse ему не подходит, хотя V1 поддерживает.

Хотя IAR по возможностям отладки куда лучше, поддерживает оба языка С и С++, но до eclipse IARу далеко, за-то работает из коробки без всяких танцев с бубном и прочей виртуальной лабуды, на поиграться хватит, а может и еще на что.[/uquote]про CoIDE я ничего не говорил.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4349725#p4349725"]Что-то вас совсем не пойму.[/uquote]Всё просто. Если задача не сделать, а найти причину не делать - результат очевиден.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Этот DMAMUX - просто жесть какая-то. Пробую отправлять через DMA. Настраиваю USART, DMA и DMAMUX:

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

void usart3_setup(){
    RCC->IOPENR |= RCC_IOPENR_GPIODEN; // enable PD
    RCC->AHBENR |= RCC_AHBENR_DMA1EN; // enable DMA1
    // set PD8 and PD9 as AF
    GPIOD->MODER = (GPIOD->MODER & ~(GPIO_MODER_MODE8 | GPIO_MODER_MODE9))
            | GPIO_MODER_MODER8_AF | GPIO_MODER_MODER9_AF;
    // AF0 for USART3 @ PD8/PD9
    GPIOD->AFR[1] = GPIOD->AFR[1] & ~(GPIO_AFRH_AFSEL8 | GPIO_AFRH_AFSEL9);
    // enable USART3 clocking
    RCC->APBENR1 |= RCC_APBENR1_USART3EN;
    // baudrate 115200
    USART3->BRR = 640000 / 1152;
    // eol character: '/n'
    USART3->CR2 = USART_CR2_ADD_VAL('\n');
    // charmatch interrupt, enable transmitter and receiver, enable usart
    USART3->CR1 = /*USART_CR1_CMIE |*/ USART_CR1_TE | USART_CR1_RE | USART_CR1_UE;
    // enable DMA transmission
    USART3->CR3 = USART_CR3_DMAT;
    // set up DMA channels: 2 - Tx, 3 - Rx
    // Tx channel: mem++, mem->periph, 8bit, compl.&err. irq
    DMA1_Channel2->CCR = DMA_CCR_MINC | DMA_CCR_DIR | DMA_CCR_TCIE | DMA_CCR_TEIE;
    DMA1_Channel2->CPAR = (uint32_t) &USART3->TDR; // peripherial address
    // set up DMAMUX channels: 55 - USART3_TX, 54 - USART3_RX
    DMAMUX1_Channel2->CCR = 55;
    DMAMUX1_RequestGenerator2->RGCR = DMAMUX_RGxCR_GE; // enable
    NVIC_EnableIRQ(USART3_4_IRQn);
    NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
}
Далее у меня там где-то буфер заполняется, а потом отправляется:

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

void usart3_sendbuf(){
    if(!txrdy || txlen[tbufno] == 0) return;
    // set up DMA
    DMA1_Channel2->CMAR = (uint32_t)&tbuf[tbufno];
    DMA1_Channel2->CNDTR = txlen[tbufno];
    USART3->ICR |= USART_ICR_TCCF; // clear TC flag
    txrdy = 0;
    // activate DMA
    DMA1_Channel2->CCR |= DMA_CCR_EN;
    tbufno = !tbufno; // swap buffers
    txlen[tbufno] = 0;
}
Про очистку флага TC в мануале было.
Ну и прерывание DMA:

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

// ch2 - Tx, ch3 - Rx
void dma1_channel2_3_isr(){
    if(DMA1->ISR & (DMA_ISR_TCIF2 | DMA_ISR_TEIF2)){ // transfer complete or error
        DMA1->IFCR = DMA_IFCR_CTCIF2 | DMA_IFCR_CTEIF2; // clear flags
        txrdy = 1;
    }
}
И фигвам! Не пашет, собака!!! Я уж искал, где тактирование DMAMUX включить, но такого ключика не заметил. И таки как люди с этим работают?
Что интересно, в интернетах вообще не нашел никаких примеров кода - все быдлокодят на калокубе!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18809
Зарегистрирован: Чт дек 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.
А можете небольшое видео снять, как это выглядит на деле.
Это не хвост, это антенна
Сообщения: 1379
Зарегистрирован: Вт ноя 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 писал(а):А смысл?
Охота в реальности увидеть, как это там усе происходит.
Ответить

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