cant get blink to work with variant

Post here first, or if you can't find a relevant section!
Post Reply
RCP1990
Posts: 2
Joined: Sat Aug 07, 2021 8:19 pm

cant get blink to work with variant

Post by RCP1990 »

I manually added a stm32f105x based board and I cant seem to get the blink example to complie/upload. I am using an stmlink v2 clone.

the board is a can bus filter found on aliexpress.

variant.h

Code: Select all

/*
 *******************************************************************************
 * Copyright (c) 2019, 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
 *
 *******************************************************************************
 */

#ifndef ARDUINO_CANFILTER_STM32
#define ARDUINO_CANFILTER_STM32

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus


#define HSE_VALUE 25000000U

//#define STM32F105xC
//#define DWT_DELAY_DISABLED

/*----------------------------------------------------------------------------
 *        Pins
 *----------------------------------------------------------------------------*/

// Define pin names to match digital pin number --> Dx
// It could be used with preprocessor tests (e.g. #if PXn == 3)
// so an enum will not work.
// !!!
// !!! Copy the digitalPin[] array from the variant.cpp
// !!! and remove all '_': PX_n --> PXn
// !!! For NC, comment the line to warn x pin number is NC
// !!! // x is NC
// !!! For duplicated pin name, comment the line to warn x pin number
// !!! is PXn which is already defined with y pin number
// !!! // x is PXn (y)
// !!! Ex:
// !!! ...
// !!! #define PA4  20 // A14 <-- if NUM_ANALOG_FIRST not defined
// !!! or
// !!! #define PA4  A14 // 20 <-- if NUM_ANALOG_FIRST defined
// !!! #define PB4  21
// !!! #define PB5  22
// !!! #define PB3  23
// !!! // 24 is PA4 (20)
// !!! // 25 is PB4 (21)
// !!! #define PA2  26 // A15 <-- if NUM_ANALOG_FIRST not defined
// !!! or
// !!! #define PA2  A15 // 26 <-- if NUM_ANALOG_FIRST defined
// !!! ...
//#define PXn x

#define  PA15  0
#define  PC10  1
#define  PC11  2
#define  PC12  3

// This must be a literal
// It is used with preprocessor tests (e.g. #if NUM_DIGITAL_PINS > 3)
// so an enum will not work.
#define NUM_DIGITAL_PINS        3

// Allow to define Arduino style alias for analog input pin number --> Ax
// If no analog pin required then NUM_ANALOG_INPUTS could not be defined
// or set to `0`
// All pins are digital, analog inputs are a subset of digital pins.
// This must be a literal
// It is used with preprocessor tests (e.g. #if NUM_ANALOG_INPUTS > 3)
// so an enum will not work.
// !!!
// !!! It must be aligned with the number of analog PinName
// !!! defined in digitalPin[] array in variant.cpp
// !!!
#define NUM_ANALOG_INPUTS       0

// They are 2 possibles way to define analog pins:
//-------------------------------------------------------------------------------------------
//   - If they are contiguous in the digitalPin array:
//     Simply defined `NUM_ANALOG_FIRST` and all pins Ax will be automatically defined.
//     It define the digital pin number of the first analog input  (i.e. which digital pin is A0)
//     First analog pin value (A0) must be greater than or equal to NUM_ANALOG_INPUTS
//     This must be a literal with a value less than or equal to MAX_ANALOG_INPUTS
//     defined in pin_arduino.h
#define NUM_ANALOG_FIRST        0
//------------------------------------OR------------------------------------------------------
//   - If they are not contiguous in the digitalPin array:
//     Add an analogInputPin array in the variant.cpp without defining NUM_ANALOG_FIRST
//     In that case the defined PYn for analog pin have to define the Ax definition instead of
//     index in digitalPin[] array:
//     #define PA4  A14
//-------------------------------------------------------------------------------------------


