How do I create a definition for a Board (BTT EBB42)

Post here first, or if you can't find a relevant section!
Post Reply
User avatar
Alextrical
Posts: 39
Joined: Tue Aug 02, 2022 12:59 pm
Location: Cornwall, UK

How do I create a definition for a Board (BTT EBB42)

Post by Alextrical »

Hi everyone

I'm wondering if anyone can advise how I need to go about creating a definition for a board that uses a 8Hz external clock, as that information looks to be currently missing from the Wiki.

The board in question is a Big Tree Tech 3D printer (sub) control board, called "EBB42 v1.1" and utilises the STM32G0B1CBT6 MCU
https://github.com/bigtreetech/EBB/tree ... CAN%20V1.1

I have added the board definition, created the files in the variant folder inline with other boards as an example.

It doesn't show up in Arduino 1.8.19 menu, I'm not sure what I'm missing, please advise.

boards.txt

Code: Select all

....
# 3D printer boards
....

# BTT_EBB42_V1.1 board
3dprinter.menu.pnum.EBB42_V1_1=BTT EBB42 v1.1
3dprinter.menu.pnum.EBB42_V1_1.upload.maximum_size=131072
3dprinter.menu.pnum.EBB42_V1_1.upload.maximum_data_size=147456
3dprinter.menu.pnum.EBB42_V1_1.build.mcu=cortex-m0plus
3dprinter.menu.pnum.EBB42_V1_1.build.board=EBB42_V1_1
3dprinter.menu.pnum.EBB42_V1_1.build.series=STM32G0xx
3dprinter.menu.pnum.EBB42_V1_1.build.product_line=STM32G0B1xx
3dprinter.menu.pnum.EBB42_V1_1.build.variant=STM32G0xx/G0B1C(B-C-E)(T-U)_G0C1C(C-E)(T-U)
3dprinter.menu.pnum.EBB42_V1_1.build.peripheral_pins=-DCUSTOM_PERIPHERAL_PINS
3dprinter.menu.pnum.EBB42_V1_1.build.cmsis_lib_gcc=arm_cortexM0l_math

....
variant_EBB42_V1_1.cpp

Code: Select all

/*
 *******************************************************************************
 * Copyright (c) 2021, STMicroelectronics
 * All rights reserved.
 *
 * This software component is licensed by ST under BSD 3-Clause license,
 * the "License"; You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 *                        opensource.org/licenses/BSD-3-Clause
 *
 *******************************************************************************
 */

#if defined(ARDUINO_EBB42_V1_1)
#include "pins_arduino.h"

// Pin number
const PinName digitalPin[] = {
  PA_0,   // D0/A0
  PA_1,   // D1/A1
  PA_2,   // D2/A2
  PA_3,   // D3/A3
  PA_4,   // D4/A4
  PA_5,   // D5/A5
  PA_6,   // D6/A6
  PA_7,   // D7/A7
  PA_8,   // D8
  PA_9,   // D9
  PA_10,  // D10
  PA_11,  // D11
  PA_12,  // D12
  PA_13,  // D13
  PA_14,  // D14
  PA_15,  // D15
  PB_0,   // D16/A8
  PB_1,   // D17/A9
  PB_2,   // D18/A10
  PB_3,   // D19
  PB_4,   // D20
  PB_5,   // D21
  PB_6,   // D22
  PB_7,   // D23
  PB_8,   // D24
  PB_9,   // D25
  PB_10,  // D26/A11
  PB_11,  // D27/A12
  PB_12,  // D28/A13
  PB_13,  // D29
  PB_14,  // D30
  PB_15,  // D31
  PC_6,   // D32
  PC_7,   // D33
  PC_13,  // D34
  PC_14,  // D35
  PC_15,  // D36
  PD_0,   // D37
  PD_1,   // D38
  PD_2,   // D39
  PD_3,   // D40
  PF_0,   // D41
  PF_1,   // D42
  PF_2,   // D43
  PA_9_R, // D44
  PA_10_R // D45
};

// Analog (Ax) pin number array
const uint32_t analogInputPin[] = {
  0,  // A0,  PA0
  1,  // A1,  PA1
  2,  // A2,  PA2
  3,  // A3,  PA3
  4,  // A4,  PA4
  5,  // A5,  PA5
  6,  // A6,  PA6
  7,  // A7,  PA7
  16, // A8,  PB0
  17, // A9,  PB1
  18, // A10, PB2
  26, // A11, PB10
  27, // A12, PB11
  28  // A13, PB12
};

// ----------------------------------------------------------------------------

#ifdef __cplusplus
extern "C" {
#endif

/**
  * @brief  System Clock Configuration
  * @param  None
  * @retval None
  */
WEAK void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_HSI48;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
  RCC_OscInitStruct.PLL.PLLN = 16;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

#ifdef __cplusplus
}
#endif
#endif /* ARDUINO_EBB42_V1_1 */

variant_EBB42_V1_1.h

Code: Select all

