Знакомимся с Artery. AT-START-F423 – пробуем и подключаем дальномер AJ-SR04M

Микросхемы микроконтроллеров от Artery выглядят достаточно интересным вариантом замещения STM. Больше всего подкупают своей доступностью для заказа. Отладок много, собраны качественно, шелкография качественная (по крайней мере на тех, которые я видел и держал в руках). Посмотрим, что производитель предлагает по поддержке со стороны программного обеспечения, драйверов и IDE

Итак, хорошие новости:

  • Документы есть на английском;

  • С сайта достаточно быстро скачивается без всякой регистрации;

  • Все инструменты бесплатные и даже есть полноценная инструкция как собрать свой программатор;

  • Есть паки для Keil и IAR, своя IDE на эклипсе и кодогенератор;

  • Обновления очень регулярные;

  • Для некоторых чипов есть документы с префиксом MG****, которые описывают процесс миграции с STM чипа на их.

Интро

Очевидно, что замена микроконтроллера в рабочем проекте для компании/самозанятого/хобби-разработчика должна быть максимально гладкой, чего можно достичь, если не нужно переразводить, отлаживать и заказывать новую партию плат в давно устоявшийся проект. Для этого используются pin-to-pin (пин-ту-пин) совместимые микросхемы. Речь не только о микроконтроллерах — большое количество китайских микросхем, от менее известных производителей, делается похожими не только по характеристикам и выводам, но и наследует некоторые особенности в названии. Так же и у Artery. AT32F407 задумывался (как мне видится) как замена для популярного STM32F407. Однако, у семейства AT32F407 (в отличие от STM32F407) есть микросхемы в 64 выводном корпусе, но нет в 144 выводном (по крайней мере, во время написания данной заметки)

Все же не стоит ориентироваться только на названия семейства микроконтроллера при выборе — чем заменить. Взаимозаменяемые MCU можно найти из разных семейств — вот, как пример, показана замена STM32F405 на AT32F423

15b37eee9475448a777e99837519c3ee.png

AT32 Work Bench

Первое, что наводит на мысли об STM — это их кодогенератор/проектогенератор CubeMX. Artery не стали отставить в этом плане и сделали свой кодогенератор AT32 Work Bench. Пару месяцев назад для кодогенерации были доступны только два семейства микроконтроллеров — F423 и F421. Буквально на днях (2023/11/28) вышло обновление, которое расширило список семейств до 6 штук — AT32A403A, AT32F403A, AT32F407, AT32F413, AT32F421, AT32F423.

3ddb8693ebce33b1b490157b7b20c29b.png

Интерфейс программы очень сильно напоминает CubeMX, но есть отличия

cb6afd53338d5921a180b4b9c3c6692e.png

Из минусов:

  1. К кодогенератору нужно в отдельном окне нужно подключать .zip-архив с сырцами для данного контроллера

  2. Нет окна с даташитами и RM, которые можно скачать кликом

  3. Отсутствует легкое подключение third-party библиотек

Из плюсов:

  1. Не требует установки и доступа в интернет

  2. Настройка clock-tree такая же как и в CubeMX — удобно

ce44f2ccd6781a115ede1d7c0954b587.png

3. Очень удобное нововведение от Artery — «тайминги» для таймеров пересчитываются прям при настройке таймера!

59021aae7fdc754e4fac23cd1f4c29d5.png

Похожее есть и для CAN. (В прошлом обновлении было и для i2c, но разработчики выпилили)

1028c7bdb3a42a6a072e32e15462cb86.png

4. Генерация проекта, как и в CubeMX, поддерживается для большинства популярных IDE (AT32_IDE, Eclipse, IAR, Keil)

bff99b540e552c562e10bbd76e9f8d62.png

А также, можно генерировать отчет. Достаточно лаконичный, очень симпатичный отчет по всему проекту. С ножками, таймингами и прочим. Вот для примера приложу:

AT32F407VGT7_Скачать

С кодогенератором закончили, перейдем к IDE от Artery

AT32 IDE

Допустим, на предыдущем шаге мы сгенерировали проект и хотим его открыть.

Чтобы открыть проект в AT32 IDE нужно выбрать Open Projects…

6647022b4c241f01449c60e63f1dd792.png

Перейти внутри папки проекта в папку AT32_IDE

a3aebf10edde9f2a1bc7a4263d2ce678.png

Отобразиться наш проект. Осталось нажать Finish

0ac61d2299d76f99970194732ee8e42c.png

В итоге в списке проектов отобразиться наш импортированный проект

5d8c2b1bc7943b4145ebeff2562b8f2f.png

Если же мы не хотим пользоваться кодогенератором, то можно создать проект из AT32 IDE. Жмем New→C/C++ Project

5b4199eba959f3a552b43eacc913c5dc.png

Выбираем C Managed Build, жмем Next

f1935ac5cd0d244eaaa6e34403962101.png

Откроется окно с выбором платформы, выбираем желаемое семейство, вводим имя проекта и жмем Next

0a2c9953fc856e36a4854f2a229a64d4.png

Тут выбираем сам контроллер и выбираем тип отладки. Я выставил SWO. Жмем Next

46507a3a42347c0539d3615545479472.png

В следующем окне, я полагаю, удобная фича — можно настроить названия папок в проекте, если к каким-то определенным уже привыкли и придерживаетесь определенной структуры проекта. Жмем Next

