ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
3 июля
1248890 Топик полностью
shan (11.10.2022 20:29, просмотров: 753) ответил mr-x на Было жеж
Про AT32F421k8T7 (СМ4) от Артери как замена STM32F030K6T6 и STM32F051K6T6 (СМ0): 

Запаяли образцы AT32F421k8T7 в наши изделия. Программатор 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 до 120Мгц. В пределах 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/051К6Е6. Компилировался универсальный проект в KEIL CMSIS (без CUBE и HAL) для STM32F030. Для работы с регистрами АТ подправил .h файл описания регистров и битов для АТ USART_AT, ADC_AT, SPI_AT. и далее компилировал проект с условным выполнением кода для STM или AT как проект для DEVICE STM32F030.

Недокументированную возможность следующая: ID-CODE в СМ4 читается в регистре которого нет в СМ0. DEBUG_IDCODE (адрес 0xE0042000) . Чтение в СМ0 приведет к ошибке. У СМ0 ID-code читается в DBGMCU->IDCODE (адрес 0x40015800), Для STM030 значение с маcкой 0xfff равно 0x444. Этот адрес в доке у АТ написан как резервный, Но реально там читается без ошибки копия адреса 0xE0042000, те тот же ID_CODE.

at32f421_usart.h

at32f421_adc.h