Skip to content

[New variant] STM32MP157_DK #717

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Nov 15, 2019
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,12 @@ User can add a STM32 based board following this [wiki](https://github.com/stm32d
| :---: | --- | :---: | :--- |
| :green_heart: | [STEVAL-MKSBOX1V1 (SensorTile.box)](https://www.st.com/en/evaluation-tools/steval-mksbox1v1.html) | *1.7.0* | |

| Status | [STM32MP1 series coprocessor](https://www.st.com/content/st_com/en/products/microcontrollers-microprocessors/stm32-arm-cortex-mpus/stm32mp1-series.html) | Release | Comment |
| :---: | --- | :---: | :--- |
| :yellow_heart: | [STM32MP157A-DK1](https://www.st.com/en/evaluation-tools/stm32mp157a-dk1.html) | **1.8.0** | See [the documentation](https://github.com/stm32duino/Arduino_Core_STM32/tree/master/variants/STM32MP157_DK/README.md) to use this board|
| :yellow_heart: | [STM32MP157C-DK2](https://www.st.com/en/evaluation-tools/stm32mp157c-dk2.html) | **1.8.0** | See [the documentation](https://github.com/stm32duino/Arduino_Core_STM32/tree/master/variants/STM32MP157_DK/README.md) to use this board|


| Status | Generic STM32F0xx | Release | Comment |
| :---: | --- | :---: | :--- |
| :green_heart: | [STM32F030F4 Demo board](https://stm32-base.org/boards/STM32F030F4P6-STM32F030-DEMO-BOARD-V1.1) | *1.5.0* | |
Expand Down
69 changes: 69 additions & 0 deletions boards.txt
Original file line number Diff line number Diff line change
Expand Up @@ -663,6 +663,40 @@ Eval.menu.upload_method.dfuMethod.upload.protocol=2
Eval.menu.upload_method.dfuMethod.upload.options=-g
Eval.menu.upload_method.dfuMethod.upload.tool=stm32CubeProg

################################################################################
# STM32MP1 microprocessor series (MPU + MCU)

STM32MP1.name=STM32MP1 series coprocessor

STM32MP1.build.vid=0x0483
STM32MP1.build.core=arduino
STM32MP1.build.board=STM32MP1
STM32MP1.build.mcu=cortex-m4
STM32MP1.build.flags.fp=-mfpu=fpv4-sp-d16 -mfloat-abi=hard
STM32MP1.build.series=STM32MP1xx
STM32MP1.build.cmsis_lib_gcc=arm_cortexM4l_math
STM32MP1.build.extra_flags=-DCORE_CM4 -DUSE_FULL_LL_DRIVER -D{build.product_line} {build.xSerial}

# STM32MP157A-DK1 board
STM32MP1.menu.pnum.STM32MP157A_DK1=STM32MP157A-DK1
STM32MP1.menu.pnum.STM32MP157A_DK1.upload.maximum_size=131072
STM32MP1.menu.pnum.STM32MP157A_DK1.upload.maximum_data_size=131072
STM32MP1.menu.pnum.STM32MP157A_DK1.build.board=STM32MP157A_DK1
STM32MP1.menu.pnum.STM32MP157A_DK1.build.product_line=STM32MP157Axx
STM32MP1.menu.pnum.STM32MP157A_DK1.build.variant=STM32MP157_DK

# STM32MP157C-DK2 board
STM32MP1.menu.pnum.STM32MP157C_DK2=STM32MP157C-DK2
STM32MP1.menu.pnum.STM32MP157C_DK2.upload.maximum_size=131072
STM32MP1.menu.pnum.STM32MP157C_DK2.upload.maximum_data_size=131072
STM32MP1.menu.pnum.STM32MP157C_DK2.build.board=STM32MP157C_DK2
STM32MP1.menu.pnum.STM32MP157C_DK2.build.product_line=STM32MP157Cxx
STM32MP1.menu.pnum.STM32MP157C_DK2.build.variant=STM32MP157_DK

# Upload menu
STM32MP1.menu.upload_method.MassStorage=Generate run_arduino.sh (You need to copy this manually)
STM32MP1.menu.upload_method.MassStorage.upload.protocol=
STM32MP1.menu.upload_method.MassStorage.upload.tool=remoteproc_gen

################################################################################
# Other boards
Expand Down Expand Up @@ -1451,6 +1485,13 @@ Eval.menu.xserial.none.build.xSerial=-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE
Eval.menu.xserial.disabled=Disabled (no Serial support)
Eval.menu.xserial.disabled.build.xSerial=

STM32MP1.menu.xserial.generic=UART only (generic 'Serial')
STM32MP1.menu.xserial.generic.build.xSerial=-DHAL_UART_MODULE_ENABLED
STM32MP1.menu.xserial.none=UART only (no generic 'Serial')
STM32MP1.menu.xserial.none.build.xSerial=-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE
STM32MP1.menu.xserial.disabled=Disabled (no Serial support)
STM32MP1.menu.xserial.disabled.build.xSerial=

GenF0.menu.xserial.generic=Enabled (generic 'Serial')
GenF0.menu.xserial.none=Enabled (no generic 'Serial')
GenF0.menu.xserial.none.build.xSerial=-DHAL_UART_MODULE_ENABLED -DHWSERIAL_NONE
Expand Down Expand Up @@ -1752,6 +1793,24 @@ Eval.menu.opt.o3lto.build.flags.optimize=-O3 -flto
Eval.menu.opt.ogstd=Debug (-g)
Eval.menu.opt.ogstd.build.flags.optimize=-g -Og

STM32MP1.menu.opt.osstd=Smallest (-Os default)
STM32MP1.menu.opt.oslto=Smallest (-Os) with LTO
STM32MP1.menu.opt.oslto.build.flags.optimize=-Os -flto
STM32MP1.menu.opt.o1std=Fast (-O1)
STM32MP1.menu.opt.o1std.build.flags.optimize=-O1
STM32MP1.menu.opt.o1lto=Fast (-O1) with LTO
STM32MP1.menu.opt.o1lto.build.flags.optimize=-O1 -flto
STM32MP1.menu.opt.o2std=Faster (-O2)
STM32MP1.menu.opt.o2std.build.flags.optimize=-O2
STM32MP1.menu.opt.o2lto=Faster (-O2) with LTO
STM32MP1.menu.opt.o2lto.build.flags.optimize=-O2 -flto
STM32MP1.menu.opt.o3std=Fastest (-O3)
STM32MP1.menu.opt.o3std.build.flags.optimize=-O3
STM32MP1.menu.opt.o3lto=Fastest (-O3) with LTO
STM32MP1.menu.opt.o3lto.build.flags.optimize=-O3 -flto
STM32MP1.menu.opt.ogstd=Debug (-g)
STM32MP1.menu.opt.ogstd.build.flags.optimize=-g -Og

GenF0.menu.opt.osstd=Smallest (-Os default)
GenF0.menu.opt.oslto=Smallest (-Os) with LTO
GenF0.menu.opt.oslto.build.flags.optimize=-Os -flto
Expand Down Expand Up @@ -1985,6 +2044,16 @@ Eval.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float
Eval.menu.rtlib.full=Newlib Standard
Eval.menu.rtlib.full.build.flags.ldspecs=

STM32MP1.menu.rtlib.nano=Newlib Nano (default)
STM32MP1.menu.rtlib.nanofp=Newlib Nano + Float Printf
STM32MP1.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
STM32MP1.menu.rtlib.nanofs=Newlib Nano + Float Scanf
STM32MP1.menu.rtlib.nanofs.build.flags.ldspecs=--specs=nano.specs -u _scanf_float
STM32MP1.menu.rtlib.nanofps=Newlib Nano + Float Printf/Scanf
STM32MP1.menu.rtlib.nanofps.build.flags.ldspecs=--specs=nano.specs -u _printf_float -u _scanf_float
STM32MP1.menu.rtlib.full=Newlib Standard
STM32MP1.menu.rtlib.full.build.flags.ldspecs=

GenF0.menu.rtlib.nano=Newlib Nano (default)
GenF0.menu.rtlib.nanofp=Newlib Nano + Float Printf
GenF0.menu.rtlib.nanofp.build.flags.ldspecs=--specs=nano.specs -u _printf_float
Expand Down
6 changes: 6 additions & 0 deletions cores/arduino/HardwareTimer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -913,6 +913,11 @@ timer_index_t get_timer_index(TIM_TypeDef *instance)
*/
uint32_t HardwareTimer::getTimerClkFreq()
{
#if defined(STM32MP1xx)
uint8_t timerClkSrc = getTimerClkSrc(_timerObj.handle.Instance);
uint64_t clkSelection = timerClkSrc == 1 ? RCC_PERIPHCLK_TIMG1 : RCC_PERIPHCLK_TIMG2;
return HAL_RCCEx_GetPeriphCLKFreq(clkSelection);
#else
RCC_ClkInitTypeDef clkconfig = {};
uint32_t pFLatency = 0U;
uint32_t uwTimclock = 0U, uwAPBxPrescaler = 0U;
Expand Down Expand Up @@ -1028,6 +1033,7 @@ uint32_t HardwareTimer::getTimerClkFreq()
}
#endif /* STM32H7xx */
return uwTimclock;
#endif /* STM32MP1xx */
}

/**
Expand Down
26 changes: 26 additions & 0 deletions cores/arduino/stm32/PinNames.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,24 @@ typedef enum {
PK_13 = (PortK << 4) + 0x0D,
PK_14 = (PortK << 4) + 0x0E,
PK_15 = (PortK << 4) + 0x0F,
#endif
#if defined GPIOZ_BASE
PZ_0 = (PortZ << 4) + 0x00,
PZ_1 = (PortZ << 4) + 0x01,
PZ_2 = (PortZ << 4) + 0x02,
PZ_3 = (PortZ << 4) + 0x03,
PZ_4 = (PortZ << 4) + 0x04,
PZ_5 = (PortZ << 4) + 0x05,
PZ_6 = (PortZ << 4) + 0x06,
PZ_7 = (PortZ << 4) + 0x07,
PZ_8 = (PortZ << 4) + 0x08,
PZ_9 = (PortZ << 4) + 0x09,
PZ_10 = (PortZ << 4) + 0x0A,
PZ_11 = (PortZ << 4) + 0x0B,
PZ_12 = (PortZ << 4) + 0x0C,
PZ_13 = (PortZ << 4) + 0x0D,
PZ_14 = (PortZ << 4) + 0x0E,
PZ_15 = (PortZ << 4) + 0x0F,
#endif
// Specific pin name
PADC_BASE = 0x100,
Expand All @@ -221,6 +239,14 @@ typedef enum {
#endif
#ifdef ADC_CHANNEL_VBAT
PADC_VBAT,
#endif
ANA_START,
// ANAx pins for STM32MP1 line, those pins are hard-wired to ADC directly.
#ifdef SYSCFG_PMCSETR_ANA0_SEL_Pos
ANA_0,
#endif
#ifdef SYSCFG_PMCSETR_ANA1_SEL_Pos
ANA_1,
#endif
// Specific pin name define in the variant
#if __has_include("PinNamesVar.h")
Expand Down
9 changes: 9 additions & 0 deletions cores/arduino/stm32/PortNames.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ GPIO_TypeDef *GPIOPort[MAX_NB_PORT] = {
#if defined GPIOK_BASE
, (GPIO_TypeDef *)GPIOK_BASE
#endif
#if defined GPIOZ_BASE
, (GPIO_TypeDef *)GPIOZ_BASE
#endif
};

/* Enable GPIO clock and return GPIO base address */
Expand Down Expand Up @@ -132,6 +135,12 @@ GPIO_TypeDef *set_GPIO_Port_Clock(uint32_t port_idx)
gpioPort = (GPIO_TypeDef *)GPIOK_BASE;
__HAL_RCC_GPIOK_CLK_ENABLE();
break;
#endif
#if defined GPIOZ_BASE
case PortZ:
gpioPort = (GPIO_TypeDef *)GPIOZ_BASE;
__HAL_RCC_GPIOZ_CLK_ENABLE();
break;
#endif
default:
// wrong port number
Expand Down
5 changes: 4 additions & 1 deletion cores/arduino/stm32/PortNames.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,11 @@ typedef enum {
#if defined GPIOK_BASE
PortK,
#endif
#if defined GPIOZ_BASE
PortZ,
LastPort = PortZ - 1
#endif
PortEND,
LastPort = PortEND - 1
} PortName;

#define MAX_NB_PORT (LastPort-FirstPort+1)
Expand Down
12 changes: 7 additions & 5 deletions cores/arduino/stm32/analog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -623,9 +623,10 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
#ifdef __HAL_RCC_ADC_CLK_ENABLE
__HAL_RCC_ADC_CLK_ENABLE();
#endif
/* For STM32F1xx and STM32H7xx, ADC prescaler is configured in
/* For STM32F1xx, STM32H7xx, and STM32MP1xx ADC prescaler is configured in
SystemClock_Config (variant.cpp) */
#if defined(__HAL_RCC_ADC_CONFIG) && !defined(STM32F1xx) && !defined(STM32H7xx)
#if defined(__HAL_RCC_ADC_CONFIG) && !defined(STM32F1xx) && \
!defined(STM32H7xx) && !defined(STM32MP1xx)
/* ADC Periph interface clock configuration */
__HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_SYSCLK);
#endif
Expand Down Expand Up @@ -766,7 +767,7 @@ uint16_t adc_read_value(PinName pin)
uint32_t samplingTime = ADC_SAMPLINGTIME;
uint32_t channel = 0;

if (pin & PADC_BASE) {
if ((pin & PADC_BASE) && (pin < ANA_START)) {
#if defined(STM32H7xx)
AdcHandle.Instance = ADC3;
#else
Expand Down Expand Up @@ -811,7 +812,8 @@ uint16_t adc_read_value(PinName pin)
#endif
#if !defined(STM32F1xx) && !defined(STM32F2xx) && !defined(STM32F3xx) && \
!defined(STM32F4xx) && !defined(STM32F7xx) && !defined(STM32G4xx) && \
!defined(STM32H7xx) && !defined(STM32L4xx) && !defined(STM32WBxx)
!defined(STM32H7xx) && !defined(STM32L4xx) && !defined(STM32MP1xx) && \
!defined(STM32WBxx)
AdcHandle.Init.LowPowerAutoPowerOff = DISABLE; /* ADC automatically powers-off after a conversion and automatically wakes-up when a new conversion is triggered */
#endif
#ifdef ADC_CHANNELS_BANK_A
Expand All @@ -829,7 +831,7 @@ uint16_t adc_read_value(PinName pin)
#if !defined(STM32F1xx) && !defined(STM32F373xC) && !defined(STM32F378xx)
AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */
#endif
#if !defined(STM32F1xx) && !defined(STM32H7xx) && \
#if !defined(STM32F1xx) && !defined(STM32H7xx) && !defined(STM32MP1xx) && \
!defined(STM32F373xC) && !defined(STM32F378xx)
AdcHandle.Init.DMAContinuousRequests = DISABLE; /* DMA one-shot mode selected (not applied to this example) */
#endif
Expand Down
3 changes: 2 additions & 1 deletion cores/arduino/stm32/backup.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ extern "C" {

/* Exported macro ------------------------------------------------------------*/
#if (!defined(STM32F0xx) && !defined(STM32F3xx) && !defined(STM32L0xx) &&\
!defined(STM32L1xx) && !defined(STM32L4xx)) || defined(RTC_BACKUP_SUPPORT)
!defined(STM32L1xx) && !defined(STM32L4xx) && !defined(STM32MP1xx)) || \
defined(RTC_BACKUP_SUPPORT)
#if !defined(STM32L412xx) && !defined(STM32L422xx)
#define ENABLE_BACKUP_SUPPORT
#endif
Expand Down
23 changes: 23 additions & 0 deletions cores/arduino/stm32/clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,16 @@
extern "C" {
#endif

#if defined(STM32MP1xx)
#include "stm32mp1xx_hal.h"
/* STM32MP1xx does not have own stm32mp1xx_ll_cortex.h so define functions manually.
*/
__STATIC_INLINE uint32_t LL_SYSTICK_IsActiveCounterFlag(void)
{
return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk));
}
#endif

/**
* @brief Function called to read the current micro second
* @param None
Expand Down Expand Up @@ -100,6 +110,15 @@ void enableClock(sourceClock_t source)
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

#if defined(STM32MP1xx)
/** Clock source selection is done by First Stage Boot Loader on Cortex A
* See variant.cpp for corresponding boards.
*/
if (!IS_ENGINEERING_BOOT_MODE()) {
return;
}
#endif /* STM32MP1xx */

enableBackupDomain();

switch (source) {
Expand All @@ -118,7 +137,11 @@ void enableClock(sourceClock_t source)
if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) {
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
#if defined(STM32MP1xx)
RCC_OscInitStruct.HSICalibrationValue = 0x00;
#else
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
#endif
}
break;
case LSE_CLOCK:
Expand Down
4 changes: 4 additions & 0 deletions cores/arduino/stm32/hw_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ void hw_config_init(void)
USBD_CDC_init();
#endif

#if defined (STM32MP1xx)
__HAL_RCC_HSEM_CLK_ENABLE();
#endif

}
#ifdef __cplusplus
}
Expand Down
17 changes: 17 additions & 0 deletions cores/arduino/stm32/interrupt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,23 @@ static gpio_irq_conf_str gpio_irq_conf[NB_EXTI] = {
{.irqnb = EXTI4_15_IRQn, .callback = NULL}, //GPIO_PIN_13
{.irqnb = EXTI4_15_IRQn, .callback = NULL}, //GPIO_PIN_14
{.irqnb = EXTI4_15_IRQn, .callback = NULL} //GPIO_PIN_15
#elif defined (STM32MP1xx)
{.irqnb = EXTI0_IRQn, .callback = NULL}, //GPIO_PIN_0
{.irqnb = EXTI1_IRQn, .callback = NULL}, //GPIO_PIN_1
{.irqnb = EXTI2_IRQn, .callback = NULL}, //GPIO_PIN_2
{.irqnb = EXTI3_IRQn, .callback = NULL}, //GPIO_PIN_3
{.irqnb = EXTI4_IRQn, .callback = NULL}, //GPIO_PIN_4
{.irqnb = EXTI5_IRQn, .callback = NULL}, //GPIO_PIN_5
{.irqnb = EXTI6_IRQn, .callback = NULL}, //GPIO_PIN_6
{.irqnb = EXTI7_IRQn, .callback = NULL}, //GPIO_PIN_7
{.irqnb = EXTI8_IRQn, .callback = NULL}, //GPIO_PIN_8
{.irqnb = EXTI9_IRQn, .callback = NULL}, //GPIO_PIN_9
{.irqnb = EXTI10_IRQn, .callback = NULL}, //GPIO_PIN_10
{.irqnb = EXTI11_IRQn, .callback = NULL}, //GPIO_PIN_11
{.irqnb = EXTI12_IRQn, .callback = NULL}, //GPIO_PIN_12
{.irqnb = EXTI13_IRQn, .callback = NULL}, //GPIO_PIN_13
{.irqnb = EXTI14_IRQn, .callback = NULL}, //GPIO_PIN_14
{.irqnb = EXTI15_IRQn, .callback = NULL} //GPIO_PIN_15
#else
{.irqnb = EXTI0_IRQn, .callback = NULL}, //GPIO_PIN_0
{.irqnb = EXTI1_IRQn, .callback = NULL}, //GPIO_PIN_1
Expand Down
Loading