Stm32 с чего начать изучение...

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

Re: Stm32 с чего начать изучение...

Сообщение ARV »

Немного не понимаю обработку прерываний в FreeRTOS.

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

void EXTI2_3_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI2_3_IRQn 0 */
	
  BaseType_t xHigherPriorityTaskWoken;
  xHigherPriorityTaskWoken = pdFALSE;

  vTaskNotifyGiveFromISR(Main_TaskHandle, &xHigherPriorityTaskWoken);
	
  /* USER CODE END EXTI2_3_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(MARKER_LINE_Pin);
  /* USER CODE BEGIN EXTI2_3_IRQn 1 */

  portYIELD_FROM_ISR( xHigherPriorityTaskWoken );

  /* USER CODE END EXTI2_3_IRQn 1 */
}
не очень понятно, необходим ли вызов HAL_GPIO_EXTI_IRQHandler или достаточно portYIELD_FROM_ISR?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Stm32 с чего начать изучение...

Сообщение Adrift »

[uquote="ARV",url="/forum/viewtopic.php?p=4792005#p4792005"]не очень понятно, необходим ли вызов HAL_GPIO_EXTI_IRQHandler или достаточно portYIELD_FROM_ISR?[/uquote]
Как думаете, какая из этих функций pending флаги EXTI сбрасывает?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Stm32 с чего начать изучение...

Сообщение ARV »

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

Мой уютный бложик... заходите!
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Stm32 с чего начать изучение...

Сообщение Adrift »

ARV, я ни с HAL дела не имею, ни с FreeRTOS, но достаточно очевидно, что portYIELD_FROM_ISR можно будет увидеть и в обработчиках другой периферии, потому он ничего про флаги EXTI не знает, а сбрасывать их нужно, вот HAL_GPIO_EXTI_IRQHandler этим и занимается.
Rapra
Грызет канифоль
Сообщения: 259
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Stm32 с чего начать изучение...

Сообщение Rapra »

portYIELD_FROM_ISR вызовет принудительное переключение с текущей задачи.
Функция HAL_GPIO_EXTI_IRQHandler, насколько помню, производит сброс флага прерыавния и вызов пользовательской фунции-обработчика прерывания (Callback-функция).
В любом случае, если не сбросить флаг текущего прерывания, то после выхода из него снова активируется это же самое прерывание.
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Stm32 с чего начать изучение...

Сообщение Adrift »

Грядут новые STM32H5E/F, первые STM32 c Programmable logic array (PLAY).
The programmable logic array allows the user to create custom logic and state machines
without the need for external programmable logic devices, such as FPGAs. The PLAY
provides a number of programmable logic elements, in the form of look-up tables (LUTs),
each of which have four inputs and one output. The output can be programmed to be any
logical function of the four inputs. More complex functions can be created by cascading logic
elements.
Inputs to and outputs from the logic array can be selected from a choice of external I/Os,
internal signals or software programmable register bits. External inputs can be synchronized
to the internal clock and filtered to remove short pulses, or connected directly to the logic
array if purely combinatorial or asynchronous functions are required.

Each logic element output can be registered using the internal clock, or another signal.
Registered outputs can be fed back to the logic array inputs to create finite state machines.
Изображение

Помимо этого завезли 1.5MB SRAM, LTDC, новый DMA2D с масштабированием, OTG_HS c PHY, ОУ, кеши в 2 раза увеличили и т.д....
Вложения
play.png
(53.9 КБ) 454 скачивания
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25117
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Stm32 с чего начать изучение...

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

[uquote="Adrift",url="/forum/viewtopic.php?p=4792613#p4792613"]первые STM32 c Programmable logic array....[/uquote]
Не прошло и 8 лет, как Зоркий Глаз STM обратила внимание на микрочиповские CLC, купив, наконец, соответствующие IP-блоки (возможно, что у Микрочипа)... :)))
ЗЫ. By the way.
Эта новость "серпом по йайцам" тру-программеров, которые половину кода посвящают возможному порту проекта на любые чипы... :music:
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Stm32 с чего начать изучение...

