Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 32 additions & 14 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ if(BOARD_NAME STREQUAL "")
message(FATAL_ERROR "BOARD_NAME cannot be empty")
endif()
set(STLIB_DIR ${CMAKE_CURRENT_LIST_DIR}/deps/ST-LIB)
set(LD_SCRIPT ${STLIB_DIR}/STM32H723ZGTX_FLASH.ld)
set(LD_SCRIPT_INPUT ${STLIB_DIR}/LinkerScript.ld)
set(LD_SCRIPT ${CMAKE_BINARY_DIR}/LinkerScript.ld)

find_package(Python3 COMPONENTS Interpreter REQUIRED)

Expand All @@ -30,15 +31,10 @@ endif()
option(USE_ETHERNET "Enable ethernet peripheral" OFF)
option(TARGET_NUCLEO "Targets the STM32H723 Nucleo development board" OFF)
option(BUILD_EXAMPLES "Build Core/Src/Examples sources" OFF)
option(ITCM_BUILD "Build code in ITCM (fast execution, no wait states)" OFF)
set(ITCM_SIZE "64K" CACHE STRING "ITCM size: 64K, 128K, 192K, or 256K")
option(USE_CCACHE "Use ccache if available" ON)
if(NOT DEFINED ENABLE_LTO)
if(CMAKE_CROSSCOMPILING)
set(ENABLE_LTO OFF)
else()
set(ENABLE_LTO ON)
endif()
endif()
set(ENABLE_LTO "${ENABLE_LTO}" CACHE BOOL "Enable link-time optimization (LTO)")
option(ENABLE_LTO "Enable link-time optimization (LTO)" ON)

if(USE_CCACHE)
find_program(CCACHE_PROGRAM ccache)
Expand All @@ -49,9 +45,26 @@ if(USE_CCACHE)
endif()
endif()

# Preprocess linker script through C preprocessor
add_custom_command(
OUTPUT ${LD_SCRIPT}
COMMAND ${CMAKE_C_COMPILER} -E -P -x c
-D__ITCM_BUILD=$<IF:$<BOOL:${ITCM_BUILD}>,1,0>
-D__ITCM_SIZE=${ITCM_SIZE}
-o ${LD_SCRIPT} ${LD_SCRIPT_INPUT}
DEPENDS ${LD_SCRIPT_INPUT}
COMMENT "Preprocessing linker script (ITCM_BUILD=${ITCM_BUILD}, ITCM_SIZE=${ITCM_SIZE})"
)

add_custom_target(preprocess_linker_script
DEPENDS ${LD_SCRIPT}
)

message(STATUS "Template project: CMAKE_CROSSCOMPILING = ${CMAKE_CROSSCOMPILING}")
message(STATUS "Template project: USE_ETHERNET = ${USE_ETHERNET}")
message(STATUS "Template project: TARGET_NUCLEO = ${TARGET_NUCLEO}")
message(STATUS "Template project: ITCM_BUILD = ${ITCM_BUILD}")
message(STATUS "Template project: ITCM_SIZE = ${ITCM_SIZE}")
message(STATUS "Template project: BOARD_NAME = ${BOARD_NAME}")

add_subdirectory(${STLIB_DIR})
Expand Down Expand Up @@ -142,9 +155,11 @@ if(CMAKE_CROSSCOMPILING)
${SOURCE_H}
${SOURCE_HPP}

$<$<BOOL:${CMAKE_CROSSCOMPILING}>:${STLIB_DIR}/startup_stm32h723zgtx.s>
$<$<BOOL:${CMAKE_CROSSCOMPILING}>:${STLIB_DIR}/StartupCode.s>
)

add_dependencies(${EXECUTABLE} preprocess_linker_script)

target_link_libraries(${EXECUTABLE} PRIVATE
${STLIB_LIBRARY}
)
Expand All @@ -154,13 +169,16 @@ if(CMAKE_CROSSCOMPILING)
CXX_STANDARD_REQUIRED YES
C_STANDARD 17
C_STANDARD_REQUIRED YES
LINK_DEPENDS ${LD_SCRIPT}
)

target_compile_definitions(${EXECUTABLE} PRIVATE
$<$<BOOL:${EXAMPLE_SELECTED}>:EXAMPLE_SELECTED>
$<$<BOOL:${USE_ETHERNET}>:STLIB_ETH>
$<IF:$<BOOL:${TARGET_NUCLEO}>,NUCLEO,BOARD>
$<IF:$<BOOL:${TARGET_NUCLEO}>,HSE_VALUE=8000000,HSE_VALUE=25000000>
__ITCM_BUILD=$<IF:$<BOOL:${ITCM_BUILD}>,1,0>
__ITCM_SIZE=${ITCM_SIZE}
)