/*
 *******************************************************************************
 * Copyright (c) 2020, STMicroelectronics
 * All rights reserved.
 *
 * This software component is licensed by ST under BSD 3-Clause license,
 * the "License"; You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 *                        opensource.org/licenses/BSD-3-Clause
 *
 *******************************************************************************
 */
#pragma once

/*----------------------------------------------------------------------------
 *        STM32 pins number
 *----------------------------------------------------------------------------*/
#define PA0                     PIN_A0
#define PA1                     PIN_A1
#define PA2                     PIN_A2
#define PA3                     PIN_A3
#define PA4                     PIN_A4
#define PA5                     PIN_A5
#define PA6                     PIN_A6
#define PA7                     PIN_A7
#define PA8                     8
#define PA9                     9
#define PA10                    10
#define PA11                    11
#define PA12                    12
#define PA13                    13
#define PA14                    14
#define PA15                    15
#define PB0                     PIN_A8
#define PB1                     PIN_A9
#define PB2                     PIN_A10
#define PB3                     19
#define PB4                     20
#define PB5                     21
#define PB6                     22
#define PB7                     23
#define PB8                     24
#define PB9                     25
#define PB10                    PIN_A11
#define PB11                    PIN_A12
#define PB12                    PIN_A13
#define PB13                    29
#define PB14                    30
#define PB15                    31
#define PC6                     32
#define PC7                     33
#define PC13                    34
#define PC14                    35
#define PC15                    36
#define PD0                     37
#define PD1                     38
#define PD2                     39
#define PD3                     40
#define PF0                     41
#define PF1                     42
#define PF2                     43
#define PA9_R                   44
#define PA10_R                  45

// Alternate pins number
#define PA1_ALT1                (PA1    | ALT1)
#define PA2_ALT1                (PA2    | ALT1)
#define PA3_ALT1                (PA3    | ALT1)
#define PA4_ALT1                (PA4    | ALT1)
#define PA6_ALT1                (PA6    | ALT1)
#define PA6_ALT2                (PA6    | ALT2)
#define PA7_ALT1                (PA7    | ALT1)
#define PA7_ALT2                (PA7    | ALT2)
#define PA7_ALT3                (PA7    | ALT3)
#define PA9_ALT1                (PA9    | ALT1)
#define PA9_R_ALT1              (PA9_R  | ALT1)
#define PA10_ALT1               (PA10   | ALT1)
#define PA10_R_ALT1             (PA10_R | ALT1)
#define PA14_ALT1               (PA14   | ALT1)
#define PA15_ALT1               (PA15   | ALT1)
#define PB0_ALT1                (PB0    | ALT1)
#define PB1_ALT1                (PB1    | ALT1)
#define PB1_ALT2                (PB1    | ALT2)
#define PB3_ALT1                (PB3    | ALT1)
#define PB4_ALT1                (PB4    | ALT1)
#define PB5_ALT1                (PB5    | ALT1)
#define PB6_ALT1                (PB6    | ALT1)
#define PB6_ALT2                (PB6    | ALT2)
#define PB7_ALT1                (PB7    | ALT1)
#define PB8_ALT1                (PB8    | ALT1)
#define PB9_ALT1                (PB9    | ALT1)
#define PB13_ALT1               (PB13   | ALT1)
#define PB14_ALT1               (PB14   | ALT1)
#define PB15_ALT1               (PB15   | ALT1)
#define PB15_ALT2               (PB15   | ALT2)
#define PC6_ALT1                (PC6    | ALT1)
#define PC7_ALT1                (PC7    | ALT1)

#define NUM_DIGITAL_PINS        46
#define NUM_REMAP_PINS          2
#define NUM_ANALOG_INPUTS       14

// On-board LED pin number
#ifndef LED_BUILTIN
  #define LED_BUILTIN           PNUM_NOT_DEFINED
#endif

// On-board user button
#ifndef USER_BTN
  #define USER_BTN              PNUM_NOT_DEFINED
#endif

// SPI definitions
#ifndef PIN_SPI_SS
  #define PIN_SPI_SS            PA4
#endif
#ifndef PIN_SPI_SS1
  #define PIN_SPI_SS1           PA15
#endif
#ifndef PIN_SPI_SS2
  #define PIN_SPI_SS2           PB0
#endif
#ifndef PIN_SPI_SS3
  #define PIN_SPI_SS3           PNUM_NOT_DEFINED
#endif
#ifndef PIN_SPI_MOSI
  #define PIN_SPI_MOSI          PA2
#endif
#ifndef PIN_SPI_MISO
  #define PIN_SPI_MISO          PA6
#endif
#ifndef PIN_SPI_SCK
  #define PIN_SPI_SCK           PA1
#endif

// I2C definitions
#ifndef PIN_WIRE_SDA
  #define PIN_WIRE_SDA          PA6
#endif
#ifndef PIN_WIRE_SCL
  #define PIN_WIRE_SCL          PA7
#endif

