[電子工作] MacでSTM32の開発環境を GNU arm + OpenOCDで作ってみる - CubeMXのプロジェクトをどうにかする版 [電子工作]
いろいろリニューアル
前提環境
・MacBook Pro (15-inch, Early 2011)
・macOS Sierra バージョン 10.12.2
・make ... たぶんXCodeのコマンドラインツール
・MacPort 2.3.5 ... OpenOCDのビルド
・git ... MacPortでインストール
構築する環境
・launchpad GNU ARM Embedded Toolchain : 5-2016-q3-update
・OpenOCD : ソースからビルド, CMSIS-DAPとSTLinkに対応
・STM32CubeMX : 4.18.0
目標
・CubeMXで雛形を生成
・launchpadのGNU ARM Embedded Toolchainでビルドする
・テキストエディタ+makeで開発
・OpenOCDで書き込み & デバッグする
ターゲット
・Nucleo-F303RE ボード
おっきいボードに変えてみました
・CubeMXで雛形を生成してLチカ
手順1.arm-none-eabi-gccの入手
お手軽にlaunchpadからバイナリを入手します。
右のDownloadsのリストから、gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2をダウンロードし、
~/gcc_arm下に展開します。
(makefile使い回しの都合上、展開フォルダ名を変更しました)
手順2.OpenOCDのビルド
ソースからビルドします
makefile使い回しの都合上、HOMEディレクトリ直下に展開しています。
(Nucleoだけを使う場合はCMSIS-DAPは不要)
手順3.STM32 CubeMXの入手とインストール
STmicroのサイトからダウンロードします。
メールアドレスを入力するとダウンロードURLがメールで送られてきます。
ダウンロードしたファイル(en.stm32cubemx.zip)を展開し、SetupSTM32CubeMX-4.18.0.appを右クリック->開くで起動してインストール、、、
なのですが、理由はよくわかりませんが、Finderからインストーラが起動しません??
ターミナルを開いてzipを展開したフォルダに移動し、下記のようにインストーラを直で起動してインストールしました。
なんなんでしょうね?
インストールできたらApplicationフォルダからCubeMXを起動し、
[Help]-[Install New Libraries]で必要なMCU用のライブラリ(STM32CubeF3)をインストールします。
手順4.CubeMXでテンプレートを作成
[File]-[New Project...]を選択
[Board Selector]タブに切り替え
[Type of Board]で Nucleo64 を選択
[MCU Series]で STM32F3 を選択
[Boards List]から NUCLEO-F303RETx を選択
ペリフェラルの設定
・HSE外部クロック源 - STLinkからMCOに供給される外部クロック(8MHz)
RCC BYPASS Clock Source RCC_OSC_IN PF0-OSC_IN
・LSE外部クロック源 - Nucleoボードに載っているクリスタル(32.768KHz)
RCC Crystal/Ceramic Resonator RCC_OSC32_IN PC14-OSC32_IN
RCC Crystal/Ceramic Resonator RCC_OSC32_OUT PC15-OSC32_OUT
・SWD : SWOが使えるのかよくわからないけれど、SB15がショートされて繋がっているようなのでいちおう
SYS Trace Asynchronous Sw SYS_JTCK-SWCLK PA14
SYS Trace Asynchronous Sw SYS_JTMS-SWDIO PA13
SYS Trace Asynchronous Sw SYS_JTDO-TRACESWO PB3
・SysTickのクロック源はSystemClockで
SYS SysTick SYS_VS_Systick VP_SYS_VS_Systick
ピンラベル(使うのだけ)
Pin Nb PINs FUNCTIONs LABELs
2 PC13 GPIO_EXTI13 B1 [Blue PushButton]
21 PA5 GPIO_Output LD2 [Green Led]
プロジェクト設定
SOFTWARE PROJECT
Project Settings :
Project Name : f303re_led
Project Folder : /Users/mickey/STM32Project/f303re_led
Toolchain / IDE : SW4STM32
Firmware Package Name and Version : STM32Cube FW_F3 V1.6.0
Code Generation Settings :
STM32Cube Firmware Library Package : Copy only the necessary library files
Generate peripheral initialization as a pair of '.c/.h' files per peripheral : No
Backup previously generated files when re-generating : No
Delete previously generated files when not re-generated : Yes
Set all free pins as analog (to optimize the power consumption) : No
手順5.ちょこっとだけコードを追加
main.cの先頭の USER CODE BEGIN 0 〜 USER CODE END 0の間に以下の定義を追加
(NANO-libの初期化処理から呼ばれる)
ついでにテスト用のLチカコード
手順6.makefile
プロジェクトフォルダ直下に、下記の内容でmakefileを作ります。
前回からの変更点は以下になります
・NANO-libをリンク (加えて、-nostartfilesも指定)
・OpenOCDで焼き込みするmakeターゲット(flash)を追加
手順7.ビルド
手順8.書き込み
前提環境
・MacBook Pro (15-inch, Early 2011)
・macOS Sierra バージョン 10.12.2
・make ... たぶんXCodeのコマンドラインツール
・MacPort 2.3.5 ... OpenOCDのビルド
・git ... MacPortでインストール
構築する環境
・launchpad GNU ARM Embedded Toolchain : 5-2016-q3-update
・OpenOCD : ソースからビルド, CMSIS-DAPとSTLinkに対応
・STM32CubeMX : 4.18.0
目標
・CubeMXで雛形を生成
・launchpadのGNU ARM Embedded Toolchainでビルドする
・テキストエディタ+makeで開発
・OpenOCDで書き込み & デバッグする
ターゲット
・Nucleo-F303RE ボード
おっきいボードに変えてみました
・CubeMXで雛形を生成してLチカ
手順1.arm-none-eabi-gccの入手
お手軽にlaunchpadからバイナリを入手します。
右のDownloadsのリストから、gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2をダウンロードし、
~/gcc_arm下に展開します。
(makefile使い回しの都合上、展開フォルダ名を変更しました)
$ cd ~ $ tar jxf ~/Downloads/gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2 $ mv gcc-arm-none-eabi-5_4-2016q3 gcc-arm
手順2.OpenOCDのビルド
ソースからビルドします
makefile使い回しの都合上、HOMEディレクトリ直下に展開しています。
(Nucleoだけを使う場合はCMSIS-DAPは不要)
$ cd ~ $ sudo port install libtool autoconf texinfo libusb $ sudo port install hidapi-devel $ git clone http://repo.or.cz/r/openocd.git openocd $ cd openocd $ ./bootstrap $ ./configure --enable-stlink --enable-cmsis-dap $ make
手順3.STM32 CubeMXの入手とインストール
STmicroのサイトからダウンロードします。
メールアドレスを入力するとダウンロードURLがメールで送られてきます。
ダウンロードしたファイル(en.stm32cubemx.zip)を展開し、SetupSTM32CubeMX-4.18.0.appを右クリック->開くで起動してインストール、、、
なのですが、理由はよくわかりませんが、Finderからインストーラが起動しません??
ターミナルを開いてzipを展開したフォルダに移動し、下記のようにインストーラを直で起動してインストールしました。
なんなんでしょうね?
$ cd SetupSTM32CubeMX-4.18.0.app/Contents/MacOs/ $ ./SetupSTM32CubeMX-4_18_0_macos
インストールできたらApplicationフォルダからCubeMXを起動し、
[Help]-[Install New Libraries]で必要なMCU用のライブラリ(STM32CubeF3)をインストールします。
手順4.CubeMXでテンプレートを作成
[File]-[New Project...]を選択
[Board Selector]タブに切り替え
[Type of Board]で Nucleo64 を選択
[MCU Series]で STM32F3 を選択
[Boards List]から NUCLEO-F303RETx を選択
ペリフェラルの設定
・HSE外部クロック源 - STLinkからMCOに供給される外部クロック(8MHz)
RCC BYPASS Clock Source RCC_OSC_IN PF0-OSC_IN
・LSE外部クロック源 - Nucleoボードに載っているクリスタル(32.768KHz)
RCC Crystal/Ceramic Resonator RCC_OSC32_IN PC14-OSC32_IN
RCC Crystal/Ceramic Resonator RCC_OSC32_OUT PC15-OSC32_OUT
・SWD : SWOが使えるのかよくわからないけれど、SB15がショートされて繋がっているようなのでいちおう
SYS Trace Asynchronous Sw SYS_JTCK-SWCLK PA14
SYS Trace Asynchronous Sw SYS_JTMS-SWDIO PA13
SYS Trace Asynchronous Sw SYS_JTDO-TRACESWO PB3
・SysTickのクロック源はSystemClockで
SYS SysTick SYS_VS_Systick VP_SYS_VS_Systick
ピンラベル(使うのだけ)
Pin Nb PINs FUNCTIONs LABELs
2 PC13 GPIO_EXTI13 B1 [Blue PushButton]
21 PA5 GPIO_Output LD2 [Green Led]
プロジェクト設定
SOFTWARE PROJECT
Project Settings :
Project Name : f303re_led
Project Folder : /Users/mickey/STM32Project/f303re_led
Toolchain / IDE : SW4STM32
Firmware Package Name and Version : STM32Cube FW_F3 V1.6.0
Code Generation Settings :
STM32Cube Firmware Library Package : Copy only the necessary library files
Generate peripheral initialization as a pair of '.c/.h' files per peripheral : No
Backup previously generated files when re-generating : No
Delete previously generated files when not re-generated : Yes
Set all free pins as analog (to optimize the power consumption) : No
手順5.ちょこっとだけコードを追加
main.cの先頭の USER CODE BEGIN 0 〜 USER CODE END 0の間に以下の定義を追加
(NANO-libの初期化処理から呼ばれる)
/* USER CODE BEGIN 0 */ void _init(void) { } /* USER CODE END 0 */
ついでにテスト用のLチカコード
/* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, SET); HAL_Delay(1000); HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, RESET); HAL_Delay(1000); /* USER CODE END WHILE */
手順6.makefile
プロジェクトフォルダ直下に、下記の内容でmakefileを作ります。
前回からの変更点は以下になります
・NANO-libをリンク (加えて、-nostartfilesも指定)
・OpenOCDで焼き込みするmakeターゲット(flash)を追加
PROJECT = f303re_led DIR=~/gcc-arm/bin CC=$(DIR)/arm-none-eabi-gcc NM=$(DIR)/arm-none-eabi-nm CP=$(DIR)/arm-none-eabi-objcopy OD=$(DIR)/arm-none-eabi-objdump SZ=$(DIR)/arm-none-eabi-size # SEMIHOST_LIB = --specs=rdimon.specs -lrdimon NANOLIB = --specs=nano.specs OPENOCD=~/openocd BOARDCNF=st_nucleo_f3.cfg DEFS = -DUSE_HAL_DRIVER -DSTM32F303xE MCU = cortex-m4 MCFLAGS = -MD -mcpu=$(MCU) -march=armv7e-m -mtune=$(MCU) MCFLAGS += -mthumb -mlittle-endian -mno-unaligned-access -mno-sched-prolog MCFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 MCFLAGS += -fno-strict-aliasing -fsigned-char MCFLAGS += -ffunction-sections -fdata-sections MCFLAGS += -fno-schedule-insns2 MCFLAGS += -fno-common -fno-hosted MCFLAGS += -mthumb-interwork MCFLAGS += -fmessage-length=0 MCFLAGS += -ffreestanding MCFLAGS += -fno-move-loop-invariants MCFLAGS += -nostartfiles MCFLAGS += -Wl,--gc-sections STM32_INCLUDES = \ -IInc \ -IDrivers/CMSIS/Device/ST/STM32F3xx/Include \ -IDrivers/CMSIS/Include \ -IDrivers/STM32F3xx_HAL_Driver/Inc/Legacy \ -IDrivers/STM32F3xx_HAL_Driver/Inc #OPTIMIZE = -Os OPTIMIZE = -gdwarf-2 -O0 -flto-partition=none -fipa-sra CFLAGS = $(MCFLAGS) $(OPTIMIZE) $(NANOLIB) $(SEMIHOST_LIB) $(DEFS) $(STM32_INCLUDES) CFLAGS += -Wl,-T,STM32F303RETx_FLASH.ld AFLAGS = $(MCFLAGS) CSRC = \ Src/main.c \ Src/stm32f3xx_hal_msp.c \ Src/stm32f3xx_it.c \ Src/system_stm32f3xx.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart.c ASRC = Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/gcc/startup_stm32f303xe.s COBJ = $(CSRC:.c=.o) AOBJ = $(ASRC:.s=.o) all: build size build: elf hex lst sym elf: $(PROJECT).elf hex: $(PROJECT).hex lst: $(PROJECT).lst sym: $(PROJECT).sym %.hex: %.elf @echo $(CP) -O ihex $< $@ %.lst: %.elf @echo $(OD) -h -S -C $< > $@ %.sym: %.elf @echo $(NM) -n $< > $@ size: @echo $(SZ) $(PROJECT).hex $(SZ) $(PROJECT).elf $(SZ) -A -x $(PROJECT).elf %.elf: $(AOBJ) $(COBJ) @echo $(CC) $(CFLAGS) $^ -o $@ $(COBJ) : %.o : %.c @echo $(CC) -c $(CFLAGS) $< -o $@ $(AOBJ) : %.o : %.s @echo $(CC) -c $(CFLAGS) $< -o $@ clean: @echo find . -name '*.o' -print -or -name '*.d' -print | xargs rm -f rm -f $(PROJECT).elf $(PROJECT).hex $(PROJECT).lst $(PROJECT).sym flash: $(PROJECT).elf $(OPENOCD)/src/openocd -s $(OPENOCD)/tcl -f board/$(BOARDCNF) -c "program $^ verify reset exit"
手順7.ビルド
$ make
手順8.書き込み
$ make flash
コメント 0