// Below ADC and PWM definitions already done in the core
// Could be redefined here if needed
// ADC resolution is 10 bits
//#define ADC_RESOLUTION          10

// PWM resolution
//#define PWM_RESOLUTION          8
//#define PWM_FREQUENCY           1000
//#define PWM_MAX_DUTY_CYCLE      255

// On-board LED pin number
#define LED_BUILTIN             PC10
#define LED_GREEN               LED_GREEN

// On-board user button
#define USER_BTN                0

// Below SPI and I2C definitions already done in the core
// Could be redefined here if differs from the default one
// SPI Definitions
//#define PIN_SPI_SS              10 // Default for Arduino connector compatibility
//#define PIN_SPI_MOSI            11 // Default for Arduino connector compatibility
//#define PIN_SPI_MISO            12 // Default for Arduino connector compatibility
//#define PIN_SPI_SCK             13 // Default for Arduino connector compatibility

// I2C Definitions
//#define PIN_WIRE_SDA            14 // Default for Arduino connector compatibility
//#define PIN_WIRE_SCL            15 // Default for Arduino connector compatibility

// I2C timing definitions (optional), avoid time spent to compute if defined
// * I2C_TIMING_SM for Standard Mode (100kHz)
// * I2C_TIMING_FM for Fast Mode (400kHz)
// * I2C_TIMING_FMP for Fast Mode Plus (1000kHz)
//#define I2C_TIMING_SM           0x00000000
//#define I2C_TIMING_FM           0x00000000
//#define I2C_TIMING_FMP          0x00000000

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

// UART Definitions
// Define here Serial instance number to map on Serial generic name
#define SERIAL_UART_INSTANCE    0 //ex: 2 for Serial2 (USART2)
// DEBUG_UART could be redefined to print on another instance than 'Serial'
//#define DEBUG_UART              ((USART_TypeDef *) U(S)ARTX) // ex: USART3
// DEBUG_UART baudrate, default: 9600 if not defined
//#define DEBUG_UART_BAUDRATE     x
// DEBUG_UART Tx pin name, default: the first one found in PinMap_UART_TX for DEBUG_UART
//#define DEBUG_PINNAME_TX        PX_n // PinName used for TX

// Default pin used for 'Serial' instance (ex: ST-Link)
// Mandatory for Firmata
#define PIN_SERIAL_RX           x
#define PIN_SERIAL_TX           x

// Optional PIN_SERIALn_RX and PIN_SERIALn_TX where 'n' is the U(S)ART number
// Used when user instanciate a hardware Serial using its peripheral name.
// Example: HardwareSerial mySerial(USART3);
// will use PIN_SERIAL3_RX and PIN_SERIAL3_TX if defined.
//#define PIN_SERIALn_RX          x // For U(S)ARTn RX
//#define PIN_SERIALn_TX          x // For U(S)ARTn TX
//#define PIN_SERIALLP1_RX        x // For LPUART1 RX
//#define PIN_SERIALLP1_TX        x // For LPUART1 TX

// SD card slot Definitions
// SD detect signal can be defined if required
//#define SD_DETECT_PIN           x
// SD Read/Write timeout, default value defined in STM32SD library
//#define SD_DATATIMEOUT          x

#ifdef __cplusplus
} // extern "C"
#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.
#define SERIAL_PORT_MONITOR     Serial
#define SERIAL_PORT_HARDWARE    Serial
#endif

#endif /* _VARIANT_ARDUINO_STM32_ */
variant.cpp

Code: Select all

/*
 *******************************************************************************
 * Copyright (c) 2019, 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
 *
 *******************************************************************************
 */

#include "pins_arduino.h"

#ifdef __cplusplus
extern "C" {
#endif

// Digital PinName array
// This array allows to wrap Arduino pin number(Dx or x)
// to STM32 PinName (PX_n)
const PinName digitalPin[] = {
    //PX_n, //Dx
    PA_15, //D0
    PC_10, //D1
    PC_11, //D2
    PC_12 //D3
};

#ifdef __cplusplus
}
#endif

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

