Знакомимся с 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
AT32 Work Bench
Первое, что наводит на мысли об STM – это их кодогенератор/проектогенератор CubeMX. Artery не стали отставить в этом плане и сделали свой кодогенератор AT32 Work Bench. Пару месяцев назад для кодогенерации были доступны только два семейства микроконтроллеров – F423 и F421. Буквально на днях (2024/02/01) вышло обновление, которое расширило список семейств до 11 штук – AT32F402, AT32A403A, AT32F403A, AT32F405, AT32F407, AT32F413, AT32WB415, AT32WB415, AT32F421, AT32F423, AT32F425.
Интерфейс программы очень сильно напоминает CubeMX, но есть отличия
Из минусов:
К кодогенератору нужно в отдельном окне нужно подключать .zip-архив с сырцами для данного контроллера
Нет окна с даташитами и RM, которые можно скачать кликом
Отсутствует легкое подключение third-party библиотек
Из плюсов:
Не требует установки и доступа в интернет
Настройка clock-tree такая же как и в CubeMX – удобно
3. Очень удобное нововведение от Artery – "тайминги" для таймеров пересчитываются прям при настройке таймера!
Похожее есть и для CAN. (В прошлом обновлении было и для i2c, но разработчики выпилили)
4. Генерация проекта, как и в CubeMX, поддерживается для большинства популярных IDE (AT32_IDE, Eclipse, IAR, Keil)
А также, можно генерировать отчет. Достаточно лаконичный, очень симпатичный отчет по всему проекту. С ножками, таймингами и прочим. Вот для примера приложу:
С кодогенератором закончили, перейдем к IDE от Artery
AT32 IDE
Допустим, на предыдущем шаге мы сгенерировали проект и хотим его открыть.
Чтобы открыть проект в AT32 IDE нужно выбрать Open Projects…
Перейти внутри папки проекта в папку AT32_IDE
Отобразиться наш проект. Осталось нажать Finish
В итоге в списке проектов отобразиться наш импортированный проект
Если же мы не хотим пользоваться кодогенератором, то можно создать проект из AT32 IDE. Жмем New->C/C++ Project
Выбираем C Managed Build, жмем Next
Откроется окно с выбором платформы, выбираем желаемое семейство, вводим имя проекта и жмем Next
Тут выбираем сам контроллер и выбираем тип отладки. Я выставил SWO. Жмем Next
В следующем окне, я полагаю, удобная фича – можно настроить названия папок в проекте, если к каким-то определенным уже привыкли и придерживаетесь определенной структуры проекта. Жмем Next
В следующем окне можно сразу настроить конфигурации сборки. Жмем Next
В последнем окне выбираем компилятор (идет с AT32 IDE) и жмем Finish
Далее AT32 IDE создаст проект и наполнит его базовыми файлами
В итоговом проекте есть некоторые отличия, но они незначительны. На мой вкус у кодогенератора получилась более удобная структура для стартового проекта. Далее по тексту, будем работать с проектом из кодогенератора
Попробуем собрать!
Нужно создать конфигурацию запуска. Нажимаем на стрелку и выпадает окно. Жмем New Launch Configuration…
Выбираем тип конфигурации и GDB AT-Link Debugging. Жмем Next
Далее откроется знакомое многим окно конфигурации запуска. Жмем Finish
Осталось выбрать созданную конфигурацию в выпадающем списке и нажать кнопку молотка. Запустится сборка проекта. В консоль будет выводиться информация и сборке
Если все собралось – отлично, у нас все готово, чтобы продолжить разработку проекта
Пару слов об отладке
Отладка в AT32 IDE работает точно также как и в любой eclipse-based IDE. Есть ограничение на количество точек останова. Описание периферии во вкладке Peripherals чуть более скудное, чем у CubeIDE (SFRs), но вполне удобное.
Управление ходом программы классическое, расположено вверху
Дальномер AJ-SR04M
AJ-SR04M представляет собой сборку с ультразвуковым датчиком дальности. Модуль дальномера может работать в 5 режимах
По-умолчанию включен первый режим – посмотрим на него
Работает достаточно просто – посылаем сигнал триггера длиной более 10 мкс и ждем сигнал на ножке ECHO, куда будет выдаваться расстояние в виде длительности импульса
Что нужно от микроконтроллера? Один таймер будет в режиме медленного ШИМ генерировать сигнал на вход триггера. Второй будет считать продолжительность сигнала ECHO в микросекундах. Не буду сильно мудрить и сделаю вход от ECHO внешним прерыванием, где буду проверять полярность сигнала и получать время от второго таймера. Полученное время умножаем на скорость звука в воздухе (в см/мксек, что примерно равно 0.034) и делим на два (туда-обратно) – получаем расстояние в сантиметрах. Данные будут отправляться в UART2 на скорости 115200
Для описания ножек и периферии, приложу сгенерированный отчет с AT32 Work Bench (да, понравилось)
Подключение у меня получилось следующее:
UART-USB переходник подключен ко второму UART. Тут используется ножка TX (PA2), которая подключена к TX на переходнике
Т.к. проект будет стартовый и ничего больше происходить на контроллере не будет, позволю себе сделать продолжительное действие в прерывании от ножки 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 */
Собираем, прошиваем, подключаем и видим следующее
Вполне похоже на высоту до потолка с сидячего положения. Точность у сенсора неплохая, но есть ограничения на дальность – как в минимум, так и в максимум.
На этом всё, немного познакомились с Artery и AT32, сделали тестовый проект чтобы пощупать их драйвера и IDE. Удачных проектов и экспериментов!