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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Нормальное мнение, можно согласиться.

Любопытно: а есть мнение о том, откуда у профи время на выяснение, кто лучше наизусть 243-ю страницу даташита процитирует?

Добавлено after 52 seconds:
P.S. это другое?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

[uquote="Sergi",url="/forum/viewtopic.php?p=4709292#p4709292"]Я бы заменил TIM_SR_CC3IF на TIM_SR_UIF. Мне так понятнее.[/uquote]
не будет работать. "А так да - шутка юмора."
Хотя сработать сразу и через счет TIM1 может быть важно.
насчет говнокода -- все дружно согласились. насчет того, что он делает -- далеко не все.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

И вас что-то удивляет? Думаете, есть много желающих нырнуть в говно, чтобы нащупать на его дне какие-то секреты?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

ваше отношение понятно.
СпойлерИзображение
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Интересно, когда до вас дойдет, что моё отношение есть квинтэссенция общего отношения новичков к тому, чем вы занимаетесь?! И ваше отношение полностью укладывается в это...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

"отношения новичков.." вечных новичков.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Конечно, вечных. Всю жизнь непрерывно всё пытаешься что-то новое освоить... Догнать прогресс... А он, собака, убегает слишком быстро...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

ARV, вам STM32 интересны, или срач?
Может вам лучше пойти в Мяяяу :) или сразу в Чистилище! :)))
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

давайте я вам еще странного подкину? например, мне иногда начинает действовать на нервы довольно длинное написание всяческих имен и я прибегаю к сокращениям:
Спойлерпереопределяем в укромном месте все или только используемые имена периферии:

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

/* ==== DMA Channel Registers ========= */
#define D11 (*DMA1_Channel1) /* DMA1 Channel 1 (0x40020008)                 */
#define D12 (*DMA1_Channel2) /* DMA1 Channel 2 (0x4002001C)                 */
#define D13 (*DMA1_Channel3) /* DMA1 Channel 3 (0x40020030)                 */
#define D14 (*DMA1_Channel4) /* DMA1 Channel 4 (0x40020044)                 */
#define D15 (*DMA1_Channel5) /* DMA1 Channel 5 (0x40020058)                 */
#define D16 (*DMA1_Channel6) /* DMA1 Channel 6 (0x4002006C)                 */
#define D17 (*DMA1_Channel7) /* DMA1 Channel 7 (0x40020080)                 */

/* ================== Analog/Digital Converters ========= */
#define A1  (*ADC1)          /* ADC1 (0x40012400)                           */
#define A2  (*ADC2)          /* ADC2 (0x40012800)                           */
#define A   (*AFIO)          /* Alternate Function I/O (0x40010000)         */

/* ================== Core System Peripherals =========== */
#define B   (*BKP)           /* Backup Registers (0x40006C00)               */
#define C   (*CRC)           /* CRC Calculation Unit (0x40023000)           */
#define C1  (*CAN1)          /* CAN1 Controller (0x40006400)                */
#define D   (*DBGMCU)        /* Debug MCU (0xE0042000)                      */
#define E   (*EXTI)          /* External Interrupts (0x40010400)            */
#define F   (*FLASH)         /* Flash Memory (0x40022000)                   */

/* === GPIO Port Registers ============ */
#define PA  (*GPIOA)         /* GPIO Port A (0x40010800)                    */
#define PB  (*GPIOB)         /* GPIO Port B (0x40010C00)                    */
#define PC  (*GPIOC)         /* GPIO Port C (0x40011000)                    */
#define PD  (*GPIOD)         /* GPIO Port D (0x40011400)                    */

/* =================== Communication Interfaces ========= */
#define I1  (*I2C1)          /* I2C1 (0x40005400)                           */
#define I2  (*I2C2)          /* I2C2 (0x40005800)                           */
#define I   (*IWDG)          /* Independent Watchdog (0x40003000)           */

/* == Option Byte/Flash =============== */
#define O   (*OB)            /* Option Bytes (0x1FFFF800)                   */

/* ================= Power/RCC/RTC Management =========== */
#define P   (*PWR)           /* Power Control (0x40007000)                  */
#define R   (*RCC)           /* Reset & Clock Control (0x40021000)          */
#define RT  (*RTC)           /* Real-Time Clock (0x40002800)                */

/* == SPI Controllers ================= */
#define S1  (*SPI1)          /* SPI1 (0x40013000)                           */
#define S2  (*SPI2)          /* SPI2 (0x40003800)                           */

/* === Timer Modules ================== */
#define T1  (*TIM1)          /* Timer 1 (0x40012C00)                        */
#define T2  (*TIM2)          /* Timer 2 (0x40000000)                        */
#define T3  (*TIM3)          /* Timer 3 (0x40000400)                        */
#define T4  (*TIM4)          /* Timer 4 (0x40000800)                        */

