Например TDA7294

Форум РадиоКот • Просмотр темы - STM32 новичку в ARM что к чему
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср окт 15, 2025 01:43:40

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 8912 ]     ... , , , 445,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 12:41:21 
Потрогал лапой паяльник
Аватар пользователя

Карма: 8
Рейтинг сообщений: 99
Зарегистрирован: Ср сен 02, 2015 07:47:20
Сообщений: 394
Рейтинг сообщения: 0
Странно китайцы с названиями заморачиваются. Получается, "421" у них - тоже Cortex-M0?

А как вам мимикрия, вроде STM32FEBK вместо STM32F103?
Изображение
После подпаивания сброса OpenOCD его видит как 103.


Вложения:
WhatsApp Image 2025-09-22 at 14.37.41.jpg [187.25 KiB]
Скачиваний: 377

_________________
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 1 сентября 2025 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 12:47:33 
Грызет канифоль
Аватар пользователя

Карма: 1
Рейтинг сообщений: 26
Зарегистрирован: Ср мар 09, 2016 08:07:41
Сообщений: 295
Рейтинг сообщения: 0

это перевод от 19-го года вроде. и там речь шла о gigadevice (gd32). а мы говорим о Artery.

Цитата:
$ whois arterychip.com
Domain Name: ARTERYCHIP.COM
Registry Domain ID: 2572664777_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.godaddy.com
Registrar URL: http://www.godaddy.com
Updated Date: 2024-08-28T09:02:48Z
Creation Date: 2020-11-16T07:16:34Z


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 12:52:57 
Открыл глаза
Аватар пользователя

Зарегистрирован: Вт фев 28, 2017 08:13:31
Сообщений: 49
Откуда: Свердловская обл.
Рейтинг сообщения: 0
на платке BluePill сдул STM32F103 и поставил
!!! N32G452CCL7 (Cortex-M4F; 144MHz; 256K/144K; 2xCAN; USB; +++ )

программатором подключился - флешка читается
дальше буду тестировать!

-----
чуть получше N32G455CCL7 - на ОЗОНе
https://www.ozon.ru/product/5-sht-n32g4 ... lWrHmZMWRG


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 13:39:25 
Потрогал лапой паяльник
Аватар пользователя

Карма: 8
Рейтинг сообщений: 99
Зарегистрирован: Ср сен 02, 2015 07:47:20
Сообщений: 394
Рейтинг сообщения: 0
а мы говорим о Artery.

Если у Артерий честная флешка на кристалле, то это только в плюс.

_________________
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 1 сентября 2025 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 14:26:01 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн сен 15, 2025 08:43:23
Сообщений: 169
Рейтинг сообщения: 0
Я все-таки подожду честных отзывов. И если окажется, что прямо вообще один-в-один (т.е. не придется переделывать стартап, заголовочные файлы и тонну сниппетов), можно будет переходить.
А пока - я уже говорил: st-flash не понимает их идентификатора и не может прошить. Возможно, если "пропатчить" и выдать за STM32 этот идентификатор, оно и заработает, но мне на такие эксперименты время тратить не хочется.
Да и запасов STM32 у меня вполне прилично, чипов триста всяких разных, если не больше. Разве что F303 еще побольше прикупить бы. Да исследовать более детально G и H серии, особенно последнюю (правда, там вроде как USB OTG - т.е. все равно придется переделывать USB-сниппет): вдруг там есть что-то интересное. А мне, например, не хватает наличия у МК хотя бы пары десятков таймеров, чтобы 8 были с ШИМ и 8 с "режимом энкодера" (соответственно, корпус будет или 100- или даже 144-ногим; но это не страшно: на пайку 144-ногого я трачу максимум 20 минут).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 16:51:17 
Грызет канифоль
Аватар пользователя

Карма: 1
Рейтинг сообщений: 26
Зарегистрирован: Ср мар 09, 2016 08:07:41
Сообщений: 295
Рейтинг сообщения: 0
А пока - я уже говорил: st-flash не понимает их идентификатора и не может прошить. Возможно, если "пропатчить" и выдать за STM32 этот идентификатор, оно и заработает,
боюсь, что придется писать драйвер работы с флеш-памятью чипа, при полной отсутствии документации для этого дела :)
в Linux Artery прошиваются через: 1)JLink, 2) openocd 3) pyocd

Цитата:
Я все-таки подожду честных отзывов. И если окажется, что прямо вообще один-в-один

