もうええでしょう!CubeIDEは。 最もフィジカルで,最もプリミティブで,そして最もフェティッシュなやり方かどうかは分かりませんが,2024/09/09現在の自分の環境構築のやり方を未来の子供たちのために遺します.長いですが,コピペの繰り返しです.
はじめに
ペリフェラルの初期化コードはSTM32CubeMX
自前コードはVSCode&C++
デバックは未実装
参考:
VSCodeでSTM32の開発するためのメモ(Windows+CubeMX+Makefile+VSCodeでSTM32のデバッグ) #VSCode – Qiita
俺が考えた最強のSTM32開発環境構築(STM32CubeMX, OpenOCD, Semihosting, VSCode and C++) #VSCode – Qiita
環境というかツールというか
Windows11Home:23H2(Win10Pro:22H2でも確認済み)
VSCode:1.9.3
STM32CubeMX:6.12.0
Make for Windows:3.8.1
LibIntl for Windows:0.14.4
LibIconv for Windows:1.9.2
GNU Arm Embedded Toolchain:gcc-arm-none-eabi-10.3-2021.10-win32
諸々のダウンロードとインストール
windows11Home:23H2
Win11カッコよくて好き。Win10でもできます。
VSCode:1.9.3
今はcursorっていうAIがお世話してくれるエディター使ってます。今回の解説はvscodeでやります。でもcursorの人もまるっと同じです。
STM32CubeMX:6.12.0
ダウンロード
https://www.st.com/ja/development-tools/stm32cubemx.html
ここのSTM32CubeMX-Win:最新バージョンを取得.心配なら右のバージョンを選択から,6.12.0を選んで僕とお揃いにしてください.
インストール
脳死で次へ連打.
Make for Windows:3.8.1
ダウンロード
https://gnuwin32.sourceforge.net/packages/make.htm
これの”Binaries”のZipをダウンロード.
インストール
zipを解凍
LibIntl for Windows:0.14.4
ダウンロード
https://gnuwin32.sourceforge.net/packages/libintl.htm
これの”Binaries”のZipをダウンロード.
インストール
zipを解凍
LibIconv for Windows:1.9.2
ダウンロード
https://gnuwin32.sourceforge.net/packages/libiconv.htm
これの”Binaries”のZipをダウンロード.
インストール
zipを解凍
GNU Arm Embedded Toolchain:gcc-arm-none-eabi-10.3-2021.10-win32
ダウンロード
https://developer.arm.com/downloads/-/gnu-rm
これの”gcc-arm-none-eabi-10.3-2021.10-win32.zip”をダウンロード
直リン:https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-win32.zip?rev=8f4a92e2ec2040f89912f372a55d8cf3&hash=5569B4C322E49BB400BFB63567A4B33B
インストール
zipを解凍
フォルダやらファイルやら整理.
Cドライブ直下にtoolsというフォルダを作ります.(ほんとは名前も場所もなんでもいいと思う.)
C:/toolsの中にこれらを入れてください(もちろん解凍済みのやつ)
Make for Windows:3.8.1
LibIntl for Windows:0.14.4
LibIconv for Windows:1.9.2
GNU Arm Embedded Toolchain:gcc-arm-none-eabi-10.3-2021.10-win32
そしたらLibIntl for Windows:0.14.4のbinの中身,LibIconv for Windows:1.9.2のbinの中身のファイル達をMake for Windows:3.8.1のbinの中に入れてください.
LibIntlはこれ.
libIconvはこれ.
C:/tools/make-3.81-bin/bin の中に入れたらこうなるはず.
C:/toolsの中身は最終こうなってると思う.このうちlibconv-1.92-1-binとlibintl-0.14.4-binはbinの中身に用があったんでもう消してもいいです.
VSCodeに拡張機能入れる
CubeMXの設定
今回使うマイコンはSTM32F405RGT6です。(他のマイコンでもやることは一緒。)
最初の画面の上のとこからFile->NewProjectで下の画像みたいになるので,Commercial Part Numberに自分の使ってるマイコンの名前入れて,StartProject押してください.
とりあえずペリフェラル決めて.(ペリフェラルの設定の話は本筋じゃないので飛ばします)
ProjectManager -> ProjectName を適当に決めて.(今回はtest)
Toolchain/IDE をMakefileにします.
そしたらGENERATE CODEをポチ.こんなんなってる雰囲気.
VSCodeでtasks.json,c_cpp_properties.json,
Makefileの編集
編集の前に
main.cをmian.cppにしてください.下の解説ではmain.cのままだけど.(すみません)
main.cをmain.cppにしたら
VSCodeでさっきつくったCubeMXのプロジェクトフォルダを開いてください.
.vscodeっていうフォルダをtest直下に作って,そんなかにtasks.jsonとc_cpp_properties.jsonっていうファイルを作ってください.こんな感じ.
tasks.json
これまんま貼ってください。
{
"version": "2.0.0",
"type": "shell",
"echoCommand": true,
"tasks": [
{
"label": "Build project",
"command": "make",
"problemMatcher": "$gcc",
"group": {
"kind": "build",
"isDefault": true
},
"args": [
"all",
"-j16",
"GCC_PATH=C:/tools/gcc-arm-none-eabi-10.3-2021.10-win32/gcc-arm-none-eabi-10.3-2021.10/bin"
],
"options": {
"env": {
"PATH": "C:/tools/make-3.81-bin/bin",
}
},
},
{
"label": "Clean project",
"command": "make",
"problemMatcher": "$gcc",
"group": {
"kind": "build",
"isDefault": false
},
"args": [
"clean"
],
"options": {
"env": {
"PATH": "C:/tools/make-3.81-bin/bin",
}
},
}
]
}
ところどころ”PATH”って書いてあるところがあるんでそれだけちょろっと.
GCC_PATH
色んなコンパイラがいっぱい入ってるパス(だと思ってる)
2000年後,ファイル構造がまんま同じとは限らないので中身がこんなんなってる場所のパスを書いてください.
PATH
makeが入ってるパス.windows for make のbinです.
2000年後のために.
c_cpp_properties
これまんま貼ってください.
{
"configurations": [
{
"name": "STM32",
"includePath": [
"${workspaceFolder}/**",
"C:/tools/gcc-arm-none-eabi-10.3-2021.10-win32/gcc-arm-none-eabi-10.3-2021.10/arm-none-eabi/include**",
"C:/tools/gcc-arm-none-eabi-10.3-2021.10-win32/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/include"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE",
"STM32F405xx",
"USE_HAL_DRIVER",
"__weak=__attribute__((weak))"
],
"compilerPath": "C:/tools/gcc-arm-none-eabi-10.3-2021.10-win32/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-g++.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-arm"
}
],
"version": 4
}
人によって違うところをちょっと.
includePath
“C:/tools/gcc-arm-none-eabi-10.3-2021.10-win32/gcc-arm-none-eabi-10.3-2021.10/arm-none-eabi/include**”
ヘッダファイルがたくさんあるとこ.**を忘れずに.
2000年後のために.
“C:/tools/gcc-arm-none-eabi-10.3-2021.10-win32/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/include”
いやここにもあるんかい.二手目でlibフォルダ入るんで気を付けて.**は要りません.
2000年後のために.
defines
“STM32F405xx”のとこ,人によっては”STM32F446xx”とか”STMF303xx”とかになるはず.makefileの#ASMsorcesってとこ見るとわかる.(STM32F405xxって適当に書いてみたらなんか出来て,そのあとmakefile見たらこれが書いてあっただけで,definesとの関係はかなり謎.)
# ASM sources
ASM_SOURCES = \
startup_stm32f405xx.s
compilerPath
arm-none-eabi-g++.exeのパス.さっきのGCC_PATHの中にあります.
Makefile
Makefileいじる前にちょっとフォルダ整理
自前のコードと生成されたコードわけると,makefileがすこし綺麗になるので.こんな感じでフォルダつくって,Srcには自前ソースファイル,Incには自前ヘッダファイルを入れると分かり易い.(SrcとIncに直してください.)
test - App - Src
- Inc
Makefileいじるぞー
僕と階層構造が一緒の人はこれをコピペしてください.コンパイルできないときは,tabの部分がコピペされてない可能性があるので手動で打ち直してみてください.makefileはtabとスペースが明確に違うらしいです.
##########################################################################################################################
# File automatically-generated by tool: [projectgenerator] version: [4.4.0-B60] date: [Sun Sep 08 14:14:30 JST 2024]
##########################################################################################################################
# ------------------------------------------------
# Generic Makefile (based on gcc)
#
# ChangeLog :
# 2017-02-10 - Several enhancements + project update mode
# 2015-07-22 - first version
# ------------------------------------------------
######################################
# target
######################################
TARGET =test
######################################
# building variables
######################################
# debug build?
DEBUG = 1
# optimization
OPT = -Og
#######################################
# paths
#######################################
# Build path
BUILD_DIR = build
######################################
# source
######################################
# C sources
C_SOURCES = \
Core/Src/stm32f4xx_it.c \
Core/Src/stm32f4xx_hal_msp.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_adc.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c \
Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c \
Core/Src/system_stm32f4xx.c \
Core/Src/sysmem.c \
Core/Src/syscalls.c \
# CPP sources
CPP_SOURCES = \
$(wildcard Core/Src/*.cpp) \
$(wildcard App/Src/*.cpp)\
# ASM sources
ASM_SOURCES = \
startup_stm32f405xx.s
# ASM sources
ASMM_SOURCES =
#######################################
# binaries
#######################################
PREFIX = arm-none-eabi-
# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
# either it can be added to the PATH environment variable.
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
CXX = $(GCC_PATH)/$(PREFIX)g++
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
else
CC = $(PREFIX)gcc
CXX = $(PREFIX)g++
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S
#######################################
# CFLAGS
#######################################
# cpu
CPU = -mcpu=cortex-m4
# fpu
FPU = -mfpu=fpv4-sp-d16
# float-abi
FLOAT-ABI = -mfloat-abi=hard
# mcu
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
# macros for gcc
# AS defines
AS_DEFS =
# C defines
C_DEFS = \
-DUSE_HAL_DRIVER \
-DSTM32F405xx
#Cpp defines
CPP_DEFS = \
-DUSE_HAL_DRIVER\
-DSTM32F405xx
# AS includes
AS_INCLUDES =
# C includes
C_INCLUDES = \
-ICore/Inc \
-IDrivers/STM32F4xx_HAL_Driver/Inc \
-IDrivers/STM32F4xx_HAL_Driver/Inc/Legacy \
-IDrivers/CMSIS/Device/ST/STM32F4xx/Include \
-IDrivers/CMSIS/Include\
# Cpp includes
CPP_INCLUDES = $(C_INCLUDES)
CPP_INCLUDES += \
-ICore/Inc \
-IApp/Inc \
# compile gcc flags
ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
CFLAGS += $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
ifeq ($(DEBUG), 1)
CFLAGS += -g -gdwarf-2
endif
# Generate dependency information
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
# compile g++ flags
CPPFLAGS = $(MCU) $(CPP_DEFS) $(CPP_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections
# Generate dependency information
CPPFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
CPPFLAGS += -std=c++17 -Wall -Wextra -Werror -pedantic
#######################################
# LDFLAGS
#######################################
# link script
LDSCRIPT = STM32F405RGTx_FLASH.ld
# libraries
LIBS = -lc -lm -lnosys
LIBS += -lrdimon
LIBS += -lstdc++
LIBDIR =
LDFLAGS = $(MCU) -specs=nano.specs -u_printf_float -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections,-print-memory-usage
# default action: build all
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(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 c++ objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(CPP_SOURCES:.cpp=.o)))
vpath %.cpp $(sort $(dir $(CPP_SOURCES)))
# list of ASM program objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASMM_SOURCES:.S=.o)))
vpath %.S $(sort $(dir $(ASMM_SOURCES)))
$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR)
$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@
$(BUILD_DIR)/%.o: %.cpp Makefile | $(BUILD_DIR)
$(CXX) -c $(CPPFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.cpp=.lst)) $< -o $@
$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
$(AS) -c $(CFLAGS) $< -o $@
$(BUILD_DIR)/%.o: %.S Makefile | $(BUILD_DIR)
$(AS) -c $(CFLAGS) $< -o $@
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
$(CXX) $(OBJECTS) $(LDFLAGS) -o $@
$(SZ) $@
$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
$(HEX) $< $@
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
$(BIN) $< $@
$(BUILD_DIR):
mkdir $@
#######################################
# clean up
#######################################
clean:
ifeq ($(OS),Windows_NT)
del /F /Q $(BUILD_DIR)\* 2>NUL
for /D %%p in ($(BUILD_DIR)\*) do rmdir /S /Q "%%p"
else
rm -rf $(BUILD_DIR)/*
endif
#######################################
# dependencies
#######################################
-include $(wildcard $(BUILD_DIR)/*.d)
# *** EOF ***
やっと動作確認
想定動作
ctrl+shift+bでbuildフォルダにbuild結果格納.
ctrl+shift+pでコマンドパレット?開いてTask:Run Task->Build Projectでbuild.Clean Projectでbuildの中身消去(前の結果が残ってると変なになることがある.かも.)
実際
こんな感じでbinファイルやらelfファイルがbuildフォルダに無事に出来たらおk.
書き込みはj-linkだとvscode完結できるみたいです.自分は情けないことにuartで書き込んでいるのでCubeProgrammerのお世話になっております.
お疲れ様です
tasks.json,c_cpp_properties,makefileについては自分もよくわかってないんですが,時間が無限にあれば少し解説を追記しようと思います.
memo
Core/Src/main.cpp:124:44: error: missing initializer for member 'RCC_OscInitTypeDef::HSEState' [-Werror=missing-field-initializers]
124 | RCC_OscInitTypeDef RCC_OscInitStruct = {0};
| ^
Core/Src/main.cpp:124:44: error: missing initializer for member 'RCC_OscInitTypeDef::LSEState' [-Werror=missing-field-initializers]
Core/Src/main.cpp:124:44: error: missing initializer for member 'RCC_OscInitTypeDef::HSIState' [-Werror=missing-field-initializers]
Core/Src/main.cpp:124:44: error: missing initializer for member 'RCC_OscInitTypeDef::HSICalibrationValue' [-Werror=missing-field-initializers]
Core/Src/main.cpp:124:44: error: missing initializer for member 'RCC_OscInitTypeDef::LSIState' [-Werror=missing-field-initializers]
Core/Src/main.cpp:124:44: error: missing initializer for member 'RCC_OscInitTypeDef::PLL' [-Werror=missing-field-initializers]
Core/Src/main.cpp:125:44: error: missing initializer for member 'RCC_ClkInitTypeDef::SYSCLKSource' [-Werror=missing-field-initializers]
125 | RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
| ^
Core/Src/main.cpp:125:44: error: missing initializer for member 'RCC_ClkInitTypeDef::AHBCLKDivider' [-Werror=missing-field-initializers]
Core/Src/main.cpp:125:44: error: missing initializer for member 'RCC_ClkInitTypeDef::APB1CLKDivider' [-Werror=missing-field-initializers]
Core/Src/main.cpp:125:44: error: missing initializer for member 'RCC_ClkInitTypeDef::APB2CLKDivider' [-Werror=missing-field-initializers]
Core/Src/main.cpp: In function 'void MX_TIM2_Init()':
Core/Src/main.cpp:176:49: error: missing initializer for member 'TIM_ClockConfigTypeDef::ClockPolarity' [-Werror=missing-field-initializers]
176 | TIM_ClockConfigTypeDef sClockSourceConfig = {0};
| ^
Core/Src/main.cpp:176:49: error: missing initializer for member 'TIM_ClockConfigTypeDef::ClockPrescaler' [-Werror=missing-field-initializers]
Core/Src/main.cpp:176:49: error: missing initializer for member 'TIM_ClockConfigTypeDef::ClockFilter' [-Werror=missing-field-initializers]
Core/Src/main.cpp:177:45: error: missing initializer for member 'TIM_MasterConfigTypeDef::MasterSlaveMode' [-Werror=missing-field-initializers]
177 | TIM_MasterConfigTypeDef sMasterConfig = {0};
| ^
Core/Src/main.cpp:178:36: error: missing initializer for member 'TIM_OC_InitTypeDef::Pulse' [-Werror=missing-field-initializers]
178 | TIM_OC_InitTypeDef sConfigOC = {0};
| ^
Core/Src/main.cpp:178:36: error: missing initializer for member 'TIM_OC_InitTypeDef::OCPolarity' [-Werror=missing-field-initializers]
Core/Src/main.cpp:178:36: error: missing initializer for member 'TIM_OC_InitTypeDef::OCNPolarity' [-Werror=missing-field-initializers]
Core/Src/main.cpp:178:36: error: missing initializer for member 'TIM_OC_InitTypeDef::OCFastMode' [-Werror=missing-field-initializers]
Core/Src/main.cpp:178:36: error: missing initializer for member 'TIM_OC_InitTypeDef::OCIdleState' [-Werror=missing-field-initializers]
Core/Src/main.cpp:178:36: error: missing initializer for member 'TIM_OC_InitTypeDef::OCNIdleState' [-Werror=missing-field-initializers]
Core/Src/main.cpp: In function 'void MX_GPIO_Init()':
Core/Src/main.cpp:263:40: error: missing initializer for member 'GPIO_InitTypeDef::Mode' [-Werror=missing-field-initializers]
263 | GPIO_InitTypeDef GPIO_InitStruct = {0};
| ^
Core/Src/main.cpp:263:40: error: missing initializer for member 'GPIO_InitTypeDef::Pull' [-Werror=missing-field-initializers]
Core/Src/main.cpp:263:40: error: missing initializer for member 'GPIO_InitTypeDef::Speed' [-Werror=missing-field-initializers]
Core/Src/main.cpp:263:40: error: missing initializer for member 'GPIO_InitTypeDef::Alternate' [-Werror=missing-field-initializers]
そのままやるとこれみたいなエラー出る.
対処.
main.cppのprototype宣言のとこ消す.
/*ここのとこ*/
/*void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM2_Init(void);
static void MX_USART2_UART_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 */
peripheral.hつくってさっき消したやつコピペ.してstaticはずす.
#ifndef _PERIPHERAL_H_
#define _PERIPHERAL_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "main.h"
extern TIM_HandleTypeDef htim2;
extern UART_HandleTypeDef huart2;
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_TIM2_Init(void);
void MX_USART2_UART_Init(void);
#ifdef __cplusplus
}
#endif
#endif /* _PERIPHERAL_H_ */
あとmain.cppの/*Private variablesにあるやつ切り取り.externつけて貼り付け.
/* Private variables ---------------------------------------------------------*/
/*これ*/
TIM_HandleTypeDef htim2;
UART_HandleTypeDef huart2;
/*これ*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
peripheral.cはこう.main.cppのperipheralの設定貼り付ける.errorhandler以外.
#include "peripheral.h"
TIM_HandleTypeDef htim2;
UART_HandleTypeDef huart2;
/**
* @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_SCALE2);
/** 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 = 16;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
RCC_OscInitStruct.PLL.PLLQ = 7;
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_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief TIM2 Initialization Function
* @param None
* @retval None
*/
static void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 84-1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000-1;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
HAL_TIM_MspPostInit(&htim2);
}
/**
* @brief USART2 Initialization Function
* @param None
* @retval None
*/
static void MX_USART2_UART_Init(void)
{
/* USER CODE BEGIN USART2_Init 0 */
/* USER CODE END USART2_Init 0 */
/* USER CODE BEGIN USART2_Init 1 */
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
/* USER CODE END USART2_Init 2 */
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin : B1_Pin */
GPIO_InitStruct.Pin = B1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : LD2_Pin */
GPIO_InitStruct.Pin = LD2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
あとperipheral.cのstatic全外しする.だーこう.
#include "peripheral.h"
TIM_HandleTypeDef htim2;
UART_HandleTypeDef huart2;
/**
* @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_SCALE2);
/** 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 = 16;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
RCC_OscInitStruct.PLL.PLLQ = 7;
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_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief TIM2 Initialization Function
* @param None
* @retval None
*/
void MX_TIM2_Init(void)
{
/* USER CODE BEGIN TIM2_Init 0 */
/* USER CODE END TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 84-1;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000-1;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM2_Init 2 */
/* USER CODE END TIM2_Init 2 */
HAL_TIM_MspPostInit(&htim2);
}
/**
* @brief USART2 Initialization Function
* @param None
* @retval None
*/
void MX_USART2_UART_Init(void)
{
/* USER CODE BEGIN USART2_Init 0 */
/* USER CODE END USART2_Init 0 */
/* USER CODE BEGIN USART2_Init 1 */
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
/* USER CODE END USART2_Init 2 */
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin : B1_Pin */
GPIO_InitStruct.Pin = B1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : LD2_Pin */
GPIO_InitStruct.Pin = LD2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/