/* == USB Controller ================== */
#define U   (*USB)           /* USB Device (0x40005C00)                     */

/* =================== USART Controllers ================ */
#define U1  (*USART1)        /* USART1 (0x40013800)                         */
#define U2  (*USART2)        /* USART2 (0x40004400)                         */
#define U3  (*USART3)        /* USART3 (0x40004800)                         */

/* == Watchdog Timers ================= */
#define W   (*WWDG)          /* Window Watchdog (0x40002C00)                */
теперь код может быть слегка компактнее без потери смысла:

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

  if (PA.IDR & 1) {
    T1.PSC = 7999;
    T1.ARR = 999;
    T1.CR1 = 1;
  }
так же можно можно переработать инициализацию и привести ее к виду:

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

  T1.CR1 = (T1_CR1_t){.DIR=1, .OPM=1, .CEN=1}.r;
это эквивалент записи

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

  TIM1->CR1 = TIM_CR1_DIR | TIM_CR_OPM | TIM_CR1_CEN;
ничего особенного, но чуть-чуть короче. и, да, никого ни к чему не призываю. просто напоминаю, что так можно.
Аватара пользователя
smacorp
Друг Кота
Сообщения: 3472
Зарегистрирован: Вт окт 22, 2013 04:37:23
Откуда: Казань

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

Сообщение smacorp »

Бедный тот, кому, возможно, придётся вникать в понаписанное Вами.
Платы для HLDI - установки лазерной засветки фоторезиста.
Фоторезист Ordyl Alpha 350
Жидкое олово для лужения плат (видео) - самое лучшее и только у меня.
Паяльные маски XV501T-4 и KSM-S6189 (5 цветов).
Заказ печатных плат - pcbsmac@gmail.com
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Лучше бы рассказали, чем руководствоваться при выборе варианта работы USART через DMA или традиционно по прерываниям. Например, я анализирую код предшественника и вижу, что USART у него сделан через DMA, хотя какого-то напряженного обмена быть не может, т.к. скорость не выше 115200 и пакеты в среднем 8 байт. В итоге код очень сложный для новичка (меня), т.к. проследить связность сложно, все в разных модулях, и не очевидно, по каким событиям тот или иной код вызывается. В библиотечке modbus, которую я применил, все сделано на прерываниях, и разобраться гораздо проще, тем более, что там все на событиях RTOS. В доке на эту либо говорится, что DMA желательно применять при скоростях больше 115200, хотя обоснования так же нет.
В случае RTOS и упомянутых скоростей еще проще можно вообще поллингом данных в отдельной задаче обойтись, и ничего, имхо, не потерять, а приобрести полную прозрачность кода.

Так что определяет метод работы? Какая логика?

Добавлено after 5 minutes 5 seconds:
Просто в периферии stm32 огромное число разных режимов "можно то и можно это", но не всегда очевидно, для каких задач то или это предпочтительнее.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

[uquote="smacorp",url="/forum/viewtopic.php?p=4711080#p4711080"]Бедный тот, кому, возможно, придётся вникать в понаписанное Вами.[/uquote]
мне кажется вы принижаете когнитивные способности "бедного того". данный простой пример не привносит новые сущности и вникать тут не во что.
смотрим на референс:
Изображение
смотрим на код:

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

T1.CR1 = (T1_CR1_t){.DIR=1, .OPM=1, .CEN=1}.r;
насколько мощно здесь зашифрована суть действия, если учесть, что в правой части выражения находится стандартный для си инициализатор структуры?
Вложения
CR1.PNG
(5.24 КБ) 429 скачиваний
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="smacorp",url="/forum/viewtopic.php?p=4711080#p4711080"]Бедный тот, кому, возможно, придётся вникать в понаписанное Вами.[/uquote]"Что написано Петром, то не вычерпать ведром!" :)))

[uquote="ARV",url="/forum/viewtopic.php?p=4711122#p4711122"]Например, я анализирую код предшественника и вижу, что USART у него сделан через DMA, хотя какого-то напряженного обмена быть не может, т.к. скорость не выше 115200 и пакеты в среднем 8 байт.[/uquote]Причём тут какой-то "напряжённый обмен" и длина пакетов? Если речь о STM32 с их примитивным UART, в котором даже нет FIFO, то даже без некоего "напряжённого обмена" с кадрами любой длины, при скорости 115200 бод, средняя частота прерываний от UART составит 115200/10*2 = ~23кГц. Что может быть слишком много для некоторых применений.
Достаточно если в какой-то момент времени сумма длительностей более приоритетных ISR + запрет прерывания в фоне будет >= ~87 мкс - как тут же получите потерю принимаемых данных. Если будете работать без DMA. А DMA спасёт от этого.

