From c1b2bd232dc820da3d88091c09bc2baa74197170 Mon Sep 17 00:00:00 2001 From: Ajit Ananthadevan Date: Mon, 25 Aug 2025 01:07:22 +1000 Subject: [PATCH] make template --- myapps/template/Makefile | 163 +++++++++++++++++++++++ myapps/template/freertos.mk | 15 +++ myapps/template/hal.mk | 13 ++ myapps/template/src/inc/FreeRTOSConfig.h | 118 ++++++++++++++++ myapps/template/src/main.c | 119 +++++++++++++++++ 5 files changed, 428 insertions(+) create mode 100644 myapps/template/Makefile create mode 100644 myapps/template/freertos.mk create mode 100644 myapps/template/hal.mk create mode 100644 myapps/template/src/inc/FreeRTOSConfig.h create mode 100644 myapps/template/src/main.c diff --git a/myapps/template/Makefile b/myapps/template/Makefile new file mode 100644 index 0000000..101c898 --- /dev/null +++ b/myapps/template/Makefile @@ -0,0 +1,163 @@ +###################################### +# target +###################################### +TARGET = stm32g0_blinky +PART = STM32G030xx +PYOCD_TARGET = stm32g030f6px + + +###################################### +# building variables +###################################### +# debug build? +DEBUG = 1 +PRINTF = 1 +# optimization for size +OPT = -Os + + +####################################### +# paths +####################################### +# Build path +BUILD_DIR = build +VND_DIR = ../../vendor + +###################################### +# source +###################################### +# C sources +include freertos.mk +include hal.mk +C_SOURCES += \ +$(VND_DIR)/STM32CubeG0/Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/system_stm32g0xx.c \ +src/main.c + +ifeq ($(PRINTF), 1) +C_SOURCES += \ +$(VND_DIR)/STM32CubeG0/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_usart.c \ +$(VND_DIR)/my_printf/my_printf.c + +C_INCLUDES += -I$(VND_DIR)/my_printf/inc +endif + +# ASM sources +ASM_SOURCES = \ +$(VND_DIR)/STM32CubeG0/Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g030xx.s + +####################################### +# binaries +####################################### +PREFIX = arm-none-eabi- + +CC = $(PREFIX)gcc +CP = $(PREFIX)objcopy +#SZ = $(PREFIX)size + +BIN = $(CP) -O binary -S + +####################################### +# CFLAGS +####################################### + +ifeq ($(DEBUG), 1) +DEBUG_FLAGS = -gdwarf-3 +endif + +# cpu +CPU = \ + -mcpu=cortex-m0plus + +DEFINES = -D$(PART) + +# fpu +FPU = + +# float-abi +FLOAT-ABI = + +# mcu +MCU = $(CPU) $(FPU) $(FLOAT-ABI) + +# C includes +C_INCLUDES += \ + -Isrc/inc \ + -I$(VND_DIR)/STM32CubeG0/Drivers/CMSIS/Core/Include \ + -I$(VND_DIR)/STM32CubeG0/Drivers/CMSIS/Device/ST/STM32G0xx/Include + +# compile gcc flags +ADDN_CFLAGS = \ + -Wall \ + -fdata-sections \ + -ffunction-sections + +CFLAGS = $(MCU) $(ADDN_CFLAGS) $(C_INCLUDES) $(DEBUG_FLAGS) $(OPT) $(DEFINES) + + +# Generate dependency information +#CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" + + +ASFLAGS = $(MCU) $(DEBUG_FLAGS) $(OPT) -Wa,--warn + +####################################### +# LDFLAGS +####################################### +# link script +LDSCRIPT = $(VND_DIR)/Ld/STM32G030F6MX_RTOS_FLASH.ld + +LIBDIR = +LDFLAGS = \ + $(MCU) \ + -T $(LDSCRIPT) \ + --specs=nano.specs \ + -specs=nosys.specs -lc -lm \ + -Wl,--gc-sections \ + -Wl,--print-memory-usage \ + -Wl,--no-warn-rwx-segments + +# default action: build all +all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).bin + + +####################################### +# build the application +####################################### +# list of objects +OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) +vpath %.c $(sort $(dir $(C_SOURCES))) + +# list of ASM program objects +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) +vpath %.s $(sort $(dir $(ASM_SOURCES))) + +$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) + $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ + +$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) + $(CC) -c $(ASFLAGS) $< -o $@ + +#$(LUAOBJECTS) $(OBJECTS) +$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile + $(CC) $(OBJECTS) $(LDFLAGS) -o $@ + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(BIN) $< $@ + +$(BUILD_DIR): + mkdir $@ + +####################################### +# Program +####################################### + +flash: $(BUILD_DIR)/$(TARGET).bin + pyocd load --target $(PYOCD_TARGET) $(BUILD_DIR)/$(TARGET).bin + +####################################### +# clean up +####################################### +clean: + -rm -fR $(BUILD_DIR) + +# *** EOF *** diff --git a/myapps/template/freertos.mk b/myapps/template/freertos.mk new file mode 100644 index 0000000..ede0955 --- /dev/null +++ b/myapps/template/freertos.mk @@ -0,0 +1,15 @@ +C_SOURCES += \ + $(VND_DIR)/STM32CubeG0/Middlewares/Third_Party/FreeRTOS/Source/croutine.c \ + $(VND_DIR)/STM32CubeG0/Middlewares/Third_Party/FreeRTOS/Source/event_groups.c \ + $(VND_DIR)/STM32CubeG0/Middlewares/Third_Party/FreeRTOS/Source/list.c \ + $(VND_DIR)/STM32CubeG0/Middlewares/Third_Party/FreeRTOS/Source/queue.c \ + $(VND_DIR)/STM32CubeG0/Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c \ + $(VND_DIR)/STM32CubeG0/Middlewares/Third_Party/FreeRTOS/Source/tasks.c \ + $(VND_DIR)/STM32CubeG0/Middlewares/Third_Party/FreeRTOS/Source/timers.c \ + $(VND_DIR)/STM32CubeG0/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM0/port.c \ + $(VND_DIR)/STM32CubeG0/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c + + +C_INCLUDES += \ +-I$(VND_DIR)/STM32CubeG0/Middlewares/Third_Party/FreeRTOS/Source/include \ +-I$(VND_DIR)/STM32CubeG0/Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM0 diff --git a/myapps/template/hal.mk b/myapps/template/hal.mk new file mode 100644 index 0000000..1e754e6 --- /dev/null +++ b/myapps/template/hal.mk @@ -0,0 +1,13 @@ +C_INCLUDES += \ + -I$(VND_DIR)/STM32CubeG0/Drivers/STM32G0xx_HAL_Driver/Inc + +# "stm32g0xx_ll_bus.h" "stm32g0xx_ll_system.h" "stm32g0xx_ll_cortex.h" : missing +C_SOURCES += \ + $(VND_DIR)/STM32CubeG0/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c \ + $(VND_DIR)/STM32CubeG0/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_crs.c \ + $(VND_DIR)/STM32CubeG0/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_exti.c \ + $(VND_DIR)/STM32CubeG0/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_utils.c \ + $(VND_DIR)/STM32CubeG0/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_pwr.c \ + $(VND_DIR)/STM32CubeG0/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_dma.c \ + $(VND_DIR)/STM32CubeG0/Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_gpio.c + diff --git a/myapps/template/src/inc/FreeRTOSConfig.h b/myapps/template/src/inc/FreeRTOSConfig.h new file mode 100644 index 0000000..cad2227 --- /dev/null +++ b/myapps/template/src/inc/FreeRTOSConfig.h @@ -0,0 +1,118 @@ +/* USER CODE BEGIN Header */ +/* + * FreeRTOS Kernel V10.0.1 + * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ +/* USER CODE END Header */ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * These parameters and more are described within the 'configuration' section of the + * FreeRTOS API documentation available on the FreeRTOS.org web site. + * + * See http://www.freertos.org/a00110.html + *----------------------------------------------------------*/ + +/* USER CODE BEGIN Includes */ +/* Section where include file can be added */ +/* USER CODE END Includes */ + +/* Ensure definitions are only used by the compiler, and not by the assembler. */ +#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) + #include + extern uint32_t SystemCoreClock; +#endif +#define configENABLE_FPU 0 +#define configENABLE_MPU 0 + +#define configUSE_PREEMPTION 1 +#define configSUPPORT_STATIC_ALLOCATION 0 +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( SystemCoreClock ) +#define configTICK_RATE_HZ ((TickType_t)1000) +#define configMAX_PRIORITIES ( 7 ) +#define configMINIMAL_STACK_SIZE ((uint16_t)128) +#define configTOTAL_HEAP_SIZE ((size_t)3072) +#define configMAX_TASK_NAME_LEN ( 16 ) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configUSE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 8 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +/* USER CODE BEGIN MESSAGE_BUFFER_LENGTH_TYPE */ +/* Defaults to size_t for backward compatibility, but can be changed + if lengths will always be less than the number of bytes in a size_t. */ +#define configMESSAGE_BUFFER_LENGTH_TYPE size_t +/* USER CODE END MESSAGE_BUFFER_LENGTH_TYPE */ + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xQueueGetMutexHolder 1 +#define INCLUDE_eTaskGetState 1 + +/* Normal assert() semantics without relying on the provision of an assert.h +header file. */ +/* USER CODE BEGIN 1 */ +#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } +/* USER CODE END 1 */ + +/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS +standard names. */ +#define vPortSVCHandler SVC_Handler +#define xPortPendSVHandler PendSV_Handler + +/* IMPORTANT: This define is commented when used with STM32Cube firmware, when the timebase source is SysTick, + to prevent overwriting SysTick_Handler defined within STM32Cube HAL */ + +#define xPortSysTickHandler SysTick_Handler + +/* USER CODE BEGIN Defines */ +/* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */ +/* USER CODE END Defines */ + +#endif /* FREERTOS_CONFIG_H */ diff --git a/myapps/template/src/main.c b/myapps/template/src/main.c new file mode 100644 index 0000000..0fbd182 --- /dev/null +++ b/myapps/template/src/main.c @@ -0,0 +1,119 @@ + + +#define LED_Pin LL_GPIO_PIN_4 +#define LED_GPIO_Port GPIOA + +#define LED1_Pin LL_GPIO_PIN_5 +#define LED1_GPIO_Port GPIOA + +#include "stm32g0xx_ll_rcc.h" +#include "stm32g0xx_ll_bus.h" +#include "stm32g0xx_ll_crs.h" +#include "stm32g0xx_ll_system.h" +#include "stm32g0xx_ll_exti.h" +#include "stm32g0xx_ll_cortex.h" +#include "stm32g0xx_ll_utils.h" +#include "stm32g0xx_ll_pwr.h" +#include "stm32g0xx_ll_dma.h" +#include "stm32g0xx_ll_gpio.h" +#include "my_printf.h" + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +void SystemClock_Config(void) +{ + LL_FLASH_SetLatency(LL_FLASH_LATENCY_2); + while(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_2); + + /* HSI configuration and activation */ + LL_RCC_HSI_Enable(); + while(LL_RCC_HSI_IsReady() != 1); + + /* Main PLL configuration and activation */ + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI, LL_RCC_PLLM_DIV_1, 8, LL_RCC_PLLR_DIV_2); + LL_RCC_PLL_Enable(); + LL_RCC_PLL_EnableDomain_SYS(); + while(LL_RCC_PLL_IsReady() != 1); + + /* Set AHB prescaler*/ + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + + /* Sysclk activation on the main PLL */ + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL); + + /* Set APB1 prescaler*/ + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); + LL_Init1msTick(64000000); + /* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */ + LL_SetSystemCoreClock(64000000); +} + + +void task1(void *pvParameters) +{ + (void)(pvParameters); // Suppress "unused parameter" warning + + while (1) + { + LL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); + printf("LED0\r\n"); + vTaskDelay(500); + } +} + +void task2(void *pvParameters) +{ + (void)(pvParameters); // Suppress "unused parameter" warning + + while (1) + { + LL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); + printf("LED1\r\n"); + vTaskDelay(700); + } +} + + +int main(void) +{ + BaseType_t xReturned; + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG); + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); + /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral */ + //LL_SYSCFG_DisableDBATT(LL_SYSCFG_UCPD1_STROBE | LL_SYSCFG_UCPD2_STROBE); + + SystemClock_Config(); + my_printf_config(115200); + + LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); + LL_GPIO_SetPinMode(LED_GPIO_Port, LED_Pin, LL_GPIO_MODE_OUTPUT); + LL_GPIO_SetPinMode(LED1_GPIO_Port, LED1_Pin, LL_GPIO_MODE_OUTPUT); + + /* Create task 1 */ + xReturned = xTaskCreate( + task1, // Task function point + "Task1", // Task name + configMINIMAL_STACK_SIZE, // Use the minimum stack size, each take 4 bytes(32bit) + NULL, // Parameters + 2, // Priority + NULL); // Task handler + while (xReturned != pdPASS); + + /* Create other task*/ + xReturned = xTaskCreate( + task2, // Task function point + "Task2", // Task name + configMINIMAL_STACK_SIZE, // Use the minimum stack size, each take 4 bytes(32bit) + NULL, // Parameters + 2, // Priority + NULL); // Task handler + while (xReturned != pdPASS); + + vTaskStartScheduler(); + return 0; +} +