#ifdef __cplusplus
extern "C" {
#endif


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

    /** Initializes the CPU, AHB and APB busses clocks
    */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV5;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.Prediv1Source = RCC_PREDIV1_SOURCE_PLL2;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
    RCC_OscInitStruct.PLL2.PLL2State = RCC_PLL2_ON;
    RCC_OscInitStruct.PLL2.PLL2MUL = RCC_PLL2_MUL8;
    RCC_OscInitStruct.PLL2.HSEPrediv2Value = RCC_HSE_PREDIV2_DIV5;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }
    /** Initializes the CPU, AHB and APB busses clocks
    */
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
    {
        Error_Handler();
    }
    /** Configure the Systick interrupt time
    */
    __HAL_RCC_PLLI2S_ENABLE();
}

#ifdef __cplusplus
}
#endif
when i load up the blink example it complains that 'LED_BUILTIN' was not declared in this scope but when i explicitly define it in the sketch as PC_10 or '1', I receive:

Code: Select all

/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.c: In function 'pinNametoDigitalPin':
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.c:27:16: error: 'NUM_DIGITAL_PINS' undeclared (first use in this function)
   27 |   uint32_t i = NUM_DIGITAL_PINS;
      |                ^~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.c:27:16: note: each undeclared identifier is reported only once for each function it appears in
In file included from /Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.c:19:
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.c: In function 'analogInputToPinName':
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.h:119:38: error: 'NUM_DIGITAL_PINS' undeclared (first use in this function)
  119 | #define analogInputToDigitalPin(p)  (NUM_DIGITAL_PINS)
      |                                      ^~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.h:103:51: note: in definition of macro 'digitalPinToPinName'
  103 | #define digitalPinToPinName(p)      ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
      |                                                   ^
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.c:41:36: note: in expansion of macro 'analogInputToDigitalPin'
   41 |   PinName pn = digitalPinToPinName(analogInputToDigitalPin(pin));
      |                                    ^~~~~~~~~~~~~~~~~~~~~~~
In file included from /Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/Arduino.h:56,
                 from /Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_digital.c:19:
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_digital.c: In function 'pinMode':
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.h:103:69: error: 'NUM_DIGITAL_PINS' undeclared (first use in this function)
  103 | #define digitalPinToPinName(p)      ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
      |                                                                     ^~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_digital.c:31:15: note: in expansion of macro 'digitalPinToPinName'
   31 |   PinName p = digitalPinToPinName(ulPin);
      |               ^~~~~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.h:103:69: note: each undeclared identifier is reported only once for each function it appears in
  103 | #define digitalPinToPinName(p)      ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
      |                                                                     ^~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_digital.c:31:15: note: in expansion of macro 'digitalPinToPinName'
   31 |   PinName p = digitalPinToPinName(ulPin);
      |               ^~~~~~~~~~~~~~~~~~~
In file included from /Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/Arduino.h:56,
                 from /Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_analog.c:19:
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_analog.c: In function 'analogWrite':
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.h:103:69: error: 'NUM_DIGITAL_PINS' undeclared (first use in this function)
  103 | #define digitalPinToPinName(p)      ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
      |                                                                     ^~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_analog.c:187:15: note: in expansion of macro 'digitalPinToPinName'
  187 |   PinName p = digitalPinToPinName(ulPin);
      |               ^~~~~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.h:103:69: note: each undeclared identifier is reported only once for each function it appears in
  103 | #define digitalPinToPinName(p)      ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
      |                                                                     ^~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_analog.c:187:15: note: in expansion of macro 'digitalPinToPinName'
  187 |   PinName p = digitalPinToPinName(ulPin);
      |               ^~~~~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_digital.c: In function 'digitalWrite':
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.h:103:69: error: 'NUM_DIGITAL_PINS' undeclared (first use in this function)
  103 | #define digitalPinToPinName(p)      ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
      |                                                                     ^~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_digital.c:81:20: note: in expansion of macro 'digitalPinToPinName'
   81 |   digitalWriteFast(digitalPinToPinName(ulPin), ulVal);
      |                    ^~~~~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_digital.c: In function 'digitalRead':
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.h:103:69: error: 'NUM_DIGITAL_PINS' undeclared (first use in this function)
  103 | #define digitalPinToPinName(p)      ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
      |                                                                     ^~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_digital.c:86:26: note: in expansion of macro 'digitalPinToPinName'
   86 |   return digitalReadFast(digitalPinToPinName(ulPin));
      |                          ^~~~~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_digital.c: In function 'digitalToggle':
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/pins_arduino.h:103:69: error: 'NUM_DIGITAL_PINS' undeclared (first use in this function)
  103 | #define digitalPinToPinName(p)      ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \
      |                                                                     ^~~~~~~~~~~~~~~~