[uquote="ARV",url="/forum/viewtopic.php?p=4711122#p4711122"]Так что определяет метод работы? Какая логика?[/uquote]Написал один раз драйвер UART с DMA и далее пользуюсь им во всех проектах на STM32. Хоть с 921600 бод, хоть с меньшими скоростями. Не переписывая каждый раз. Вот и вся логика. Это лучше, чем под каждый проект ваять и отлаживать заново.

[uquote="ARV",url="/forum/viewtopic.php?p=4711122#p4711122"]все в разных модулях[/uquote]Это странно. У меня весь код драйвера UART - в одном файле (точнее двух = uart.h + uart.cpp). Не знаю - зачем его по разным файлам размазывать?

[uquote="ARV",url="/forum/viewtopic.php?p=4711122#p4711122"]В случае RTOS и упомянутых скоростей еще проще можно вообще поллингом данных в отдельной задаче обойтись[/uquote]Да ладно??? Серьёзно? :shock: А ничего, что частота событий будет ~23 кГц? Совсем не икается? 8)

[uquote="ARV",url="/forum/viewtopic.php?p=4711122#p4711122"]Просто в периферии stm32 огромное число разных режимов "можно то и можно это"[/uquote]В периферии STM32 очень мало разных режимов работы. Очень примитивная периферия. Не видели вы периферии, в которой всего много....
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

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

Сообщение tonyk »

ARV писал(а):пакеты в среднем 8 байт
При работе через DMA я получу одно прерывание в конце пакета, вы- 8. При отправке мне нужно обработать 2 прерывания,вам- 8. Заметьте, что количество прерываний при работе через DMA не зависит от длины пакета. Я уже не говорю о том, что при работе через DMA нет разницы, на какой скорости работает работает UART, 9600 бит/с или 10 Мбит/с.
ARV писал(а):все в разных модулях
Поэтому логично использовать С++, тогда весь код оказывается в одном модуле.
Спойлер

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

// Заголовок


class UART_base : public AbstractTransport, protected IRQ
{
    .......
        //----------------------------------------------------------------------
        //      Читает в буфер buff размером buffSize байты из буфера приёмника.
        //      Работает в неблокирующем режиме!
        //      Возвращает количество прочитанных байт или ноль в случае
        // отсутствия доступных для чтения данных.
        virtual int16
        receive
        (
            void*   buff,
            int16   buffSize,
            MODE    mode        = NON_BLOCK
        ) 
        = 0;

        //----------------------------------------------------------------------
        //      Записывает buffSize байт из буфера buff в буфера передатчика.
        //      Работает в неблокирующем режиме!
        //      Возвращает количество записанных байт или ноль в случае
        // невозможности записи. lastError указывает на ошибку.
        //      Перед вызовом send(..) во избежании склеивания отправляемых
        // посылок, необходимо вызывать getAvailableTxBytes(..) для проверки
        // того, что буфер передатчика пуст.
        virtual int16
        send
        (
            void*   buff,
            int16   buffSize,
            MODE    mode     = NON_BLOCK
        )
        = 0;
    .......
};

//===============
// Реализация.


int16 MB_RTU_UART::send
(
    void*       _buff,
    int16       _buffSize,
    MODE        _mode
)
{
    ....
}


int16 MB_RTU_UART::receive
(
    void*   _buff,
    int16   _buffSize,
    MODE    _mode
)
{
    ....
}


void MB_RTU_UART::IRQ_Handler( void )
{
    if( usart == 0 )
    {
        abort();
    }

    IRQn_Type
        irq = IRQ::getActiveIRQn() ;

    if( irq == IRQn_dma_tx )
    {
        // Обработка прерывания от потока ПДП передатчика.
        ....
    }
    else if( irq == usart_IRQn )
    {
        ....
    }
    else
    {
        // Чушь какая-то. Поймали прерывание, на которое не подписывались.
        // Занавес!
        asm( "nop" );
        abort();
    }
}

ARV писал(а):Лучше бы рассказали, чем руководствоваться при выборе варианта работы USART через DMA или традиционно по прерываниям
Применительно к МК уровня STM32 как раз нетрадиционным способом является приём-отправка одного байта с генерацией прерывания. Да, это возможно, как и наличие по мнению целого ЕС аж 42 гендеров. С ростом тактовой частоты процессоров прерывания становятся очень дорогими в части потери производительности из-за сброса кэшей опережающей выборки. Поэтому весь обмен через UART логично делать с использованием DMA, даже консоль.

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