Сообщение VladislavS »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4792685#p4792685"]Эта новость "серпом по йайцам" тру-программеров[/uquote]Фигню какую-то пишете. Как это вообще связано? У меня куча кода работает в FPGA на софтовом процессоре и ничего. А тут слегка LUT-ов накакали, что они поменяют?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25117
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Stm32 с чего начать изучение...

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

[uquote="VladislavS",url="/forum/viewtopic.php?p=4792724#p4792724"]У меня куча кода работает в FPGA на софтовом процессоре и ничего. А тут слегка LUT-ов накакали, что они поменяют?[/uquote]
Три раза "ха".
ЧТД.
Аппаратные модули, типа обсуждаемого, для вас - это маргинальные и непереносимые решения.
А на самом деле они нужны для скоростных сигналов, чтобы исключить внешнюю логику.
Софтовыми способами это не реализуется.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Stm32 с чего начать изучение...

Сообщение VladislavS »

И что это меняет в парадигме программирования?
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25117
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Stm32 с чего начать изучение...

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

Непереносимость кода на другие чипы.
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Stm32 с чего начать изучение...

Сообщение Adrift »

Продолжает просачиваться инфа про STM32C5... Похоже как и у C0/U3 не будет PLL, вместо него 144MHz HSI который при делении на 3 дает 48MHz для USB/FDCAN. Также нет BKPSRAM, значит скорее всего все запитано от одного источника, как у С0, и в Standby/Shutdown RTC работать не будет... Зато есть упоминания про EEPROM.
Аватара пользователя
sunjob
Вымогатель припоя
Сообщения: 611
Зарегистрирован: Ср дек 08, 2010 19:03:17

Re: Stm32 с чего начать изучение...

Сообщение sunjob »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4791678#p4791678"]цены на Artery в России очень красивые[/uquote]
день добрый
посмотрел цены в борзом чиппо-диппе, и действительно, даже там цены очень интересные.
от себя можете прокомментировать? как замена стм-кам как оно? как оно вообще? ну на сколько хватит желания, распишите?!
спасибо
Енот - это кот, только инкогнито!
p.s. держитесь обоими руками, а то прорвет...
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25117
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Stm32 с чего начать изучение...

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

[uquote="sunjob",url="/forum/viewtopic.php?p=4794259#p4794259"]как оно вообще?[/uquote]
Оно вообще отлично. :)
На замену STM32F407 на AT32F407 ушло пять рабочих дней. Включая небольшую коррекцию печатной платы - ремап периферии слегка отличается от STM - УАРТ переносится полностью, а не индивидуально Tx и Rx. Нет внешней блокировки внутреннего регулятора питания ядра и еще какая то непринципиальная мелочь типа перемычки.
Вся правка кода свелась к переписыванию инициализации и драйверов по формальным основаниям. Названия бит не совпадают, хотя почти вся периферия идентична STM за исключением DMA/ В DMA есть отличия, но они удобные. Например flexible реквестов. То есть источники реквестов не привязаны к каналам DMA. Есть незначительные отличия в ADC.
Клонов STM32 нет. Совпадение номеров не означает клон.
В настоящее время у меня все серийные проекты переведены на Artery. Использовались всего три чипа - AT32F421, AT32F407 и AT32F435. Документация по качеству ничем от документации STM не отличается.
Старшие чипы (407, 435, 437 и т.д.) имеют достаточно большой программный кэш и соответственно при средних размерах кода он весь гарантировано попадет в WS=0.
Пишу код в Keil. Отладчик Jlink 8.
Основное отличие SDK - все регистры периферии определены как битовые структуры и потому маски в хедерах не определены.
SPL у них называется BSP и содержит почти такой же, как у STM набор функций.
Как то так...
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: Stm32 с чего начать изучение...