если нужно один в один, то следует брать stm32, полагаю это очевидно даже ребенку :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 16:54:16 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн сен 15, 2025 08:43:23
Сообщений: 169
Рейтинг сообщения: 0
JackSmith, ну, если openocd прошивает, то и st-flash, наверное, сможет. Ну или можно просто одну строчку поменять в Makefile, и тоже openocd прошивать (все-таки, в те редкие моменты, когда мне нужна внутрисхемная отладка, я запускаю сервер gdb на openocd, а не на st-util.
Цитата:
если нужно один в один, то следует брать stm32

Ну так выше было сказано, что "артери" - прямо точный клон STM32 по прошивке…


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 17:06:25 
Грызет канифоль
Аватар пользователя

Карма: 1
Рейтинг сообщений: 26
Зарегистрирован: Ср мар 09, 2016 08:07:41
Сообщений: 295
Рейтинг сообщения: 0
Ну или можно просто одну строчку поменять в Makefile, и тоже openocd прошивать

та самая сточка:
Код:
/opt/openocd_at32/bin/openocd-at32 -s "/opt/openocd-at32/share/openocd/scripts"  -f interface/stlink.cfg  -f target/at32f403axx.cfg -c "init" -c "reset halt" -c "flash write_image erase blink.bin 0x08000000" -c "reset" -c "exit"

openocd нужно брать отсюда https://github.com/ArteryTek/openocd

ps прошивка через st-link


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 17:11:43 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн сен 15, 2025 08:43:23
Сообщений: 169
Рейтинг сообщения: 0
Да openocd в репозитории есть - зачем его непонятно откуда качать? Тем более, сборка из live-git чревата, там хотя бы по тегам нужно сливать последнюю stable, а то можно на какой-нибудь еще не улаженный косяк наткнуться.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 17:16:30 
Мучитель микросхем

Карма: 1
Рейтинг сообщений: 47
Зарегистрирован: Вт окт 01, 2024 15:22:33
Сообщений: 449
Рейтинг сообщения: 3
Я все-таки подожду честных отзывов. И если окажется, что прямо вообще один-в-один (т.е. не придется переделывать стартап, заголовочные файлы и тонну сниппетов), можно будет переходить.

Он не один в один, на большинстве китайцев унылая периферия. В частности у этого AT32F421 нет 32-х битных таймеров и SPI без FIFO, т.е. в этом планет он хуже даже F0, а сравнивать следовало бы хотя бы с G0.

linux_rulezz писал(а):
Да исследовать более детально G и H серии, особенно последнюю (правда, там вроде как USB OTG - т.е. все равно придется переделывать USB-сниппет): вдруг там есть что-то интересное

У H5 не OTG, а HOST, как у G0 и младших U5, но это буквально пару лишних бит поверх старого USB, правда там есть и другие отличия, для примера:
Спойлер
Код:
#if defined(STM32G0) || defined(STM32H5)
    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(const 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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 17:50:07 
Сверлит текстолит когтями

Зарегистрирован: Вт ноя 19, 2019 06:10:18
Сообщений: 1246
Рейтинг сообщения: 0
HardWareMan писал(а):
Если у Артерий честная флешка на кристалле, то это только в плюс.

Если соотношение ОЗУ/ПЗУ изменяется, то увы и ах. Хотя флэш всегда честная, правда доступ к ней идёт с двумя циклами ожидания вместо доступа без ожидания, когда код находится в той части флэш, которая не отобразилась на ОЗУ, но это так, мелочи, написанные в сноске мелкими буковками. И всю расчудесную производительность эти МК демонстрируют при исполнении кода из ОЗУ.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 18:31:58 
Потрогал лапой паяльник
Аватар пользователя

Карма: 8
Рейтинг сообщений: 99
Зарегистрирован: Ср сен 02, 2015 07:47:20
Сообщений: 394
Рейтинг сообщения: 0
Хотя флэш всегда честная, правда доступ к ней идёт с двумя циклами ожидания

Это всё равно быстрее, чем с бутербродной QSPI.

_________________
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 1 сентября 2025 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 20:55:00 
Друг Кота

Карма: 20
Рейтинг сообщений: 230
Зарегистрирован: Пт сен 13, 2013 13:11:31
Сообщений: 6452
Рейтинг сообщения: 0
Я все-таки подожду честных отзывов. И если окажется, что прямо вообще один-в-один (т.е. не придется переделывать стартап, заголовочные файлы и тонну сниппетов), можно будет переходить.

на изиэлектрониксе пишут:
Цитата:
По AT32F421k8T7 как замена STM32F030K6T6
Запаяли образцы в наши изделия.
Программатор ST-LINKv2 (и ПО ST-Link Utility) с ними отказался работать , т.к. ID-CODE в регистрах DUBUG модуля имеет другое значение или расположен по другому адресу (для СМ0).
Пришлось применять программатор AT-LINK и ПО этого программатора.
Заливка готовой прошивки (.нех файла ) от проекта для STM показала неработоспособность нашей прошивки для STM
Изучение RM (reference manual) показало, что некоторые модули совсем или неполно совместимы с регистрами модулей STM. ЭТО
USART, ADC, SPI. Базовые адреса модулей и вектора прерываний те же, а регистры модулей отличаются. Для SPI всё совпадает кроме 16 битного режима.
В USART AT нет регистра и прерывания по таймауту (применялся для обнаружения конца MODBUS пакетов) Пришлось для этой цели задействовать дополнительный таймер.
Совпадают (или имеют несущественные для наших проектов- помечены*) следующие модули:
GPIO* - отличия в OSPEEDR – у АТ нет скорости M- средней. У STM 00=L; 01=M; 11=H У AT 00=L; 01=H; 11=L. Для нас несущественно
RCC*- У АТ есть больше значений для управлениями частотами PLL до 300Мгц. В пределах 48 Мгц всё совпадает. Поэтому стартовая функция CMSIS system_stm32f0xx.c для STM работает штатно в АТ.
SYSCFG* (CR1 bits 0&1) управление переносом таблицы прерываний в STM (CM0) пишется и читается. В АТ(СМ4)- только читается. Перенос в АТ возможен через SCB_VTOR (есть в СМ4 и нет в СМ0). Управление EXTI полностью совпадает.
SysTick, NVIC, WDT, TIM3, TIM6,Tim7, TIM14, TIM16, TIM17- отличий не нашел (не пришлось что-то менять в проекте для STM32F030K6T6).

Ядро СМ4, включая системный таймер и прерывания работает с прошивкой для СМ0 без нареканий.
Если в проекте не применяются USART, ADC, SPI (16 битный режим) то возможно прошивка для STM заработает на АТ без доработки (прошивать правда придется родным АТ-Link или J-Link программаторами)

Удалось у АТ найти недокументированную возможность для определения при старте прошивки где она работает? В STM или АТ? Далее запоминаем где работаем и при работе с USART, ADC, SPI работаем с регистрами STM или AT. В Результате удалось разработать универсальную прошивку для наших изделий, которая работает одинаково с AT32F421k8T7 и STM32F030K6T6. Компилировался универсальный проект в KEIL CMSIS (без CUBE и HAL) для STM32F030. Для работы с регистрами АТ создал .h файл описания регистров и битов для АТ USART_AT, ADC_AT, SPI_AT.
Недокументированную возможность следующая:
ID-CODE в СМ4 читается в регистре которого нет в СМ0. DEBUG_IDCODE (адрес 0xE0042000) . Чтение в СМ0 приведет к ошибке.
У СМ0 ID-code читается в DBGMCU->IDCODE (адрес 0x40015800), Для STM030 значение с маcкой 0xfff равно 0x444. Этот адрес в доке у АТ написан как резервный, Но реально там читается без ошибки копия адреса 0xE0042000, те тот же ID_CODE.


вроде бы выходит, что можно взять проект от F030 и минимальными правками адаптировать его для F421. я пошел чуть другим путем и дописал в стиле CMSIS (китайцы почему-то от него отказались) необходимые дифайны, оставив китайские названия регистров:

Спойлер
Код:
/**
 * AT32F421 CRM (Clock and Reset Management) Configuration
 *
 * Purpose: Configure AT32F421 CRM module for system clock and peripheral clocks
 * Features: Supports both internal HICK and external HEXT crystal sources
 * Performance: Optimized with Flash prefetch buffers and auto-step mode
 * Usage: Define HEXT_FREQUENCY (4,8,12,16,20,25) for external crystal or leave
 *        undefined to use internal 4MHz HICK oscillator
 *
 * Configuration Options:
 *   • HICK (default): 4MHz × 30 = 120MHz
 *   • HEXT 4MHz:      4MHz × 30 = 120MHz
 *   • HEXT 8MHz:      8MHz × 15 = 120MHz
 *   • HEXT 12MHz:     12MHz × 10 = 120MHz
 *   • HEXT 16MHz:     16MHz/2 × 15 = 120MHz
 *   • HEXT 20MHz:     20MHz/2 × 12 = 120MHz
 *   • HEXT 25MHz:     25MHz/2 × 10 = 125MHz (Warning: Not exactly 120MHz)
 *
 * Key Features:
 *   ✓ System clock configuration (up to 120MHz)
 *   ✓ Single function to enable all used peripheral clocks
 *   ✓ Automatic PLL multiplication calculation
 *   ✓ Flash wait cycles optimized for high frequency
 *   ✓ Dual prefetch buffers enabled for maximum performance
 *   ✓ Auto-step mode for smooth clock transitions
 *   ✓ Robust timeout handling for all clock operations
 *   ✓ Compile-time configuration validation
 *   ✓ Centralized system clock definitions for all modules
 *
 * Example Usage:
 *   #define HEXT_FREQUENCY 8    // Use 8MHz external crystal
 *   crm_config();               // Configure system clock and enable peripheral clocks
 */

#ifndef CRM_H
#define CRM_H

#include "at32f421.h"

/* Configuration macro - define external crystal frequency to use HEXT */
// #define HEXT_FREQUENCY    8   // External crystal frequency in MHz (uncomment to use HEXT)

/* Timeout values for clock operations - avoid naming conflicts with HAL */
#define CRM_HEXT_TIMEOUT            50000U
#define CRM_PLL_TIMEOUT             50000U
#define CRM_SWITCH_TIMEOUT          50000U

/*******************************************************************************
 * System Clock Definitions - Single Source of Truth
 ******************************************************************************/

/* System clock frequency - depends on crystal configuration */
#if defined(HEXT_FREQUENCY) && (HEXT_FREQUENCY == 25)
    #define SYSTEM_CLOCK_HZ         125000000U  /* 25MHz crystal case */
#else
    #define SYSTEM_CLOCK_HZ         120000000U  /* All other cases: HICK, 4/8/12/16/20MHz crystals */
#endif

/* Derived bus frequencies (all running at system clock speed) */
#define AHB_CLOCK_HZ                SYSTEM_CLOCK_HZ
#define APB1_CLOCK_HZ               SYSTEM_CLOCK_HZ
#define APB2_CLOCK_HZ               SYSTEM_CLOCK_HZ

/* Peripheral clock sources for modules to use */
#define TIMER_CLOCK_HZ              APB1_CLOCK_HZ
#define USART1_CLOCK_HZ             APB2_CLOCK_HZ
#define GPIO_CLOCK_HZ               AHB_CLOCK_HZ

/*******************************************************************************
 * CRM CFG Register Bit Definitions
 ******************************************************************************/

/* System Clock Selection */
#define CRM_CFG_SCLKSEL_Pos         0
#define CRM_CFG_SCLKSEL_Msk         (0x3U << CRM_CFG_SCLKSEL_Pos)
#define CRM_CFG_SCLKSEL_HICK        (0x0U << CRM_CFG_SCLKSEL_Pos)
#define CRM_CFG_SCLKSEL_HEXT        (0x1U << CRM_CFG_SCLKSEL_Pos)
#define CRM_CFG_SCLKSEL_PLL         (0x2U << CRM_CFG_SCLKSEL_Pos)

/* System Clock Status */
#define CRM_CFG_SCLKSTS_Pos         2
#define CRM_CFG_SCLKSTS_Msk         (0x3U << CRM_CFG_SCLKSTS_Pos)
#define CRM_CFG_SCLKSTS_PLL         (0x2U << CRM_CFG_SCLKSTS_Pos)

/* AHB Clock Divider */
#define CRM_CFG_AHBDIV_Pos          4
#define CRM_CFG_AHBDIV_Msk          (0xFU << CRM_CFG_AHBDIV_Pos)
#define CRM_CFG_AHBDIV_1            (0x0U << CRM_CFG_AHBDIV_Pos)

/* APB1 Clock Divider */
#define CRM_CFG_APB1DIV_Pos         8
#define CRM_CFG_APB1DIV_Msk         (0x7U << CRM_CFG_APB1DIV_Pos)
#define CRM_CFG_APB1DIV_1           (0x0U << CRM_CFG_APB1DIV_Pos)

/* APB2 Clock Divider */
#define CRM_CFG_APB2DIV_Pos         11
#define CRM_CFG_APB2DIV_Msk         (0x7U << CRM_CFG_APB2DIV_Pos)
#define CRM_CFG_APB2DIV_1           (0x0U << CRM_CFG_APB2DIV_Pos)

/* PLL Reference Clock Source */
#define CRM_CFG_PLLRCS_Pos          16
#define CRM_CFG_PLLRCS_Msk          (0x1U << CRM_CFG_PLLRCS_Pos)
#define CRM_CFG_PLLRCS_HICK         (0x0U << CRM_CFG_PLLRCS_Pos)
#define CRM_CFG_PLLRCS_HEXT         (0x1U << CRM_CFG_PLLRCS_Pos)

/* HEXT Clock Divider for PLL */
#define CRM_CFG_PLLHEXTDIV_Pos      17
#define CRM_CFG_PLLHEXTDIV_Msk      (0x1U << CRM_CFG_PLLHEXTDIV_Pos)
#define CRM_CFG_PLLHEXTDIV_1        (0x0U << CRM_CFG_PLLHEXTDIV_Pos)
#define CRM_CFG_PLLHEXTDIV_2        (0x1U << CRM_CFG_PLLHEXTDIV_Pos)

/* PLL Multiplication Factor (split across two bit fields) */
#define CRM_CFG_PLLMULT_L_Pos       18      /* Low bits [21:18] - 4 bits */
#define CRM_CFG_PLLMULT_L_Msk       (0xFU << CRM_CFG_PLLMULT_L_Pos)
#define CRM_CFG_PLLMULT_H_Pos       29      /* High bits [30:29] - 2 bits */
#define CRM_CFG_PLLMULT_H_Msk       (0x3U << CRM_CFG_PLLMULT_H_Pos)

/*******************************************************************************
 * CRM CTRL Register Bit Definitions
 ******************************************************************************/

/* HEXT Control */
#define CRM_CTRL_HEXTEN_Pos         16
#define CRM_CTRL_HEXTEN             (0x1U << CRM_CTRL_HEXTEN_Pos)
#define CRM_CTRL_HEXTSTBL_Pos       17
#define CRM_CTRL_HEXTSTBL           (0x1U << CRM_CTRL_HEXTSTBL_Pos)

/* PLL Control */
#define CRM_CTRL_PLLEN_Pos          24
#define CRM_CTRL_PLLEN              (0x1U << CRM_CTRL_PLLEN_Pos)
#define CRM_CTRL_PLLSTBL_Pos        25
#define CRM_CTRL_PLLSTBL            (0x1U << CRM_CTRL_PLLSTBL_Pos)

/*******************************************************************************
 * CRM MISC2 Register Bit Definitions
 ******************************************************************************/

/* Auto-step Mode Control */
#define CRM_MISC2_AUTO_STEP_EN_Pos  4
#define CRM_MISC2_AUTO_STEP_EN_Msk  (0x3U << CRM_MISC2_AUTO_STEP_EN_Pos)
#define CRM_MISC2_AUTO_STEP_EN      (0x3U << CRM_MISC2_AUTO_STEP_EN_Pos)

/*******************************************************************************
 * CRM Peripheral Clock Enable Register Bit Definitions
 ******************************************************************************/

/* AHB Peripheral Clock Enable */
#define CRM_AHBEN_GPIOAEN_Pos       17
#define CRM_AHBEN_GPIOAEN           (0x1U << CRM_AHBEN_GPIOAEN_Pos)

/* APB1 Peripheral Clock Enable */
#define CRM_APB1EN_TMR14EN_Pos      8
#define CRM_APB1EN_TMR14EN          (0x1U << CRM_APB1EN_TMR14EN_Pos)

/* APB2 Peripheral Clock Enable */
#define CRM_APB2EN_USART1EN_Pos     14
#define CRM_APB2EN_USART1EN         (0x1U << CRM_APB2EN_USART1EN_Pos)

/*******************************************************************************
 * Flash PSR Register Bit Definitions
 ******************************************************************************/

/* Flash Wait Cycles */
#define FLASH_PSR_WTCYC_Pos         0
#define FLASH_PSR_WTCYC_Msk         (0x7U << FLASH_PSR_WTCYC_Pos)
#define FLASH_PSR_WTCYC_3           (0x3U << FLASH_PSR_WTCYC_Pos)

/* Flash Prefetch Control */
#define FLASH_PSR_PFT_EN_Pos        4
#define FLASH_PSR_PFT_EN            (0x1U << FLASH_PSR_PFT_EN_Pos)     /* Main prefetch enable */
#define FLASH_PSR_PFT_EN2_Pos       6
#define FLASH_PSR_PFT_EN2           (0x1U << FLASH_PSR_PFT_EN2_Pos)    /* Prefetch buffer block 2 enable */

/*******************************************************************************
 * PLL Configuration Based on Clock Source
 ******************************************************************************/

#ifdef HEXT_FREQUENCY
  /* HEXT PLL configurations for different crystal frequencies targeting ~120MHz */
  #if HEXT_FREQUENCY == 4
    /* 4MHz HEXT -> 120MHz: 4MHz × 30 = 120MHz */
    #define PLL_MULT_FACTOR         30
    #define CRM_CFG_PLLRCS_SEL      CRM_CFG_PLLRCS_HEXT
    #define CRM_CFG_PLLHEXTDIV_SEL  CRM_CFG_PLLHEXTDIV_1
  #elif HEXT_FREQUENCY == 8
    /* 8MHz HEXT -> 120MHz: 8MHz × 15 = 120MHz */
    #define PLL_MULT_FACTOR         15
    #define CRM_CFG_PLLRCS_SEL      CRM_CFG_PLLRCS_HEXT
    #define CRM_CFG_PLLHEXTDIV_SEL  CRM_CFG_PLLHEXTDIV_1
  #elif HEXT_FREQUENCY == 12
    /* 12MHz HEXT -> 120MHz: 12MHz × 10 = 120MHz */
    #define PLL_MULT_FACTOR         10
    #define CRM_CFG_PLLRCS_SEL      CRM_CFG_PLLRCS_HEXT
    #define CRM_CFG_PLLHEXTDIV_SEL  CRM_CFG_PLLHEXTDIV_1
  #elif HEXT_FREQUENCY == 16
    /* 16MHz HEXT/2 -> 120MHz: 8MHz × 15 = 120MHz */
    #define PLL_MULT_FACTOR         15
    #define CRM_CFG_PLLRCS_SEL      CRM_CFG_PLLRCS_HEXT
    #define CRM_CFG_PLLHEXTDIV_SEL  CRM_CFG_PLLHEXTDIV_2
  #elif HEXT_FREQUENCY == 20
    /* 20MHz HEXT/2 -> 120MHz: 10MHz × 12 = 120MHz */
    #define PLL_MULT_FACTOR         12
    #define CRM_CFG_PLLRCS_SEL      CRM_CFG_PLLRCS_HEXT
    #define CRM_CFG_PLLHEXTDIV_SEL  CRM_CFG_PLLHEXTDIV_2
  #elif HEXT_FREQUENCY == 25
    /* 25MHz HEXT/2 -> 125MHz: 12.5MHz × 10 = 125MHz */
    #define PLL_MULT_FACTOR         10
    #define CRM_CFG_PLLRCS_SEL      CRM_CFG_PLLRCS_HEXT
    #define CRM_CFG_PLLHEXTDIV_SEL  CRM_CFG_PLLHEXTDIV_2
    #warning "25MHz crystal results in 125MHz system clock (not exactly 120MHz)"
  #else
    #error "Unsupported HEXT frequency. Supported: 4, 8, 12, 16, 20, 25 MHz"
  #endif

  /* Calculate PLL multiplication factor encoding for HEXT */
  #define CRM_CFG_PLLMULT_L      (((PLL_MULT_FACTOR - 2) & 0x0F) << CRM_CFG_PLLMULT_L_Pos)
  #define CRM_CFG_PLLMULT_H      (((PLL_MULT_FACTOR - 2) >> 4) << CRM_CFG_PLLMULT_H_Pos)
#else
  /* HICK PLL configuration: 4MHz × 30 = 120MHz */
  #define PLL_MULT_FACTOR        30
  #define CRM_CFG_PLLMULT_L      (0xEU << CRM_CFG_PLLMULT_L_Pos)  /* Low 4 bits: 1110 */
  #define CRM_CFG_PLLMULT_H      (0x1U << CRM_CFG_PLLMULT_H_Pos)  /* High 2 bits: 01 */
  /* Note: PLLRCS = 0 (HICK) and PLLHEXTDIV = 0 by default, no need to OR with 0 */
#endif

/**
 * @brief Configure CRM system clock and enable all used peripheral clocks
 *
 * System Clock Configuration:
 * - System clock target = SYSTEM_CLOCK_HZ (120MHz or 125MHz for 25MHz crystal)
 * - System clock source = PLL
 * - AHB divider         = 1 (HCLK = SCLK)
 * - APB2 divider        = 1 (PCLK2 = SCLK)
 * - APB1 divider        = 1 (PCLK1 = SCLK)
 * - Auto-step mode      = enabled (recommended for >108MHz)
 * - Flash wait cycles   = 3
 * - Flash prefetch      = enabled (both buffers)
 *
 * Enabled Peripheral Clocks:
 * - GPIOA  (for PA4, PA9, PA10)
 * - TMR14  (for PWM output)
 * - USART1 (for serial communication)
 */
void crm_config(void);

#endif /* CRM_H */


Код:
/**
 * AT32F421 CRM (Clock and Reset Management) Implementation
 */

#include "crm.h"

/**
 * @brief Configure CRM system clock and enable all used peripheral clocks
 */
void crm_config(void) {
    uint32_t timeout;

#ifdef HEXT_FREQUENCY
    /* Step 0: Enable and wait for HEXT (external crystal) to stabilize */
    CRM->ctrl |= CRM_CTRL_HEXTEN;
    timeout = CRM_HEXT_TIMEOUT;
    while (!(CRM->ctrl & CRM_CTRL_HEXTSTBL)) {
        if (--timeout == 0) {
            /* HEXT failed to stabilize - handle error */
            return;
        }
    }
#endif

    /* Step 1: Configure PLL multiplication factor and source in CFG register */
    CRM->cfg = CRM_CFG_PLLMULT_L |          /* PLL multiplication factor - low bits */
#ifdef HEXT_FREQUENCY
               CRM_CFG_PLLRCS_SEL |         /* PLL source selection (HEXT) */
               CRM_CFG_PLLHEXTDIV_SEL |     /* HEXT divider */
#endif
               CRM_CFG_PLLMULT_H;           /* PLL multiplication factor - high bits */

    /* Step 2: Enable PLL */
    CRM->ctrl |= CRM_CTRL_PLLEN;

    /* Step 3: Wait for PLL to become ready */
    timeout = CRM_PLL_TIMEOUT;
    while (!(CRM->ctrl & CRM_CTRL_PLLSTBL)) {
        if (--timeout == 0) {
            /* PLL failed to lock - handle error */
            return;
        }
    }

    /* Step 4: Enable auto-step mode for smooth clock switching (>108MHz) */
    CRM->misc2 |= CRM_MISC2_AUTO_STEP_EN;

    /* Step 5: Configure Flash for high-frequency operation with prefetch enabled */
    FLASH->psr = FLASH_PSR_WTCYC_3 |        /* 3 wait cycles for high frequency */
                 FLASH_PSR_PFT_EN |         /* Enable main prefetch buffer */
                 FLASH_PSR_PFT_EN2;         /* Enable prefetch buffer block 2 */

    /* Step 6: Switch system clock to PLL */
    CRM->cfg |= CRM_CFG_SCLKSEL_PLL;

    /* Step 7: Wait for system clock switch to complete */
    timeout = CRM_SWITCH_TIMEOUT;
    while ((CRM->cfg & CRM_CFG_SCLKSTS_Msk) != CRM_CFG_SCLKSTS_PLL) {
        if (--timeout == 0) {
            /* Clock switch failed - handle error */
            return;
        }
    }

    /* Step 8: Disable auto-step mode after successful switch */
    CRM->misc2 &= ~CRM_MISC2_AUTO_STEP_EN_Msk;

    /* Step 9: Enable all peripheral clocks used in this project */
    CRM->ahben |= CRM_AHBEN_GPIOAEN;        /* Enable GPIOA clock */
    CRM->apb1en |= CRM_APB1EN_TMR14EN;      /* Enable TMR14 clock */
    CRM->apb2en |= CRM_APB2EN_USART1EN;     /* Enable USART1 clock */
}



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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн сен 22, 2025 21:29:57 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн сен 15, 2025 08:43:23
Сообщений: 169
Рейтинг сообщения: 0
a5021, я всякими калокубами и SPL не пользуюсь, не страшно. А вот что интересно: неужто китайцы не выложили заголовочные файлы со всеми этими регистрами?
В случае STM32 вообще на гитхабе лежат подборки подо все семейства (оттуда я их и таскаю), остается лишь сишный стартап написать и маленький линкер-файл с описанием размеров флеша и оперативки (иногда еще бывает CCRAM, но я пока не дошел до ее использования); а из этого линкер-файла инклюдится основной, общий для всех семейств (там у меня размечены свободные области - отдельно для хранения настроек и отдельно для логов, или только для настроек).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Вт сен 23, 2025 19:14:07 
Друг Кота

Карма: 20
Рейтинг сообщений: 230
Зарегистрирован: Пт сен 13, 2013 13:11:31
Сообщений: 6452
Рейтинг сообщения: 0
с регистрами выложили, только регистры они почему-то стали именовать в малыми буквами. Например, регистр статуса у блока CRM называется ctrlsts, а если мы хотим обращаться к битовым полям, то запись становится и вовсе вырвиглазной: CRM->ctrlsts_bit.lickstbl = 0. ArteryTek написали что-то вроде SPL, где все регистры дергают через битовые поля. с полями все хорошо и к ним есть все нужные дифайны, но вот дифайнов в стиле CMSIS они не приложили. я сначала попробовал писать код с записью в битовые поля, но стало получаться довольно громоздко. если прямая записью в регистр (в духе STM32) это одна операция присваивания, то в случае битовых полей -- несколько. не понравилось. показалось проще дифайны нужные добавить.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Вт сен 23, 2025 19:43:36 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 462
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1698
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
... CRM->ctrlsts_bit.lickstbl = 0.

Все есть в этих программных кодах. Возможно, чтобы МК не были похожи друг на друга :)
В APM32 то же самое: RCM->APB2CLKEN_B.PAEN = BIT_SET; Поменяли имена. Беспорядок. Особенно интересно xxx_B :).
Привыкаешь после первого часа, но поначалу это сбивает с толку. (+транслейт)