c5a82fe9cae8b3636abdd9a45e2888c3.png

В следующем окне можно сразу настроить конфигурации сборки. Жмем Next

127e7508e21da9e71b6287392841c86f.png

В последнем окне выбираем компилятор (идет с AT32 IDE) и жмем Finish

3bd490f8fad39c305b357f5b449e3689.png

Далее AT32 IDE создаст проект и наполнит его базовыми файлами

a59fb524cdfa078b624c006cd4ff26e9.png

В итоговом проекте есть некоторые отличия, но они незначительны. На мой вкус у кодогенератора получилась более удобная структура для стартового проекта. Далее по тексту, будем работать с проектом из кодогенератора

Попробуем собрать!

Нужно создать конфигурацию запуска. Нажимаем на стрелку и выпадает окно. Жмем New Launch Configuration…

96b9e7889859465b56b4310013362c24.png

Выбираем тип конфигурации и GDB AT-Link Debugging. Жмем Next

286626e79e59efbd74ba197ad567ec97.png

Далее откроется знакомое многим окно конфигурации запуска. Жмем Finish

77ffc29a6998e1e21df70b86fb48d637.png

Осталось выбрать созданную конфигурацию в выпадающем списке и нажать кнопку молотка. Запустится сборка проекта. В консоль будет выводиться информация и сборке

d300237117048c535bb8d9770dbf4530.pngf9305792ef02964e2cb873edb58c752c.png

Если все собралось — отлично, у нас все готово, чтобы продолжить разработку проекта

Пару слов об отладке

Отладка в AT32 IDE работает точно также как и в любой eclipse-based IDE. Есть ограничение на количество точек останова. Описание периферии во вкладке Peripherals чуть более скудное, чем у CubeIDE (SFRs), но вполне удобное.

2302655a17b13045760f863841341dc1.png

Управление ходом программы классическое, расположено вверху

44cc0387d66fb7effae5c23fe5fa04cb.png

Дальномер AJ-SR04M

570c0c63701f3a85181c80dd7f4850d5.png

AJ-SR04M представляет собой сборку с ультразвуковым датчиком дальности. Модуль дальномера может работать в 5 режимах

b71d64905bc2fa3121b311f1ea9fbbbf.png

По-умолчанию включен первый режим — посмотрим на него

c3616adfa5257318791e12ce3f788e22.png

Работает достаточно просто — посылаем сигнал триггера длиной более 10 мкс и ждем сигнал на ножке ECHO, куда будет выдаваться расстояние в виде длительности импульса

Что нужно от микроконтроллера? Один таймер будет в режиме медленного ШИМ генерировать сигнал на вход триггера. Второй будет считать продолжительность сигнала ECHO в микросекундах. Не буду сильно мудрить и сделаю вход от ECHO внешним прерыванием, где буду проверять полярность сигнала и получать время от второго таймера. Полученное время умножаем на скорость звука в воздухе (в см/мксек, что примерно равно 0.034) и делим на два (туда-обратно) — получаем расстояние в сантиметрах. Данные будут отправляться в UART2 на скорости 115200

Для описания ножек и периферии, приложу сгенерированный отчет с AT32 Work Bench (да, понравилось)

AT32F423VCT7_Sonar_Скачать

Подключение у меня получилось следующее:

Подключение модуля УЗ-дальномера

Подключение модуля УЗ-дальномера

UART-USB переходник подключен ко второму UART. Тут используется ножка TX (PA2), которая подключена к TX на переходнике

UART-USB переходник

UART-USB переходник

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

/**
  * @brief  this function handles EXINT Line [15:10] handler.
  * @param  none
  * @retval none
  */
void EXINT15_10_IRQHandler(void)
{
  /* add user code begin EXINT15_10_IRQ 0 */
    static uint32_t val = 0;
    static float distance = 0;
    static char tmp[150] = {0};
    if (gpio_input_data_bit_read(GPIOA, GPIO_PINS_10) == SET){
        tmr_counter_value_set(TMR2, 0);
    }
    else{

        //compute width
        val = tmr_counter_value_get(TMR2);
        distance = val * 0.034 / 2;
        sprintf(tmp, "%d\n\r", (int)distance);
        int i = 0;
        while (tmp[i] != 0){
            if (usart_flag_get(USART2, USART_TDBE_FLAG) == SET){
                usart_data_transmit(USART2, (uint16_t)tmp[i]);
                i++;
            }
        }

    }
    exint_flag_clear(EXINT_LINE_10);
  /* add user code end EXINT15_10_IRQ 0 */
  /* add user code begin EXINT15_10_IRQ 1 */

  /* add user code end EXINT15_10_IRQ 1 */
}

/* add user code begin 1 */

/* add user code end 1 */

Собираем, прошиваем, подключаем и видим следующее

8f3b6e9dc7fb337014dfb3c11cc03fb3.png

Вполне похоже на высоту до потолка с сидячего положения. Точность у сенсора неплохая, но есть ограничения на дальность — как в минимум, так и в максимум

На этом всё, немного познакомились с Artery и AT32, сделали тестовый проект чтобы пощупать их драйвера и IDE. Удачных проектов и экспериментов!

Ссылка на проект:

https://github.com/tunerok/at32f423_AJ-SR04M/tree/main

© Habrahabr.ru