target_compile_options(${EXECUTABLE} PRIVATE
Expand All @@ -175,6 +193,8 @@ if(CMAKE_CROSSCOMPILING)
-fdata-sections
-fno-exceptions

$<$<AND:$<BOOL:${ENABLE_LTO}>,$<NOT:$<CONFIG:DEBUG>>>:-flto=auto>

-Wno-psabi

$<$<COMPILE_LANGUAGE:C>:-w>
Expand Down Expand Up @@ -202,14 +222,12 @@ if(CMAKE_CROSSCOMPILING)
$<$<BOOL:${CMAKE_CROSSCOMPILING}>:-lnosys>
$<$<BOOL:${CMAKE_CROSSCOMPILING}>:-Wl,-Map=${PROJECT_NAME}.map,--cref>
$<$<BOOL:${CMAKE_CROSSCOMPILING}>:-Wl,--gc-sections>

$<$<AND:$<BOOL:${ENABLE_LTO}>,$<NOT:$<CONFIG:DEBUG>>>:-flto>
)

add_dependencies(${EXECUTABLE} run_generator generate_binary_metadata)

if(ENABLE_LTO)
set_property(TARGET ${EXECUTABLE} PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELEASE ON)
set_property(TARGET ${EXECUTABLE} PROPERTY INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO ON)
endif()

# Post-build: Copy binary to out/build/latest.elf and create marker for BOARD builds
add_custom_command(TARGET ${EXECUTABLE} POST_BUILD
Expand Down
138 changes: 0 additions & 138 deletions Core/Inc/main.h
Original file line number Diff line number Diff line change
@@ -1,152 +1,14 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.h
* @brief : Header for main.c file.
* This file contains the common defines of the application.
******************************************************************************
* @attention
*
* Copyright (c) 2022 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32h7xx_hal.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */

/* USER CODE END ET */

/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */

/* USER CODE END EC */

/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */

/* USER CODE END EM */

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim);

/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);

/* USER CODE BEGIN EFP */

/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/
#define MCO_Pin GPIO_PIN_0
#define MCO_GPIO_Port GPIOH
#define RMII_MDC_Pin GPIO_PIN_1
#define RMII_MDC_GPIO_Port GPIOC
#define RMII_REF_CLK_Pin GPIO_PIN_1
#define RMII_REF_CLK_GPIO_Port GPIOA
#define RMII_MDIO_Pin GPIO_PIN_2
#define RMII_MDIO_GPIO_Port GPIOA
#define RMII_CRS_DV_Pin GPIO_PIN_7
#define RMII_CRS_DV_GPIO_Port GPIOA
#define RMII_RXD0_Pin GPIO_PIN_4
#define RMII_RXD0_GPIO_Port GPIOC
#define RMII_RXD1_Pin GPIO_PIN_5
#define RMII_RXD1_GPIO_Port GPIOC
#define ADC_16BITB0_Pin GPIO_PIN_0
#define ADC_16BITB0_GPIO_Port GPIOB
#define ADC_16BITB1_Pin GPIO_PIN_1
#define ADC_16BITB1_GPIO_Port GPIOB
#define ADC_16BITF11_Pin GPIO_PIN_11
#define ADC_16BITF11_GPIO_Port GPIOF
#define ADC_16BITF12_Pin GPIO_PIN_12
#define ADC_16BITF12_GPIO_Port GPIOF
#define ADC_16BITF13_Pin GPIO_PIN_13
#define ADC_16BITF13_GPIO_Port GPIOF
#define ADC_16BITF14_Pin GPIO_PIN_14
#define ADC_16BITF14_GPIO_Port GPIOF
#define PWM_OUT_NE8_Pin GPIO_PIN_8
#define PWM_OUT_NE8_GPIO_Port GPIOE
#define PWM_OUTE9_Pin GPIO_PIN_9
#define PWM_OUTE9_GPIO_Port GPIOE
#define PWM_OUT_NE10_Pin GPIO_PIN_10
#define PWM_OUT_NE10_GPIO_Port GPIOE
#define PWM_OUTE11_Pin GPIO_PIN_11
#define PWM_OUTE11_GPIO_Port GPIOE
#define PWM_OUT_NE12_Pin GPIO_PIN_12
#define PWM_OUT_NE12_GPIO_Port GPIOE
#define PWM_OUTE13_Pin GPIO_PIN_13
#define PWM_OUTE13_GPIO_Port GPIOE
#define PWM_OUTE14_Pin GPIO_PIN_14
#define PWM_OUTE14_GPIO_Port GPIOE
#define RMII_TXD1_Pin GPIO_PIN_13
#define RMII_TXD1_GPIO_Port GPIOB
#define PWM_OUTB14_Pin GPIO_PIN_14
#define PWM_OUTB14_GPIO_Port GPIOB
#define PWM_OUTB15_Pin GPIO_PIN_15
#define PWM_OUTB15_GPIO_Port GPIOB
#define PWM_OUTD12_Pin GPIO_PIN_12
#define PWM_OUTD12_GPIO_Port GPIOD
#define PWM_OUTD13_Pin GPIO_PIN_13
#define PWM_OUTD13_GPIO_Port GPIOD
#define PWM_OUTD15_Pin GPIO_PIN_15
#define PWM_OUTD15_GPIO_Port GPIOD
#define ENCODER_1_Pin GPIO_PIN_6
#define ENCODER_1_GPIO_Port GPIOC
#define ENCODER_1C7_Pin GPIO_PIN_7
#define ENCODER_1C7_GPIO_Port GPIOC
#define PWM_OUTC8_Pin GPIO_PIN_8
#define PWM_OUTC8_GPIO_Port GPIOC
#define PWM_INC9_Pin GPIO_PIN_9
#define PWM_INC9_GPIO_Port GPIOC
#define SPI3_SS_Pin GPIO_PIN_3
#define SPI3_SS_GPIO_Port GPIOD
#define RMII_TX_EN_Pin GPIO_PIN_11
#define RMII_TX_EN_GPIO_Port GPIOG
#define RMII_TXD0_Pin GPIO_PIN_13
#define RMII_TXD0_GPIO_Port GPIOG
#define PWM_OUTB4_Pin GPIO_PIN_4
#define PWM_OUTB4_GPIO_Port GPIOB
#define PWM_OUTB5_Pin GPIO_PIN_5
#define PWM_OUTB5_GPIO_Port GPIOB
#define PWM_OUT_NB6_Pin GPIO_PIN_6
#define PWM_OUT_NB6_GPIO_Port GPIOB
#define PWM_OUT_NB7_Pin GPIO_PIN_7
#define PWM_OUT_NB7_GPIO_Port GPIOB
#define PWM_OUTB8_Pin GPIO_PIN_8
#define PWM_OUTB8_GPIO_Port GPIOB
#define PWM_OUTB9_Pin GPIO_PIN_9
#define PWM_OUTB9_GPIO_Port GPIOB
#define SWDIO_Pin GPIO_PIN_13
#define SWDIO_GPIO_Port GPIOA
#define SWCLK_Pin GPIO_PIN_14
#define SWCLK_GPIO_Port GPIOA
#define SWO_Pin GPIO_PIN_3
#define SWO_GPIO_Port GPIOB
/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */

