SSブログ

[電子工作] 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使い回しの都合上、展開フォルダ名を変更しました)

$ 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


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。