Сообщение linux_rulezz »

А я вот ковыряюсь с STM32G0B1. 128кБ ОЗУ — это вообще поразительно для Cortex-M0 (не представляю, что такого нужно там на нем напрограммить, чтобы это ОЗУ использовать! Ладно бы, был Cortex-M4…). И для USB аж 2кБ ОЗУ, причем честные 2кБ (а не как у "младших" 303 или 103, где фактически только половина памяти используется). Правда, сходу USB у меня не заработал: хардфолт в прерывании, ну, почитаю документацию: видимо, адреса буферов перенесли, засранцы…
Windows must die!
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Stm32 с чего начать изучение...

Сообщение Adrift »

[uquote="sunjob",url="/forum/viewtopic.php?p=4794259#p4794259"]посмотрел цены в борзом чиппо-диппе, и действительно, даже там цены очень интересные.[/uquote]
Я когда году в 2013-м купил первый STM32, простенький 20-ти ногий F0, там уже SPI с FIFO был, а если вы посмотрите на флагмана от Artery, то там FIFO нет ни в SPI, ни в USART, ни в DMA. У старенького STM32F4 DMA уже более новый, правда тогда еще DMAMUX не было. Т.е. если сравнивать Artery с F4, будет где-то лучше, где-то хуже, а если сравнивать с чем-то современным и схожим по производительности, типа STM32H5, то это вообще не сравнимые вещи, не только по периферии, но я новые ядра Artery тоже еще не осилил. Касательно документации... Документация на китайские мк всегда хуже, если, для примера, возьмем тот же AT32F407 DMA, где уже интегрирован DMAMUX, то в RM описание занимает 16 страниц, а такой же DMA у STM32 + DMAMUX занимает 38. Дополнительно для STM32 можно списать аппноуты практически на всю периферию, иногда по несколько на каждую. Плюс есть книги, "STM32 Online Training" со слайдами и видео, наконец "STM32 Workshop" на youtube канале ST. Для Artery в разделе "Application Note" я вижу 4 документа один из которых Errata, для STM32H5 таковых 64 и Errata тужа даже не входит.

Добавлено after 9 minutes 14 seconds:
[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4794402#p4794402"]Правда, сходу USB у меня не заработал: хардфолт в прерывании, ну, почитаю документацию: видимо, адреса буферов перенесли, засранцы…[/uquote]
Там все несколько сложнее ) Надергал у себя основные отличия:
Спойлер

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

#if defined(STM32F3)
using PmaWidth = uint32_t;  // F1/F3
#else
using PmaWidth = uint16_t;  // G4/F0/L0
#endif

#ifdef STM32G0
static auto USB = USB_DRD_FS;

static constexpr uint32_t USB_EP_CTR_RX     = USB_EP_VTRX;
static constexpr uint32_t USB_EP_CTR_TX     = USB_EP_VTTX;
static constexpr uint32_t USB_ISTR_EP_ID    = USB_ISTR_IDN;
static constexpr uint32_t USB_EPREG_MASK    = USB_CHEP_REG_MASK;
static constexpr uint32_t USB_EPTX_DTOGMASK = USB_CHEP_TX_DTOGMASK;
static constexpr uint32_t USB_EPRX_DTOGMASK = USB_CHEP_RX_DTOGMASK;
static constexpr uint32_t USB_CNTR_FSUSP    = USB_CNTR_SUSPEN;
static constexpr uint32_t USB_CNTR_LPMODE   = USB_CNTR_SUSPRDY;
static constexpr uint32_t USB_PMAADDR       = USB_DRD_PMAADDR;
static constexpr uint32_t USB_CNTR_FRES     = USB_CNTR_USBRST;
#else
struct EpBufDesc
{
    volatile PmaWidth addrTx;
    volatile PmaWidth countTx;
    volatile PmaWidth addrRx;
    volatile PmaWidth countRx;
};
#endif