#ifdef __cplusplus
}
#endif
Expand Down
87 changes: 0 additions & 87 deletions Core/Inc/stm32h7xx_it.h

This file was deleted.

20 changes: 12 additions & 8 deletions Core/Src/Examples/ExampleADC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,15 @@ constexpr auto adc = ADCDomain::ADC(
ADCDomain::Resolution::BITS_12,
ADCDomain::SampleTime::CYCLES_8_5
);
using ExampleADCBoard = ST_LIB::Board<ST_LIB::DefaultFaultPolicy, adc>;

auto& adc_instance = ExampleADCBoard::instance_of<adc>();

extern "C" void BoardInit() { ExampleADCBoard::init(); }

int main(void) {
using ExampleADCBoard = ST_LIB::Board<adc>;
ExampleADCBoard::init();
start_terminal();

auto& adc_instance = ExampleADCBoard::instance_of<adc>();

print_banner("ADC single-channel example", kSingleChannelWiringHint, "t_ms raw voltage[V]");
printf("Reading input: %s\n\r\n\r", adc_input.label);

Expand Down Expand Up @@ -103,14 +104,17 @@ constexpr auto adc_input_1 = ADCDomain::ADC(
ADCDomain::SampleTime::CYCLES_8_5
);

using ExampleADCBoard = ST_LIB::Board<ST_LIB::DefaultFaultPolicy, adc_input_0, adc_input_1>;

extern "C" void BoardInit() { ExampleADCBoard::init(); }

auto& adc_input_0_instance = ExampleADCBoard::instance_of<adc_input_0>();
auto& adc_input_1_instance = ExampleADCBoard::instance_of<adc_input_1>();

int main(void) {
using ExampleADCBoard = ST_LIB::Board<adc_input_0, adc_input_1>;
ExampleADCBoard::init();
start_terminal();

auto& adc_input_0_instance = ExampleADCBoard::instance_of<adc_input_0>();
auto& adc_input_1_instance = ExampleADCBoard::instance_of<adc_input_1>();

print_banner(
"ADC dual-channel example",
kDualChannelWiringHint,
Expand Down
Loading
Loading