// Timer Definitions
// Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin
#ifndef TIMER_TONE
  #define TIMER_TONE            TIM6
#endif
#ifndef TIMER_SERVO
  #define TIMER_SERVO           TIM7
#endif

// UART Definitions
#ifndef SERIAL_UART_INSTANCE
  #define SERIAL_UART_INSTANCE  4
#endif

// Default pin used for generic 'Serial' instance
// Mandatory for Firmata
#ifndef PIN_SERIAL_RX
  #define PIN_SERIAL_RX         PA1
#endif
#ifndef PIN_SERIAL_TX
  #define PIN_SERIAL_TX         PA0
#endif

// Extra HAL modules
#if !defined(HAL_DAC_MODULE_DISABLED)
  #define HAL_DAC_MODULE_ENABLED
#endif

/*----------------------------------------------------------------------------
 *        Arduino objects - C++ only
 *----------------------------------------------------------------------------*/

#ifdef __cplusplus
  // These serial port names are intended to allow libraries and architecture-neutral
  // sketches to automatically default to the correct port name for a particular type
  // of use.  For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN,
  // the first hardware serial port whose RX/TX pins are not dedicated to another use.
  //
  // SERIAL_PORT_MONITOR        Port which normally prints to the Arduino Serial Monitor
  //
  // SERIAL_PORT_USBVIRTUAL     Port which is USB virtual serial
  //
  // SERIAL_PORT_LINUXBRIDGE    Port which connects to a Linux system via Bridge library
  //
  // SERIAL_PORT_HARDWARE       Hardware serial port, physical RX & TX pins.
  //
  // SERIAL_PORT_HARDWARE_OPEN  Hardware serial ports which are open for use.  Their RX & TX
  //                            pins are NOT connected to anything by default.
  #ifndef SERIAL_PORT_MONITOR
    #define SERIAL_PORT_MONITOR   Serial
  #endif
  #ifndef SERIAL_PORT_HARDWARE
    #define SERIAL_PORT_HARDWARE  Serial
  #endif
#endif
ag123
Posts: 1655
Joined: Thu Dec 19, 2019 5:30 am
Answers: 24

Re: How do I create a definition for a Board (BTT EBB42)

Post by ag123 »

menu entries are normally updated in boards.txt

perhaps restart the IDE to "reload" it?
and it'd seemed it'd appear within the "3D printer boards" selection
User avatar
Alextrical
Posts: 39
Joined: Tue Aug 02, 2022 12:59 pm
Location: Cornwall, UK

Re: How do I create a definition for a Board (BTT EBB42)

Post by Alextrical »

ag123 wrote: Sat Aug 06, 2022 12:44 pm perhaps restart the IDE to "reload" it?
and it'd seemed it'd appear within the "3D printer boards" selection
I did that multiple times with no luck, so I moved it to the "Generic STM32G0 Series" group instead, re worked the definition to match, and it now works
Image

Is there any way I can get this into the Printer boards group, as I feel this is not the ideal place for it to reside?
User avatar
Alextrical
Posts: 39
Joined: Tue Aug 02, 2022 12:59 pm
Location: Cornwall, UK

Re: How do I create a definition for a Board (BTT EBB42)

Post by Alextrical »

I think I've got it sorted
Image
It looks to compile, I will test that it behaves as expected on the board today, and aim to place a pull request for it.
ag123
Posts: 1655
Joined: Thu Dec 19, 2019 5:30 am
Answers: 24

Re: How do I create a definition for a Board (BTT EBB42)

Post by ag123 »

found some specs here, I'm not sure if it'd help
https://arduino.github.io/arduino-cli/0 ... #boardstxt
it seemed a boards.name is needed for the ID
but that 2 level cascaded/nested structure is undocumented
User avatar
Alextrical
Posts: 39
Joined: Tue Aug 02, 2022 12:59 pm
Location: Cornwall, UK

Re: How do I create a definition for a Board (BTT EBB42)

Post by Alextrical »

ag123 wrote: Sat Aug 06, 2022 1:39 pm found some specs here, I'm not sure if it'd help
https://arduino.github.io/arduino-cli/0 ... #boardstxt
it seemed a boards.name is needed for the ID
but that 2 level cascaded/nested structure is undocumented
Thank you for that, It seems that I got it working.
It's possible that the issue was caused by the missing reference to a board variant file, as "variant_h" wasn't defined (non of the "3D printer boards
" have that set for some reason)
Also setting "st_extra_flags=-D{build.product_line} {build.enable_usb} {build.xSerial} -D__CORTEX_SC=0" looks like it was needed

CheckVariant.ino reports the following when run

Code: Select all

#####
NUM_DIGITAL_PINS = 46
NUM_ANALOG_INPUTS = 14
#####
Checking digital pins...
End check digital pins
#####
Checking analog pins definition...
End check analog pins
#####
Checking IP instances (I2C, UART, SPI)...
End check IP instances (I2C, UART, SPI)

########################################
#### Test PASSED
########################################
Post Reply

Return to “General discussion”