Перейти к содержанию

Знакомимся с 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, но есть отличия

Из минусов:

  1. К кодогенератору нужно в отдельном окне нужно подключать .zip-архив с сырцами для данного контроллера
  2. Нет окна с даташитами и RM, которые можно скачать кликом
  3. Отсутствует легкое подключение third-party библиотек

Из плюсов:

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

Удобно можно посмотреть список периферии, который подключен к именно этой шине:

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

Похожее есть и для CAN

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. Удачных проектов и экспериментов!

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

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

Comment

programel