So-net無料ブログ作成

[電子工作] 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

トラックバックの受付は締め切りました