Спойлер
Код:
    /* APB2 clock enable register */
    union
    {
        __IOM uint32_t APB2CLKEN;

        struct
        {
            __IOM uint32_t AFIOEN          : 1;
            __IM  uint32_t RESERVED1       : 1;
            __IOM uint32_t PAEN            : 1;
            __IOM uint32_t PBEN            : 1;
            __IOM uint32_t PCEN            : 1;
            __IOM uint32_t PDEN            : 1;
            __IOM uint32_t PEEN            : 1;
            __IOM uint32_t PFEN            : 1;
            __IOM uint32_t PGEN            : 1;
            __IOM uint32_t ADC1EN          : 1;
            __IOM uint32_t ADC2EN          : 1;
            __IOM uint32_t TMR1EN          : 1;
            __IOM uint32_t SPI1EN          : 1;
            __IOM uint32_t TMR8EN          : 1;
            __IOM uint32_t USART1EN        : 1;
            __IOM uint32_t ADC3EN          : 1;
            __IM  uint32_t RESERVED2       : 16;
        } APB2CLKEN_B;
    };


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Вс окт 12, 2025 19:47:47 
Друг Кота

Карма: 20
Рейтинг сообщений: 230
Зарегистрирован: Пт сен 13, 2013 13:11:31
Сообщений: 6452
Рейтинг сообщения: 0
у apm32 и stm32 довольно высокая степень подобия и совместимость на уровне бинарей. в этом смысле не вижу целесообразности вообще заглядывать в родные библиотеки apm32.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Вс окт 12, 2025 21:19:24 
Нашел транзистор. Понюхал.
Аватар пользователя