class ConIO : public MB_RTU_UART, Task
{
};
Обратите внимание, что консоль использует методы приёма-отправки данных из класса Модбас, в котором весь обмен идёт с использованием DMA.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="ARV",url="/forum/viewtopic.php?p=4711122#p4711122"]В случае RTOS и упомянутых скоростей еще проще можно вообще поллингом данных в отдельной задаче обойтись, и ничего, имхо, не потерять, а приобрести полную прозрачность кода.[/uquote]Для новичка полезнее разобраться в работе того, что имеется. А не пытаться перекостыливать работающее хорошее решение, на кривое поделие. Иначе - так навсегда новичком и останется.
Перекостыливание на более простой вариант (потому как "не понимаю как оно работает") - это не развитие, а деградация.

Добавлено after 2 minutes 57 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=4711162#p4711162"]Поэтому логично использовать С++, тогда весь код оказывается в одном модуле.[/uquote]А какая связь? Си или си++ - и то и другое можно в одном модуле написать.

Добавлено after 6 minutes 44 seconds:
[uquote="tonyk",url="/forum/viewtopic.php?p=4711162#p4711162"]Применительно к МК уровня STM32 как раз нетрадиционным способом является приём-отправка одного байта с генерацией прерывания. Да, это возможно, как и наличие по мнению целого ЕС аж 42 гендеров.[/uquote]И как же вы STM32 пользуетесь? Который в этом самом ЕС и разработан? 8)
Почему не чем-то православным? :dont_know:
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

[uquote="jcxz",url="/forum/viewtopic.php?p=4711160#p4711160"]Достаточно если в какой-то момент времени сумма длительностей более приоритетных ISR + запрет прерывания в фоне будет >= ~87 мкс - как тут же получите потерю принимаемых данных.[/uquote]
какой-то притянутый пример. 87мкс на 72мгц -- это что-то в районе 6 тыс инструкций. невозможно понять, кому и зачем может потребоваться такой объем работ при запрещенных прерываниях.
И как же вы STM32 пользуетесь? Который в этом самом ЕС и разработан?
сгущаете. чтобы пользоваться stm32, вовсе не обязательно долбиться куда попало.
Аватара пользователя
JackSmith
Потрогал лапой паяльник
Сообщения: 332
Зарегистрирован: Ср мар 09, 2016 08:07:41

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

Сообщение JackSmith »

[uquote="ARV",url="/forum/viewtopic.php?p=4711122#p4711122"]хотя какого-то напряженного обмена быть не может, т.к. скорость не выше 115200 и пакеты в среднем 8 байт.[/uquote]
здесь скорее всего писал какой-то такой человек:
jcxz писал(а):Написал один раз драйвер UART с DMA и далее пользуюсь им во всех проектах на STM32. Хоть с 921600 бод,
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="a5021",url="/forum/viewtopic.php?p=4711176#p4711176"][uquote="jcxz",url="/forum/viewtopic.php?p=4711160#p4711160"]Достаточно если в какой-то момент времени сумма длительностей более приоритетных ISR + запрет прерывания в фоне будет >= ~87 мкс - как тут же получите потерю принимаемых данных.[/uquote]
какой-то притянутый пример. 87мкс на 72мгц -- это что-то в районе 6 тыс инструкций. невозможно понять, кому и зачем может потребоваться такой объем работ при
запрещенных прерываниях.[/uquote]Научитесь внимательнее читать то, на что отвечаете:
"сумма длительностей более приоритетных ISR + запрет прерывания в фоне."
Что такое "более приоритетные ISR" (более приоритетные чем UART) - понимаете?
Это когда какое-то событие должно быть обработано срочно, с минимальной задержкой.

И это не "в районе 6 тыс инструкций", а как правило - гораздо меньше. Читаем систему команд ARM.

На счёт "притянутости за уши": Обычная RTOS, упоминавшаяся здесь, может запретить прерывания (если критические секции в ней так организованы) на несколько сотен тактов запросто. А некоторые - может быть и более тысячи тактов в каких-то случаях.
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

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

Сообщение Adrift »

[uquote="a5021",url="/forum/viewtopic.php?p=4711156#p4711156"]смотрим на референс:
Изображение
смотрим на код:

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

T1.CR1 = (T1_CR1_t){.DIR=1, .OPM=1, .CEN=1}.r;
насколько мощно здесь зашифрована суть действия, если учесть, что в правой части выражения находится стандартный для си инициализатор структуры?[/uquote]
Пять простых и однобитовых полей - это слишком просто. Покажите свою мощную шифровку на примере SMCR, где у трех полей больше десятка значений )

Изображение
Вложения
tim1.png
(11.35 КБ) 282 скачивания
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

[uquote="jcxz",url="/forum/viewtopic.php?p=4711195#p4711195"]Что такое "более приоритетные ISR" (более приоритетные чем UART) - понимаете?[/uquote]
понимаю я следующее: тому, кто допускает блокирование прерываний на 87мкс, вне зависимости от ситуации, лучше чем-то другим заняться, а не про стм32 рассуждать.. 87мкс в данном контексте -- это архитектурный просёр размером с галактику.
Ответить

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