/Users/marric.murray/Library/Arduino15/packages/STMicroelectronics/hardware/stm32/2.0.0/cores/arduino/wiring_digital.c:91:21: note: in expansion of macro 'digitalPinToPinName'
   91 |   digitalToggleFast(digitalPinToPinName(ulPin));
      |                     ^~~~~~~~~~~~~~~~~~~
exit status 1
Error compiling for board Generic STM32F1 series.
what am I missing here?

i found a schematic for the board on https://dangerouspayload.com/2020/03/10 ... er-device/
Image
ABOSTM
Posts: 60
Joined: Wed Jan 08, 2020 8:40 am
Answers: 7

Re: cant get blink to work with variant

Post by ABOSTM »

Hi @RCP1990,
As you defined NUM_DIGITAL_PINS in variant.h, I can guess that:
* either your variant.h is not included at all (maybe another variant.h file is included, not yours)
* or you didn't defined ARDUINO_CANFILTER_STM32 (which prevent definition ofNUM_DIGITAL_PINS )
this is the name of board in boards.txt.

In both cases I think the problem is in boards.txt.

Did you follow this wiki to create your custom board ?
https://github.com/stm32duino/wiki/wiki ... nt-(board)
did you follow step : "4 - Declare the variant" ?
Can you share the board.txt part you added ?
RCP1990
Posts: 2
Joined: Sat Aug 07, 2021 8:19 pm

Re: cant get blink to work with variant

Post by RCP1990 »

thanks for the reply!

here is my boards.txt excerpt:

Code: Select all

# CAN_FILTER
GenF1.menu.pnum.CANFILTER=CAN Filter
GenF1.menu.pnum.CANFILTER.upload.maximum_size=131072
GenF1.menu.pnum.CANFILTER.upload.maximum_data_size=65536
GenF1.menu.pnum.CANFILTER.build.board=CANFILTER
GenF1.menu.pnum.CANFILTER.build.product_line=STM32F105xC
GenF1.menu.pnum.CANFILTER.build.variant=STM32F1xx/CAN_FILTER
GenF1.menu.pnum.CANFILTER.build.variant_h=variant.h
GenF1.menu.pnum.CANFILTER.build.mcu=cortex-m3
GenF1.menu.pnum.CANFILTER.build.cmsis_lib_gcc=arm_cortexM3l_math
GenF1.menu.pnum.CANFILTER.build.series=STM32F1xx
likewise my file directory is:
variants/STM32F1xx/CAN_FILTER:
PeripheralPins.c boards_entry.txt variant.cpp
PinNamesVar.h ldscript.ld variant.h
User avatar
fpiSTM
Posts: 1757
Joined: Wed Dec 11, 2019 7:11 pm
Answers: 91
Location: Le Mans
Contact:

Re: cant get blink to work with variant

Post by fpiSTM »

Your issue is that you used variant.h name. It already exists in the core. Rename it and change it in the boards.txt.
Post Reply

Return to “General discussion”