Зарегистрирован: Пн сен 15, 2025 08:43:23
Сообщений: 169
Рейтинг сообщения: 0
a5021, все-таки, стоит сначала документацию сравнить. Вдруг какие-то регистры или флаги различаются? Чтобы потом не сидеть непонимающе: в коде все ОК, gdb показывает, что все ОК, а периферия работает не так, как надо (или вообще не работает).
Цитата:
RCM->APB2CLKEN_B.PAEN = BIT_SET;

У, какая замечательная китайщина! Т.е. они думают, что если побитно будут выставлять флажки в регистре, то gcc это все в одну инструкцию соберет! Видимо, что значит volatile, они не догадываются…
Ну и, тем паче, если это делается не через битбанг (в чем я тоже сильно сомневаюсь), то каждая подобная инструкция на самом деле выльется в три: чтение-модификация-запись. Уж лучше сразу, по-классике:
Код:
RCM->APB2CLKEN_B = PAEN | PBEN | ...;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Вс окт 12, 2025 21:29:45 
Говорящий с текстолитом

Карма: 25
Рейтинг сообщений: 462
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1698
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Даже не GCC, а Keil с его компилятор ARMCLANG.

Попробовал скомпилированный код, работает в обоих направлениях: APM2F103CBT6 <-> STM32F103CBT6
Входы/выходы, работа с выводами, прерывания, таймеры, HSE, I2C ...
Как будто одинаковые. А для APM 96 MHz заявляют? И оба работали всю ночь на частоте 128 MHz в разгоне :).
Даже не знаю, что у меня МК есть (оригинал или фейк). Наконец-то куплю хотя бы один "оригинал" (напр. STM32F103) из "за океном", чтобы было с чем сравнивать :).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32 новичку в ARM что к чему
СообщениеДобавлено: Пн окт 13, 2025 08:25:22 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2544
Рейтинг сообщения: 0
Уж лучше сразу, по-классике:
Код:
RCM->APB2CLKEN_B = PAEN | PBEN | ...;
Больше чем уверен, что там структура с битовыми полями определена параллельно с обычным 32-битным регистром и что-то типа RCM->APB2CLKEN = PAEN | PBEN | ...; будет работать. Как хочешь (надо в конкретном случае) так и пользуйся.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 8912 ]     ... , , , 445,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y