В разработке оказалось несколько устройств в составе которых кроме прочего планируется использовать F030F6P6. Они маленькие и достаточно производительные. Для мониторинга вполне достаточно. Программист я так себе, занимаюсь в основном железом. Но пощупать некоторые функции приходится, и тогда на помощь приходит Arduino IDE.

Эх, даже флюс не отмыл
Эх, даже флюс не отмыл

STM32G030F6P6

32х битный МК на ядре CORTEX M0+ , доступен в корпусах SO8, TSSOP20, LQFP32. В этой статье речь пойдет о втором варианте.
В линейке есть версии от 32 до 64кб флэш. Оперативной памяти у всех 8кб.
Рабочая частота до 64МГц, но в корпусе TSSOP20 доступно только внешнее либо внутреннее тактирование. Использовать кварц возможности нет.
Куча интерфейсов, таймеров и прочих плюшек, как и бывает у STM. Впрочем подробнее вы можете посмотреть в даташите.

И такое бывает...

Иногда такое случается, что в процессе отладки появляются сюрпризы. Например у ESP32 при использовании модема не работает второй порт АЦП. У STM32 подобных недоразумений я не встречал, но бывает что перепутаешь ногу, и окажется вдруг например что ШИМ на него повесить нельзя. Это может стать большой проблемой, если устройство уже начали готовить к серии, а может даже заказали производство плат. К тому-же отладка тех же БП, если управление на МК, без хотя бы какой-то тестовой прошивки невозможна.

Так вот наиболее быстро написать тестовую прошивку можно в Arduino IDE. Способствует этому большое количество поддерживаемых архитектур и бесконечное множество доступных библиотек.

Есть конечно готовые модули на том же алиэкспресс. Но не всегда есть возможность ждать, да и собрать такую небольшую плату не составляет труда, и не отнимает много времени.

От слов к делу

Для тестов именно этого МК я нарисовал простейшую схему и плату. Как бы я не любил кварцевые резонаторы, в данном корпусе этот вид тактирования недоступен. А значит и обвязки у нас 6 элементов- 2 конденсатора по питанию, безопасный USART1, подтяжка на Reset и на BOOT0.

Схема
Схема

Скомпоновано это в форм-фактор рассчитанный на установку в беспаечную макетную плату. Рисунок платы кстати можно использовать как шпаргалку по портам.

Плата
Плата
После ЛУТа
После ЛУТа

Программирование

В конкретно данном случае мне было необходимо проверить работу датчика температуры DS18B20 на порту PA5.
Настройки среды остались стандартные.
Ядро используется самое распространенное Arduino Core STM32.
Программирование по SWD при помощи ST Link. Не забудьте установить прошивальщик, к нему будет обращаться Arduino IDE при прошивке.

При программировании STM32 из Arduino IDE есть конечно свои нюансы. Например для UART нужно назначать пины явно, особенно в тех случаях когда он может мультиплексироваться.

Тут например пришлось заглянуть в файл PeripheralPins.c

#ifdef HAL_UART_MODULE_ENABLED
WEAK const PinMap PinMap_UART_TX[] = {
  {PA_2,   USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)},
  {PA_9_R, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)},
  {PA_14,  USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)},
  {PB_6,   USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART1)},
  {NC,     NP,     0}
};
#endif

#ifdef HAL_UART_MODULE_ENABLED
WEAK const PinMap PinMap_UART_RX[] = {
  {PA_3,    USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)},
  {PA_10_R, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)},
  {PA_15,   USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)},
  {PB_7,    USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART1)},
  {NC,      NP,     0}
};
#endif

Т.к. 1 нога нашего МК может назначаться как PB7 или PB8, а 20я- PB3/PB4/PB5 или PB7, то взглянув в этот файлик можно понять что маппинг будет выглядеть так:

HardwareSerial Serial1(PB7,PB6);

Код для работы с датчиком был позаимствован здесь. Итого на копипасту прошивки и легкую подгонку ушло минут 10-15. А отладочная плата мне пригодится и в будущем при работе с данным МК.

Весь код
int DSPIN = PA5;

//                      RX    TX
HardwareSerial Serial1(PB7, PB6);  //привязываем порты к USART

void setup() {

  Serial1.begin(9600);    //инициализация USART1

}

