自家製アルマイト処理のやり方

何だと思う?これね、ミキプルーンの苗木。

はじめに

WMMC Advent Calendar 2024,12/11の記事です。

 https://adventar.org/calendars/10226

昨日はTanaportくんの ”クラシックの改良機体の話”でした。

ちょうど書き込みをuartから変えたかったので嬉しい記事です。

必要なもの

  • チタン線(アルミ線でも可)(少なくともφ3くらいないとアッチアチになっちゃうかも)
  • 鉛シート
  • 硫酸(10%くらいのはamazonで売ってます.自動車のバッテリー液(濃度30%くらいらしい)あればそれがいいです.)
  • 直流安定化電源(30V,30Aくらい出る奴がいい.自動車のバッテリー充電器でいい)
  • 温度計(ガラスじゃないと溶けます)
  • 蒸留水
  • ホーロー鍋×2
  • プラボックス
  • ビーカー×1
  • 普通鍋×1
  • 氷+袋or保冷剤
  • ワニ口クリップ(並みのミノムシだと溶けます)
  • ガスコンロ
  • 中性洗剤
  • ゴム手袋
  • 無水アルコール
  • パイプユニッシュ
  • 蒸留水
  • 染料(布用のやつ)
  • 木の棒(絶縁で熱に強いやつ.割りばしとか)

手順

磨き→洗浄→陽極酸化処理→染色→封孔処理

1.磨き

目的

目立った傷やバリがあれば磨いておく.

工程

バリ取り→1000~2000番くらいで研磨

2.洗浄

目的

アルミ表面の水性,油性の汚れ,金属粉を落とす.

工程

ゴム手袋を着用

中性洗剤で洗う→脱脂剤(無水エタノールとかフラックスクリーナーとか)で脱脂→蒸留水洗い

(アルミ表面が元から酸化してる場合)

ビーカーに染めたいものとパイプユニッシュ入れて3分くらいあっためる.(ちょっとシュワシュワしたら終わり.やりすぎるとアルミがちっちゃくなっちゃう)→蒸留水洗い

3.陽極酸化処理

目的

アルミ全体にちっちゃい孔開けまくる

工程

準備

  • 染めたいもの
  • チタン線(アルミ線でも可)
  • 氷+袋or保冷剤
  • ゴム手
  • 硫酸
  • 蒸留水
  • プラボックス
  • 電源
  • 鉛シート
  • 温度計

やってみる

まずは下の状態で10秒10~15V.ちょいとシュワっとしたらおk(表面の金属粉を落とせます.)

チタンやアルミの線を巻き付けた箇所は染まらないので,目立たない場所に巻き付けてください.

次に±入れ替えて,氷+袋or保冷剤,温度計を入れて20度以下に保ちながら30min~45minやります.(温度結構ムズイ)シュワシュワします

途中で泡が出なくなったら鉛板を新しいやつに変えてみてください

終わったらすぐに蒸留水洗浄!!空気に触れる時間は短くしてください.

5.染色

目的

とうとうアルミを染める.

さっき開けたちっちゃい孔に染料を押し込む.

工程

準備

  • 蒸留水
  • 染めたいアルミ
  • 布用の染色剤
  • 温度計(さっきの使う場合は蒸留水で洗ってからにしてください.)
  • コンロ

やってみる

鍋に染めたいアルミと蒸留水入れて,布用の染色剤を規定よりちょい多めに入れます.

火にかけて50度で15~30分煮ます.(IHでもいい)(ときどき引き上げてアルミの色見ながら染料の量を調整)

終わったらすぐ蒸留水で洗います.

6.封孔処理

目的

染料が入った孔を閉じる

工程

準備

  • ホーロー鍋
  • 染めたいアルミ
  • 蒸留水
  • コンロ
  • 温度計

やってみる

蒸留水を火にかけて,95~100度に熱します.そこにアルミをドボン.

30分間煮続けます.

(他の記事ではPHが5.5~6.5に保つのがいいって書いてあったけど,水ってあっためるとPH下がるので混ぜものいらないらしいです.インターネットが言ってました.)

完成

左がbeforeで右がafter.

お疲れさまでした.

下書きみたいな記事で良くないので時間があれば書き直します.質問には答えます.

学生大会の振り返り

全然ダメで泣きました.

妖怪泣きオタク専用車両がなかったので仕方なく普通車両に乗りました.

つくばエクスプレスの皆さんごめんなさい.

おわりに

次回のアドカレはTanaportくんの”ROS2でいろいろやるよ”です.ROS2使ってみたいからとっても楽しみ.

STM32CubeMX,VScode,C++開発環境構築

もうええでしょう!CubeIDEは。最もフィジカルで,最もプリミティブで,そして最もフェティッシュなやり方かどうかは分かりませんが,2024/09/09現在の自分の環境構築のやり方を未来の子供たちのために遺します.長いですが,コピペの繰り返しです.

はじめに

  1. ペリフェラルの初期化コードはSTM32CubeMX
  2. 自前コードはVSCode&C++
  3. デバックは未実装

参考:

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を解凍

フォルダやらファイルやら整理.

  1. Cドライブ直下にtoolsというフォルダを作ります.(ほんとは名前も場所もなんでもいいと思う.)
  2. 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
  3. そしたら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に拡張機能入れる

  • C/C++
  • Cortex-Debug

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
  */