#THIS FILE IS AUTO GENERATED FROM THE TEMPLATE! DO NOT CHANGE!
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION 1)
cmake_minimum_required(VERSION 3.23)# specify cross-compilers and tools
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
set(CMAKE_AR arm-none-eabi-ar)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(SIZE arm-none-eabi-size)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)# project settings
project(freeRTOS_demo C CXX ASM)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)#Uncomment for hardware floating point
add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)#Uncomment for software floating point
#add_compile_options(-mfloat-abi=soft)add_compile_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork)
add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)# uncomment to mitigate c++17 absolute addresses warnings
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register")# Enable assembler files preprocessing
add_compile_options($<$:-x$assembler-with-cpp>)if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")message(STATUS "Maximum optimization for speed")add_compile_options(-Ofast)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")message(STATUS "Maximum optimization for speed, debug info included")add_compile_options(-Ofast -g)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")message(STATUS "Maximum optimization for size")add_compile_options(-Os)
else ()message(STATUS "Minimal optimization, debug info included")add_compile_options(-Og -g)
endif ()include_directories(FreeRTOS/Source/includeFreeRTOS/Source/portable/GCC/ARM_CM4FCore/Inc Drivers/STM32F4xx_HAL_Driver/Inc Drivers/STM32F4xx_HAL_Driver/Inc/Legacy Drivers/CMSIS/Device/ST/STM32F4xx/Include Drivers/CMSIS/Include)add_definitions(-DUSE_HAL_DRIVER -DSTM32F407xx)file(GLOB_RECURSE SOURCES "startup/*.*" "Drivers/*.*" "Core/*.*" "FreeRTOS/*.*")set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32F407IGTx_FLASH.ld)add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)
add_link_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork)
add_link_options(-T ${LINKER_SCRIPT})add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -Oihex $ ${HEX_FILE}COMMAND ${CMAKE_OBJCOPY} -Obinary $ ${BIN_FILE}COMMENT "Building ${HEX_FILE}
Building ${BIN_FILE}")
main
/* USER CODE BEGIN Header */
/********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention** © Copyright (c) 2022 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********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "bsp_led.h"#define USE_FREERTOS //是否使用freeRTOS//如果要使用freeRTOS需要注意cmake里include要添加
// FreeRTOS/Source/include
//FreeRTOS/Source/portable/GCC/ARM_CM4F
//且GLOB_RECURSE要添加"FreeRTOS/*.*"
//同时以下的这些要取消注释
//add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
//add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
//add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)// 如果不使用freeRTOS,上述的要注释掉#ifdef USE_FREERTOS#include "FreeRTOS.h"
#include "task.h"static TaskHandle_t xHandleTaskLED1 = NULL;
static TaskHandle_t xHandleTaskLED2 = NULL;
static TaskHandle_t xHandleTaskLED3 = NULL;/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
static void vTaskLED1(void *pvParameters);
static void vTaskLED2(void *pvParameters);
static void vTaskLED3(void *pvParameters);
static void AppTaskCreate (void);void vTaskLED1(void *pvParameters)
{while(1){LED_StateSet(LED_ID_1,LED_TOGGLE);vTaskDelay(1000);}
}void vTaskLED2(void *pvParameters)
{while(1){LED_StateSet(LED_ID_2,LED_TOGGLE);vTaskDelay(2000);}
}void vTaskLED3(void *pvParameters)
{while(1){LED_StateSet(LED_ID_3,LED_TOGGLE);vTaskDelay(3000);}
}void AppTaskCreate (void)
{xTaskCreate( vTaskLED1, /* 任务函数 */"vTaskLED1", /* 任务名 */512, /* 任务栈大小,单位word,也就是4字节 */NULL, /* 任务参数 */1, /* 任务优先级*/&xHandleTaskLED1 ); /* 任务句柄 */xTaskCreate( vTaskLED2, /* 任务函数 */"vTaskLED2", /* 任务名 */512, /* 任务栈大小,单位word,也就是4字节 */NULL, /* 任务参数 */2, /* 任务优先级*/&xHandleTaskLED2 ); /* 任务句柄 */xTaskCreate( vTaskLED3, /* 任务函数 */"vTaskLED3", /* 任务名 */512, /* 任务栈大小,单位word,也就是4字节 */NULL, /* 任务参数 */3, /* 任务优先级*/&xHandleTaskLED3 ); /* 任务句柄 */}#endif
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();// 初始化LEDLED_GPIO_Init();#ifndef USE_FREERTOS// 没有用freeRTOS的测试方法LED_GPIO_Test();
#else// 使用freeRTOSAppTaskCreate();/* 启动调度,开始执行任务 */vTaskStartScheduler();#endif}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Configure the main internal regulator output voltage*/__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLM = 8;RCC_OscInitStruct.PLL.PLLN = 168;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;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_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){Error_Handler();}
}/*** @brief GPIO Initialization Function* @param None* @retval None*/
static void MX_GPIO_Init(void)
{/* GPIO Ports Clock Enable */__HAL_RCC_GPIOH_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef USE_FULL_ASSERT
/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
bsp_led.h
//
// Created by hao on 2022/8/17.
//#ifndef MY_BASIC_BSP_LED_H
#define MY_BASIC_BSP_LED_H#include "stm32f4xx_hal.h"#define LED_1_RCC_CLK_ENABLE() __HAL_RCC_GPIOH_CLK_ENABLE()
#define LED_1_GPIO_PIN GPIO_PIN_9
#define LED_1_GPIOx GPIOH#define LED_2_RCC_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
#define LED_2_GPIO_PIN GPIO_PIN_5
#define LED_2_GPIOx GPIOE#define LED_3_RCC_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
#define LED_3_GPIO_PIN GPIO_PIN_6
#define LED_3_GPIOx GPIOEtypedef enum {LED_ON = 0,LED_OFF = 1,LED_TOGGLE = 2,
}LED_State_TypeDef;typedef enum {LED_ID_1 = 1,LED_ID_2 = 2,LED_ID_3 = 3,}LED_ID_TypeDef;#define IS_LED_ID_TYPEDEF(id) (((id) == LED_ID_1) || ((id) == LED_ID_2) || (id) == LED_ID_3))
#define IS_LED_State_TypeDef(state) (((state) == LED_ON) || ((state) == LED_OFF) || ((state) == LED_TOGGLE))void LED_GPIO_Init();void LED_StateSet(LED_ID_TypeDef id,LED_State_TypeDef state);void LED_GPIO_Test();
#endif //USE_LED
bsp_led.c
//
// Created by hao on 2022/8/17.
//#include "bsp_led.h"
void LED_GPIO_Init(){/* 定义IO硬件初始化结构体变量 */GPIO_InitTypeDef GPIO_InitStruct;LED_1_RCC_CLK_ENABLE();HAL_GPIO_WritePin(LED_1_GPIOx, LED_1_GPIO_PIN, GPIO_PIN_RESET);GPIO_InitStruct.Pin = LED_1_GPIO_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(LED_1_GPIOx, &GPIO_InitStruct);LED_2_RCC_CLK_ENABLE();HAL_GPIO_WritePin(LED_2_GPIOx, LED_2_GPIO_PIN, GPIO_PIN_RESET);GPIO_InitStruct.Pin = LED_2_GPIO_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(LED_2_GPIOx, &GPIO_InitStruct);LED_3_RCC_CLK_ENABLE();HAL_GPIO_WritePin(LED_3_GPIOx, LED_3_GPIO_PIN, GPIO_PIN_RESET);GPIO_InitStruct.Pin = LED_3_GPIO_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(LED_3_GPIOx, &GPIO_InitStruct);}void LED_StateSet(LED_ID_TypeDef id,LED_State_TypeDef state){assert_param(IS_LED_ID_TYPEDEF(LEDx));assert_param(IS_LED_State_TypeDef(LEDx));switch (state) {case LED_ON:switch (id) {case LED_ID_1:HAL_GPIO_WritePin(LED_1_GPIOx,LED_1_GPIO_PIN,GPIO_PIN_SET);break;case LED_ID_2:HAL_GPIO_WritePin(LED_2_GPIOx,LED_2_GPIO_PIN,GPIO_PIN_SET);break;case LED_ID_3:HAL_GPIO_WritePin(LED_3_GPIOx,LED_3_GPIO_PIN,GPIO_PIN_SET);break;default:break;}break;case LED_OFF:switch (id) {case LED_ID_1:HAL_GPIO_WritePin(LED_1_GPIOx,LED_1_GPIO_PIN,GPIO_PIN_RESET);break;case LED_ID_2:HAL_GPIO_WritePin(LED_2_GPIOx,LED_2_GPIO_PIN,GPIO_PIN_RESET);break;case LED_ID_3:HAL_GPIO_WritePin(LED_3_GPIOx,LED_3_GPIO_PIN,GPIO_PIN_RESET);break;default:break;}break;case LED_TOGGLE:switch (id) {case LED_ID_1:HAL_GPIO_TogglePin(LED_1_GPIOx,LED_1_GPIO_PIN);break;case LED_ID_2:HAL_GPIO_TogglePin(LED_2_GPIOx,LED_2_GPIO_PIN);break;case LED_ID_3:HAL_GPIO_TogglePin(LED_3_GPIOx,LED_3_GPIO_PIN);break;default:break;}break;default:break;}}void LED_GPIO_Test(){int count =0;while (2){switch (count%3) {case 0:LED_StateSet(LED_ID_1,LED_ON);LED_StateSet(LED_ID_2,LED_OFF);LED_StateSet(LED_ID_3,LED_OFF);break;case 1:LED_StateSet(LED_ID_1,LED_OFF);LED_StateSet(LED_ID_2,LED_ON);LED_StateSet(LED_ID_3,LED_OFF);break;case 2:LED_StateSet(LED_ID_1,LED_OFF);LED_StateSet(LED_ID_2,LED_OFF);LED_StateSet(LED_ID_3,LED_ON);break;default:break;}count++;if(count==1000)count=0;HAL_Delay(1000);}}