void loop() {
  delay(500);

  double temp = TempRead();
  temp  = temp * 0.0625; // conversion accuracy is 0.0625 / LSB
  Serial1.print("Temperature: ");
  Serial1.print(temp);
  Serial1.println(" °C");
  Serial1.println("");
}





boolean DS18B20_Init()   
{
  pinMode(DSPIN, OUTPUT);
  digitalWrite(DSPIN, HIGH);
  delayMicroseconds(5);
  digitalWrite(DSPIN, LOW);
  delayMicroseconds(750);//480-960
  digitalWrite(DSPIN, HIGH);
  pinMode(DSPIN, INPUT);
  int t = 0;
  while (digitalRead(DSPIN))
  {
    t++;
    if (t > 60) return false;
    delayMicroseconds(1);
  }
  t = 480 - t;
  pinMode(DSPIN, OUTPUT);
  delayMicroseconds(t);
  digitalWrite(DSPIN, HIGH);
  return true;
}

void DS18B20_Write(byte data)
{
  pinMode(DSPIN, OUTPUT);
  for (int i = 0; i < 8; i++)
  {
    digitalWrite(DSPIN, LOW);
    delayMicroseconds(10);
    if (data & 1) digitalWrite(DSPIN, HIGH);
    else digitalWrite(DSPIN, LOW);
    data >>= 1;
    delayMicroseconds(50);
    digitalWrite(DSPIN, HIGH);
  }
}

byte DS18B20_Read()
{
  pinMode(DSPIN, OUTPUT);
  digitalWrite(DSPIN, HIGH);
  delayMicroseconds(2);
  byte data = 0;
  for (int i = 0; i < 8; i++)
  {
    digitalWrite(DSPIN, LOW);
    delayMicroseconds(1);
    digitalWrite(DSPIN, HIGH);
    pinMode(DSPIN, INPUT);
    delayMicroseconds(5);
    data >>= 1;
    if (digitalRead(DSPIN)) data |= 0x80;
    delayMicroseconds(55);
    pinMode(DSPIN, OUTPUT);
    digitalWrite(DSPIN, HIGH);
  }
  return data;
}

int TempRead()
{
  if (!DS18B20_Init()) return 0;
  DS18B20_Write (0xCC); // Send skip ROM command
  DS18B20_Write (0x44); // Send reading start conversion command
  if (!DS18B20_Init()) return 0;
  DS18B20_Write (0xCC); // Send skip ROM command
  DS18B20_Write (0xBE); // Read the register, a total of nine bytes, the first two bytes are the conversion value
  int temp = DS18B20_Read (); // Low byte
  temp |= DS18B20_Read () << 8; // High byte
  return temp;
}

Файлы

Схема и ПП нарисованы в DipTrace.

Файлы проекта на гитхаб.


Такой вот немного ленивый пост. Может кому такому же ленивому как я пригодится плата, ведь можно сэкономить минут 20 на ее рисовании :)

Комментарии (5)


  1. WicRus
    17.01.2023 10:50

    Заказывал с али GD32F330F8P6TR, заменить мк в контроллерах led ленты. Плату было делать лень, заказал там же переходник TSOP20 в DIP20 и навесным докинул обвязку, получилось не очень красиво, зато минимум затрат по времени. За применение лазерного утюга почёт и уважение, мне не хватило духу поменять 10 переходников за 50р на самодельную плату.


  1. tigreavecdesailes
    17.01.2023 13:03

    Всё-таки во фразе "отладочная плата" главное в возможности отлаживаться, а это всё навесное - led, кнопки, ресет и т.д.
    У же вас адаптер TSSOP-20 :)


    1. ENGIN33RRR Автор
      17.01.2023 13:29

      Для отладки выведены SWD и UART. А плата так и называется- минимальная.


    1. Arhammon
      17.01.2023 14:07

      Если платы заказные, там можно и шикануть. Я как-то даже sepic на любое разумное питание разводил) А с ЛУТ не особенно хочется разгуливаться...


  1. buldo
    18.01.2023 13:01

    Сугубо непрофессиональное IMHO.

    Мне кажется на таких платах стоит делать разъёмы отладки и uart с защитой от забывчивости. Всмысле питание вынести куда-то отдельно, а uart и swd сделать с GND по центру. Чтобы даже если забыл какой стороной втыкать шлейф, ничего не произошло