#ifdef STM32G0
	static auto pmaBuf(uint32_t epNum) { return USB_DRD_PMA_BUFF + epNum; }
	
    static volatile uint32_t& epnr(uint32_t epNum) { return (&USB->CHEP0R)[epNum]; }

    static void setTxAddr(uint32_t epNum, uint32_t addr) { ModifyReg(pmaBuf(epNum)->TXBD, ~USB_PMA_TXBD_ADDMSK, addr); }
    static void setTxCnt(uint32_t epNum, uint32_t count) { ModifyReg(pmaBuf(epNum)->TXBD, ~USB_PMA_TXBD_COUNTMSK, count << 16); }

    static void setRxAddr(uint32_t epNum, uint32_t addr) { ModifyReg(pmaBuf(epNum)->RXBD, ~USB_PMA_RXBD_ADDMSK, addr); }
    static void setRxCnt(uint32_t epNum)                 { ModifyReg(pmaBuf(epNum)->RXBD, ~USB_PMA_RXBD_COUNTMSK, 0x8400'0000); }

    static uint32_t getTxCnt(uint32_t epNum) { return (pmaBuf(epNum)->TXBD >> 16) & 0x03FF; }

    static uint32_t getRxCnt(uint32_t epNum)
    {
        volatile uint32_t count = 10;

        while (count > 0) count = count - 1;    // WA: few cycles for RX PMA descriptor to update

        return (pmaBuf(epNum)->RXBD >> 16) & 0x03FF;
    }
#else
	static auto pmaBuf(uint32_t epNum) { return (EpBufDesc*)USB_PMAADDR + epNum; }
	
    static volatile uint16_t& epnr(uint32_t epNum) { return (&USB->EP0R)[epNum * 2]; }

    static void setTxAddr(uint32_t epNum, uint32_t addr) { pmaBuf(epNum)->addrTx  = addr; }
    static void setTxCnt(uint32_t epNum, uint32_t count) { pmaBuf(epNum)->countTx = count; }

    static void setRxAddr(uint32_t epNum, uint32_t addr) { pmaBuf(epNum)->addrRx  = addr; }
    static void setRxCnt(uint32_t epNum)                 { pmaBuf(epNum)->countRx = 0x8400; }  // 64 байта

    static uint32_t getTxCnt(uint32_t epNum) { return pmaBuf(epNum)->countTx & 0x3FF; }
    static uint32_t getRxCnt(uint32_t epNum) { return pmaBuf(epNum)->countRx & 0x3FF; }
#endif

#ifdef STM32G0
    static void writePma(uint8_t* buf, uint32_t pmaBufAddr, uint32_t length)
    {
        auto pVal = (volatile uint32_t*)(USB_DRD_PMAADDR + pmaBufAddr);

        for (uint32_t words = length / 4; words != 0; words--)
        {
            *pVal++ = unalignedRead<uint32_t>(buf);
            buf += 4;
        }

        if (uint32_t bytes = length % 4; bytes != 0)
        {
            uint32_t val = 0;
            buf += bytes;

            while (bytes--)
            {
                val = (val << 8) | *(--buf);
            }

            *pVal = val;
        }
    }
#else
    static void writePma(uint8_t* buf, uint32_t pmaBufAddr, uint32_t length)
    {
        static constexpr uint32_t pmaAccess = sizeof(PmaWidth) / 2;
        auto pVal = (volatile uint16_t*)(USB_PMAADDR + pmaBufAddr * pmaAccess);

        for (uint32_t i = (length + 1) / 2; i != 0; i--)
        {
            *pVal = buf[0] | (buf[1] << 8);
            buf  += 2;
            pVal += pmaAccess;
        }
    }
#endif

#ifdef STM32G0
    static void readPma(uint8_t* buf, uint32_t pmaBufAddr, uint32_t length)
    {
        auto pVal = (volatile uint32_t*)(USB_DRD_PMAADDR + pmaBufAddr);

        for (uint32_t words = length / 4; words != 0; words--)
        {
            unalignedWrite<uint32_t>(buf, *pVal++);
            buf += 4;
        }

        uint32_t val = *pVal;

        for (uint32_t bytes = length % 4; bytes--;)
        {
            *buf++ = uint8_t(val);
            val >>= 8;
        }
    }
#else
    static void readPma(uint8_t* buf, uint32_t pmaBufAddr, uint32_t length)
    {
        static constexpr uint32_t pmaAccess = sizeof(PmaWidth) / 2;
        auto pVal = (volatile uint16_t*)(USB_PMAADDR + pmaBufAddr * pmaAccess);

        for (uint32_t i = length / 2; i != 0; i--)
        {
            unalignedWrite<uint16_t>(buf, *pVal);
        	buf += 2;
            pVal += pmaAccess;
        }

        if (length % 2) *buf = uint8_t(*pVal);
    }
#endif
Еще при инициализации для G0 нужно добавить:

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

USB->BTABLE = 0;
PWR->CR2 |= PWR_CR2_USV;  // USB supply enable
Последний раз редактировалось Adrift Ср мар 04, 2026 09:12:57, всего редактировалось 1 раз.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Stm32 с чего начать изучение...

Сообщение Аlex »

linux_rulezz писал(а):А я вот ковыряюсь с STM32G0B1
Прекрасные процы. Сделал на них пару переходников USB-RS485
СпойлерИзображение
IMG_20260304_085804.jpg
(722.73 КБ) 237 скачиваний
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Stm32 с чего начать изучение...

Сообщение Adrift »

[uquote="Аlex",url="/forum/viewtopic.php?p=4794409#p4794409"]Прекрасные процы.[/uquote]
Надеюсь STM32C5 на M33 заменит их окончательно и про M0+ можно будет забыть )
Аватара пользователя
linux_rulezz
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Пн сен 15, 2025 08:43:23
Откуда: Маленький СССР посреди шариатской республики

Re: Stm32 с чего начать изучение...

Сообщение linux_rulezz »

static auto USB = USB_DRD_FS;
Вот, именно в этом у меня и может быть ошибка, т.к. я по-старинке сделал так (в коде, который работает на F0x2, F103 и F303:

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

#define USB_BTABLE_BASE         0x40006000
#define USB                     ((USB_TypeDef *) USB_BASE)
Видимо, на сей раз адрес другой.
USB->BTABLE = 0;
У G0B1 ведь нет этого регистра - там "reserved".
PWR->CR2 |= PWR_CR2_USV;
Спасибо, вот на это бы ни разу не наткнулся сам… Странно, что у меня и без включения питания прерывание RESET отрабатывало.
Сделал на них пару переходников USB-RS485
Дороговато как-то, на STM32F103 дешевле всего выходит — все-таки, это не CAN, где обязательно F0 или прочие более дорогие серии использовать.
А я себе на F303 "многоинтерфейсную" плату сделал (3 RS-485, 2 RS-232, 1 CAN, 1 SSI). Жаль, у STM8 лишь 8 конечных точек USB, а то можно было бы еще сильней разгуляться (скажем, в последней для конфигурационного интерфейса пришлось жертвовать SSI: либо SSI, либо снимаешь перемычку и получаешь /dev/multiportCFG0 вместо того, что используешь для обозначения SSI-интерфейса — поля iInterface можно менять, они во флеш-памяти сохраняются). Но в 303 так мало памяти для буферов USB… А вот G0B1 с его 2кБ — просто класс! Разве что Cortex-M0+, где даже деления нет, не говоря уж о флоатах…
Windows must die!
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Stm32 с чего начать изучение...

Сообщение Adrift »

[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4794413#p4794413"]
USB->BTABLE = 0;
У G0B1 ведь нет этого регистра - там "reserved".[/uquote]
Да, все наоборот, я просто когда выдергивал искал "#ifdef STM32G0", а в данном случае был #ifndef )
Ответить

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