2020年11月14日

STM32: libopencm3に入門した時のメモ 2020/11

STM32: libopencm3に入門した時のメモ 2020/11
  • はじまり
    • 少し前にSTM32CubeMXが「64bit PC専用版のVer6.0」に勝手に更新されてしまって、 家の32bit PCだと動作不能に陥いってしまった。orz orz orz (注2)
      慌てて代用品を探して思い出したのが、
    • libopencm3
    • かなり前から極まれに検索にひっかかっていたのは気づいていたが、(注3)
      STM32CubeMXがあるので無視していたのだった。
  • libopencm3とは
    • ARM Cortex-M系 マイコン用の超軽量低機能なペリフェラルライブラリである。
    • 対応するマイコンは以下。
      • ST STM32 F0xx/F1xx/F2xx/F30x/F37x/F4xx/F7xx/H7xx series
      • ST STM32 G0xx G4xx L0xx L1xx L4xx series
      • Atmel SAM3A/3N/3S/3U/3X series, as well as SAMDxx and friends
      • NXP LPC1311/13/17/42/43
      • Stellaris LM3S series (discontinued, without replacement)
      • TI (Tiva) LM4F series (continuing as TM4F, pin and peripheral compatible)
      • EFM32 Gecko series (only core support)
      • Freescale Vybrid VF6xx
      • Qorvo (formerly ActiveSemi) PAC55XX
      • Synwit SWM050
    • 少し使ってみたので 以下気づいた点を列挙する。
      • ダウンロードするのにメールアドレス不要でログインしなくても良い :-)
      • libopencm3は細々とメンテナンスされている。
      • レジスタ直打ちしなくていい様な必要最低限のライブラリ群
      • 対応マイコンはSTM32系が優勢の様だ。
      • 最近のSTM32G0シリーズにも対応している風。
      • Cortex-M4F以降のマイコンはハードウェア浮動小数がデフォルトでON状態。
      • リンカスクリプトはpythonで自動生成されて手間いらず。
      • スタートアップコードもリセットベクタ系も自動リンクされて手間いらず。
      • HTMLドキュメントはSTM32F4用しかないが非常に見やすく好印象。
      • exampleプロジェクト を見ればPLL,SYSTICK,USART,GPIO,DMA,USB,ADC,I2C等の初期設定はほぼ分かる。
  • 簡単に使える
    • 単純なライブラリなのでコンパイルオプションCFLAGSに以下の3つを加えるだけで使える。
      (ライブラリのコンパイルは必要)
    • CFLAGS += -lopencm3_stm32f0    // ライブラリ名
      CFLAGS += -Llibopencm3/lib     // ライブラリの場所
      CFLAGS += -Ilibopencm3/include // インクルードパス
  • コードサイズ比較:
    • STM32 HALライブラリ >> STM32 LLライブラリ > libopencm3ライブラリ > レジスタ直打ち
      低機能ライブラリなおかげでサイズが極小なので、最近 秋月電子に出現した
      FLASH 16KB, SRAM 2KBのSTM32L010F4P6 あたりに丁度良いかも。
      ちなみにFLASH 16KBでHALライブラリだと恐らくペリフェラルの初期化と割込み処理のラッパーだけでFLASH容量が終了します。(^^; (注4)
      そのためのLLライブラリだけど、さらに4割程度小さい感じ。(注4)
  • 使用時に必要なツール(Windows)(注5)
  • 実行パスを通す
    上記のツール群をインストールしたフォルダに実行パスを通します。(注5)
    例:setenv.bat (上記以外のパスは無視する設定例)
    @echo off
    set vPy=386
    path=D:\Git\bin
    set path=%path%;D:\Git\usr\bin
    set path=%path%;D:\Python%vPy%
    set path=%path%;D:\Python%vPy%\Scripts
    set path=%path%;C:\arm-gcc\bin
    set path=%path%;C:\make\bin
    echo %path%
    MS-DOSコマンドラインを開いてトップフォルダにある上記「setenv.bat」を実行すれば準備は終了。
  • libopencm3の取得とライブラリのコンパイル
    以下は、自分用に作った便利サンプルプロジェクトの説明。
    MS-DOSコマンドラインを適当な作業フォルダで開いて、
    > git clone --recurse-submodules https://github.com/dinau/first_libopencm3.git
    > cd first_libopencm3
    > make lib
    と打つとgitのリポジトリからlibopencm3をダウンロードしてきて STM32F0/L1/F3/F4それぞれのライブラリのみコンパイルされます。(最適化は「-Os」)
  • 生成物: first_libopencm3/lib/libopencm3/lib の中に
    • libopencm3_stm32f0.a
    • libopencm3_stm32l1.a
    • libopencm3_stm32f3.a
    • libopencm3_stm32f4.a
    が生成される。他にもライブラリ使用時に必要なファイルがこの時生成されます。(注6)
  • 次に、make と打てば全てのサンプルコードがコンパイルされます。
  • 個別コンパイルする時は、例えば
    > cd nucleo_f411re\ledblink
    > make
      CC    main_src.c
      CC    ../hardware.c
      CC    ../../lib/TSoftPwm.c
      CC    ../../lib/disp_info.c
      CC    ../../lib/hardware_common.c
      CC    ../../lib/systick.c
      CC    ../../lib/xprintf/xprintf.c
      GENLNK  stm32f411ret6
      LD    .BUILD/ledblink_STM32F411.elf
      OBJCOPY       .BUILD/ledblink_STM32F411.bin
       text    data     bss     dec     hex filename
       2312      12       8    2332     91c .BUILD/ledblink_STM32F411.elf
    
  • Makefileは、
    PROJECT     = ledblink_$(DEV_NAME)
    CFLAGS     += -DSYSTEM_CLOCK=84000000
    CFLAGS     += -DUSART_BAUDRATE=115200
    
    SHARED_DIR  = . .. ../../lib ../../lib/xprintf
    LIB_CSRC   += $(wildcard ../../lib/*.c)
    LIB_CSRC   += $(wildcard ../../lib/xprintf/*.c)
    CSRC       += $(wildcard *.c) $(wildcard ../*.c)
    CFILES     += $(notdir $(CSRC)) $(notdir $(LIB_CSRC))
    #AFILES    +=
    
    # TODO - you will need to edit these two lines!
    DEVICE      = stm32f411ret6
    DEV_NAME    = STM32F411
    #OOCD_FILE = board/stm32f4discovery.cfg
    
    include ../../common.mk
  • 上記 DEVICE変数にマイコン名をフルネームで指定すると、自動でリンカスクリプトを生成します。(注1)
  • この場合「generated.stm32f411ret6.ld」というリンカスクリプトが生成されます
    • 対応するマイコンボードは、
    • Nucleo-F411RE
    • Nucleo-L152RE
    • STM32F0Discovery
    • STM32F3Discovery
  • デモフォルダ:
    • ledblink: LEDチカチカ
    • softpwm: ソフトPWMでLEDホアンホアン
    • freertos: FreeRTOSでLED点滅タスクとペリフェラルレジスタ値をUARTで表示するタスク。
  • 特定ターゲットのライブラリだけをコンパイルする方法
  • 以下はトップレベルのMakefileから抜粋したもので、libopencm3をコンパイルする時のオプション。
  • TARGET_MCU = "stm32/f0 stm32/l1 stm32/f4 stm32/f3" # コンパイル対象のライブラリは必要なものだけ
    OPTIMIZE = -Os # 最適化はサイズ優先
    LIBOPENCM3 = lib/libopencm3 # ライブラリがある場所
    
    # libopencm3ライブラリをコンパイル
    $(MAKE) -C $(LIBOPENCM3) TARGETS=$(TARGET_MCU) CFLAGS=$(OPTIMIZE) 
  • ライブラリのHTMLドキュメントを生成する時も同様に、
    > cd lib/libopencm3
    > make doc TARGETS="stm32/f4 stm32/f0" 
    等とする。 "TARGETS=..."がなければ全てのマイコンが対象となり膨大な時間がかかる。
  • ちなみに、HTMLドキュメントを生成するにはmsys2上で少なくとも、
    • doxygen
    • graphviz
    $ pacman -S doxygen mingw-w64-i686-graphviz
    が必要。後は忘れました。:-)
  • ライブラリのHTMLドキュメントについて
    • まともなドキュメントがあるのはSTM32F4用だけですが、
    • 差異部分を除けばSTM32マイコンは、ほぼ共通なので十分使えると思います。
    • 差異部分はソースコード見るしかないですが。。。
  • 割り込みハンドラの名前
    • Armコアの割り込みハンドラ名はSTM32CubeMXとは違っていてハマリがち。
    • 以下は、FreeRTOSで使う時の設定(FreeRTOSConfig.h)
    • /* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
      standard names - or at least those used in the unmodified vector table. */
      #define vPortSVCHandler     sv_call_handler     // SVC_Handler
      #define xPortPendSVHandler  pend_sv_handler     // PendSV_Handler
      #define xPortSysTickHandler sys_tick_handler    // SysTick_Handler
      // cf: libopencm3\lib\cm3\vector.c 
    • 上の緑の部分がlibopencm3での割込み定義名。
  • (注1) libopencm3が持つ機能。
  • (注2) その後、古いバージョンが取得可能なことに気づいたので事なきを得た。
  • ちなみに、32bitでまともに動くのはVer.5.6.0まで。
  • (注3) 以前は libopenstm32だったらしい。
  • (注4) 個人の感想です。 :-)
  • (注5) msys2系使用中なら不要かも
  • (注6) nvic.h や特定のファイル・フォルダはlibopencm3をビルドしないと生成されない。
git clone --recursive https://github.com/libopencm3/libopencm3-examples.git
posted by Copyright (C) avrin All Rights Reserved. at 20:05| Comment(0) | ARM系 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。