So-net無料ブログ作成

STM32FをArduino iDEで開発的なメモメモメモメモ [STM32F]

ハードディスクが飛ぶ寸前だったのを機にSSDに交換してクリーンインストールしたので、ついでにArduino IDEでstm32duinoのArduino Core STM32に手を出している。

https://github.com/stm32duino

環境設定から追加のボードマネージャーのURLを追加し、
https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json

ボードマネージャーでArduino Core STM32を追加したが、まぁいろいろうまく行かなかった。
ボードマネージャーで追加されたツールチェインでは正常にコンパイルが行われなかったので、gnu-armの最新版、いわくつきの2018年版をダウンロードしてplatform.txtでツールチェインのパスを変更

20行目辺り
#compiler.path={runtime.tools.arm-none-eabi-gcc-6-2017-q2-update.path}/bin/
compiler.path={runtime.tools.arm-none-eabi-gcc-8 2018-q4-major.path}/bin/
2019-05-08.png


が、今度はobjcopyでよくわからんエラーで先に進まない。

どうやらobjcopyのバグらしくこんな報告が上がっている、、、
https://bugs.launchpad.net/gcc-arm-embedded/+bug/1810274

はぁ、、、(*´Д`)

対策は、2018年版のツールチェインをやめて2017年版にするか、2017年版のobjcopyだけを上書きコピーすること。
※結局他でもトラブル起こすので、2017年 Q4 メジャー版に戻しましたよ、、、はぁ

お役立ちリンク
https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwiAgI2ywoviAhULxbwKHbnFD3oQFjAAegQIARAB&url=https%3A%2F%2Fscrapbox.io%2FArduinoSTM32%2FArduino_STM32_%25E3%2583%25AA%25E3%2583%2595%25E3%2582%25A1%25E3%2583%25AC%25E3%2583%25B3%25E3%2582%25B9_%25E6%2597%25A5%25E6%259C%25AC%25E8%25AA%259E%25E7%2589%2588&usg=AOvVaw23b9dYNx5_EZ6Z6loRNkAL

nice!(0)  コメント(0) 

STM32FをArduino iDEで開発的なメモメモメモ [STM32F]

以下はまったく未保証なので注意してね。何かあれば戻せるようにした上でどうぞ。

1.gccのバージョンを上げてみる。

流石にバージョンが4.8.何某はないんじゃないかと思って最新のバージョンにしてみる。
arm-none-eabi-gccはすでに2018バージョンがリリースされているので、それをまずPCにインストールする。
が!このままではArduinoから呼ばれない。STM32-Arduinoが呼んでいるarm-none-eabi-gccはArduino15フォルダー以下に存在する。Arduino IDEの環境設定からArduino15フォルダーを開くと便利。
C:\Users\hamayan\AppData\Local\Arduino15\packages\arduino\tools\arm-none-eabi-gcc
このフォルダーの下に、先ほどインストールしたarm-none-eabi-gccをまるっとコピー。

次にboards.txtを編集する。たぶん33行目辺りにarm-none-eabi-gccのツールチェインバージョンが書かれた行が有るので、それを編集する。
nucleo_f103rb.build.gcc_ver=gcc-arm-none-eabi-7 2018-q2-update
※nucleo_f103rbとなっているが、他のボードにも適用される模様。

一旦Arduino IDEを再起動してビルドすると上記の変更が反映される。

2.duplicate 'inline' errorが出るようになっちゃった!
もうARM関連は色々いじり過ぎて、何をやっているのかさっぱり。上記エラーがSTM32 Arduinoで出るようになってしまったので、対策を探す。
以下の内容がとても近い、AVR-GCCの話だけれど。
https://www.avrfreaks.net/forum/avrgnu-c-compiler-duplicate-inline-error

そこでエラーの出ているソースを編集してみる。
元は
static inline __always_inline void afio_exti_select(exti_num exti, exti_cfg port)
だったものを
__attribute__( ( always_inline ) ) static inline void afio_exti_select(exti_num exti, exti_cfg port)
とした、、、微妙だなぁ。



多分2週間もしたらきっと忘れるので、こうやってメモしておこう。

※arm-none-eabi-gccの2018バージョンは、STM32Fの開発でCoIDEでデバッガーを起動すると問題が起きるので、その一つ前の2017年バージョンに落とした。

nice!(0)  コメント(0) 

STM32FをArduino iDEで開発的なメモメモ [STM32F]

ボード毎にUSB DPのプルアップの制御が異なるので、これを一々ヘッダーファイルやCソースを書き換えていてはたいへんだから、boards.txtで対応できるようにした。

まづはboards.txtのvariantにオリジナルの基板の定義を追加
genericSTM32F103V.menu.device_variant.PIXIS1303=PIXIS1303
genericSTM32F103V.menu.device_variant.PIXIS1303.build.variant=generic_stm32f103v
genericSTM32F103V.menu.device_variant.PIXIS1303.build.cpu_flags=-DMCU_STM32F103VE -DUSB_ON_PORT=GPIOE -DUSB_ON_PIN=1 -DUSB_POWER_ON=1
genericSTM32F103V.menu.device_variant.PIXIS1303.upload.maximum_size=524288
genericSTM32F103V.menu.device_variant.PIXIS1303.upload.maximum_data_size=65536
genericSTM32F103V.menu.device_variant.PIXIS1303.build.ldscript=ld/stm32f103ve.ld

コンパイルのDEFINEオプションに
-DUSB_ON_PORT=GPIOE -DUSB_ON_PIN=1 -DUSB_POWER_ON=1
を追加し、ポート番号、ピン番号、プルアップ時の論理を渡す。

board.hは以下の様に変更
/* USB configuration.  BOARD_USB_DISC_DEV is the GPIO port containing
 * the USB_DISC pin, and BOARD_USB_DISC_BIT is that pin's bit. */
//#define BOARD_USB_DISC_DEV      GPIOC  /* original */
//#define BOARD_USB_DISC_BIT      12  /* original */
#define BOARD_USB_DISC_DEV      USB_ON_PORT
#define BOARD_USB_DISC_BIT      USB_ON_PIN


usb_cdcacm.cは以下の様に変更
void usb_cdcacm_enable(gpio_dev *disc_dev, uint8 disc_bit) {
    /* Present ourselves to the host. Writing 0 to "disc" pin must
     * pull USB_DP pin up while leaving USB_DM pulled down by the
     * transceiver. See USB 2.0 spec, section 7.1.7.3. */

    if (disc_dev!=NULL)
    {
      gpio_set_mode(disc_dev, disc_bit, GPIO_OUTPUT_PP);
//    gpio_write_bit(disc_dev, disc_bit, 0);  /* for original */
      gpio_write_bit(disc_dev, disc_bit, USB_POWER_ON );  /* for pixis 1303 */
    }

いやぁ、良かった良かった。
stm32fArduinoIde_002.png
nice!(0)  コメント(0) 

STM32FをArduino iDEで開発的なメモ [STM32F]

1.Arduino IDEを起動して、ツール→ボードマネージャーでボードマネージャを起動し、フィルターにSAMを入力してCortex-M3に関する環境を入手する。※フィルターにSTMを入れるとSTM32F4が見つかる。
stm32fArduinoIde_001.png

2.GitHubからSTM32F用のArduinoライブラリを入手する。
https://github.com/rogerclarkmelbourne/Arduino_STM32
展開後、展開したフォルダーごとhardwareフォルダー以下に移動。

3.適当なプロジェクトを作成する。書き込みはSTLinkを選択する。
※DFU(USB書き込み)とかシリアル書き込みはできるのだけど、都度BOOTのスイッチを切り替える必要が有るので、もうSTLinkでイイじゃん!って感じ。

4.以上!
※gccのツールチェインバージョンが4.8.3-2014q1と古いのが気になる、、、

5.ライブラリのドキュメントの参照先
http://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-docs/0.0.12/language-index.html

こことかも
https://scrapbox.io/ArduinoSTM32/Arduino_STM32_リファレンス_日本語版

※STM32FのUSBを有効にするためには、USBのDPのプルアップを制御しているDISK(信号名)を基板に合わせる必要が有る。例えばMB-STM32F103ならPC13がそれになる(標準はPC12)。この基板で使用しているのはSTM32F103VETなので、以下のboard.hの111行目を編集して適応化させる。
\hardware\Arduino_STM32-master\STM32F1\variants\generic_stm32f103v\board\board.h
論理の変更は以下のファイルの390行目だと思われる。
\hardware\Arduino_STM32-master\STM32F1\cores\maple\libmaple\usb\stm32f1\usb_cdcacm.c

gpio_write_bit(disc_dev, disc_bit, 0); 最後の引数を0から1かなぁ、、、と言うのは元になっているmaple-r5と言う基板が以下の様になっているからである。
https://github.com/leaflabs/maple/blob/master/maple-r5/maple-r5-schematic.pdf
信号名DISCをLOWにするとDPにプルアップが行われる。

GitHubに置かれたプロジェクト
https://github.com/chobichan/stm32f3MultiTask_001


※PIN番号とGPIOの対応
上記のboard.hに以下の様に定義されている。
/* Pin aliases: these give the GPIO port/bit for each pin as an
 * enum. These are optional, but recommended. They make it easier to
 * write code using low-level GPIO functionality. */
enum {
PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PA8,PA9,PA10,PA11,PA12,PA13,PA14,PA15,
PB0,PB1,PB2,PB3,PB4,PB5,PB6,PB7,PB8,PB9,PB10,PB11,PB12,PB13,PB14,PB15,
PC0,PC1,PC2,PC3,PC4,PC5,PC6,PC7,PC8,PC9,PC10,PC11,PC12,PC13,PC14,PC15,
PD0,PD1,PD2,PD3,PD4,PD5,PD6,PD7,PD8,PD9,PD10,PD11,PD12,PD13,PD14,PD15,
PE0,PE1,PE2,PE3,PE4,PE5,PE6,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15,
};


nice!(1)  コメント(0) 

STM32CubeMXに関する事 4 CoIDEで開発 7 [STM32F]

そして、書いたコードが消えた、、、orz
nice!(0)  コメント(0) 

STM32CubeMXに関する事 6 RTC割り込みを使う 2 [STM32F]

STM32CubeMXを使って割り込みを設定します。
makeCubeMxProjectForCoIDE_044.png


こんどこそRTCによる周期割り込みを利用します。

1.コールバックルーチン
RTC割り込みをユーザーが利用する時は、stm32f1xx_hal_rcc_ex.cの中のHAL_RTCEx_RTCIRQHandlerからユーザーのコールバックルーチンが呼ばれます。
この時の関数名は指定されており、どこかのファイルに以下の様に記述します。
この例では1秒周期でunixTimeと言う大域変数が1増加します。
/*************************************************************************/
/* RTC interrupt call back function.                                     */
/*************************************************************************/
void HAL_RTCEx_RTCEventCallback( RTC_HandleTypeDef *hrtc )
{
  unixTime++;
}

2.あとはこの変数を煮るなり焼くなり。



気を取り直して、、、

ARMマイコンCortex-M教科書 (ARM教科書)

ARMマイコンCortex-M教科書 (ARM教科書)

  • 作者: 桑野 雅彦 共著 中森 章
  • 出版社/メーカー: CQ出版
  • 発売日: 2016/11/21
  • メディア: 単行本



アームズマガジン17年10月号

アームズマガジン17年10月号

  • 作者:
  • 出版社/メーカー: ホビージャパン
  • 発売日: 2017/08/26
  • メディア: 雑誌



nice!(0)  コメント(0) 

STM32CubeMXに関する事 6 RTC割り込みを使う 1 [STM32F]

STM32CubeMXを使って割り込みを設定します。
makeCubeMxProjectForCoIDE_038.png


すでにRTCを有効にしていますので、RTCによる周期割り込みを行います。

1.STM32CubeMXのConfigurationタブからSystemのNVICをクリックしてRTCの割り込み優先度を調整します。
makeCubeMxProjectForCoIDE_038.png


2.ControlのRTCをクリックしてParameter Settingを開きます。
初期のカレンダーの値を設定しています。設定していますがSTM32F103のRTCはカレンダー機能を持っていませんので、ソフトウエア的に何かをしているのだと思います。
注意点は、時間は12時間表記、西暦は下位の2桁を入力する点でしょうか?
makeCubeMxProjectForCoIDE_039.png


3.コードを生成します。CoIDEのファイル構成が更新されますので、CoIDEのProjectウインドウ上のProject名を選択してF5キーを押します。
それでビルドすると、あらあらエラーが出ちゃいました。この作業、2回目ですが、もしかして2回目以降はこのバグが出るのかも。
makeCubeMxProjectForCoIDE_040.png


4.バッテリーバックアップ付き対策
このAitendoの基板にはバッテリーが搭載されている為、STM32F103のバックアップドメインは電源が落とされてしまっても、元の内容が消えません。RTCはこのバックアップドメインに属するので、電源断時も動いています。
このMX_RTC_Init関数の内部ではバックアップドメインのバックアップレジスタの内容が、以前設定された値であるかどうかでRTCの状況を判断しています。もしその値が正常であれば、RTCのカウンターの値(カレンダー)を変更しません!ってことが通常処理なのですが、今は今の時間を刻んで欲しいので、0x32F2と比較しているIF文を無効にしました。
makeCubeMxProjectForCoIDE_042.png


5.割り込み許可
1秒割り込み許可をMX_RTC_Init()の後に記述します。
  /* USER CODE BEGIN 2 */
  HAL_RTCEx_SetSecond_IT( &hrtc );
  /* USER CODE END 2 */
6.動かす
セミホスティングでカレンダー出力しています。
makeCubeMxProjectForCoIDE_041.png

7.割り込みが来ている事を確認してみる stm32f1xx_it.cの中にRTC_IRQHandlerと言う割り込みハンドラーが追加されています。 この中にBREAKを貼り、止めてみました。 makeCubeMxProjectForCoIDE_043.png
まあでも、このカレンダー機能は要らないかなぁ、、、 ひじょうにbuggyで、このまま使い続けて大丈夫なんだろうか、、、と思っているところです、、、はぁ。
ARMマイコンCortex-M教科書 (ARM教科書)

ARMマイコンCortex-M教科書 (ARM教科書)

  • 作者: 桑野 雅彦 共著 中森 章
  • 出版社/メーカー: CQ出版
  • 発売日: 2016/11/21
  • メディア: 単行本
アームズマガジン17年10月号

アームズマガジン17年10月号

  • 作者:
  • 出版社/メーカー: ホビージャパン
  • 発売日: 2017/08/26
  • メディア: 雑誌

nice!(0)  コメント(0) 

STM32CubeMXに関する事 4 CoIDEで開発 6 [STM32F]

STM32CubeMXコードジェネレータの出力を、CoIDE環境で動かしたい!と言う話
makeCubeMxProjectForCoIDE_033.png


STM32CubeMXで機能を追加してコードを生成する度に、mainの中のwhileループ辺りが変な事になるなぁ!と思っていたんです。
もともと最初に生成されるコードが以下の様に、気持ち悪い入れ子構造になっています。
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

これ、以下の様に直しましょう。たぶん、、、
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  }
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
  /* USER CODE END 3 */

コードジェネレーター、たぶんまだまだ不具合があるので、コードを再生成する前に上手く動いていた前のバージョンは保存しておいた方が良いかも。
それと、頑張って作った重要なコードは、なるべくコードジェネレーターに依存しない別のファイルに書いた方が良いと思う。


たぶん続くんじゃないかなぁ。

ディジタル回路設計とコンピュータアーキテクチャ[ARM版]

ディジタル回路設計とコンピュータアーキテクチャ[ARM版]

  • 作者: デイビッド・M・ハリス サラ・L・ハリス
  • 出版社/メーカー: 星雲社
  • 発売日: 2016/04/25
  • メディア: 大型本



nice!(0)  コメント(0) 

STM32CubeMXに関する事 5 セミホスティングを使う [STM32F]

ST-LINK V2だけの機能なのか?ST-LINK V1ではどうだっけ?他のオンチップデバッガーの状況は?さっぱり知りませんが、セミホスティング便利です。

従来UARTの一部を使って、動作中のメッセージ等を出力してデバッグとかしている事も多いと思いますが、セミホスティングを使えば特別にI/Fを用意する事無く、デバッガーの画面にメッセージを出力する事も、なにか文字を受信することもできます。
makeCubeMxProjectForCoIDE_036.png



使い方は簡単。プロジェクトにリポジトリでSemihostingを追加し、CoIDEの設定(Configuration)のDebuggerタブでAdvanceのSemihosting Enableにチェックを入れるだけでした。
makeCubeMxProjectForCoIDE_023.png


main.cのこの部分にsemihosting.hをインクルードします。
makeCubeMxProjectForCoIDE_037.png


main.hのこの部分に以下のマクロを追加します。
/* USER CODE BEGIN Private defines */
/* debug */
#if defined(__DEBUG__)
#define  debugPrint(fmt,param)  do{ char buf[128]; sprintf(buf,fmt,param); SH_SendString(buf);} while(0)
#else
#define  debugPrint(fmt,param)
#endif /*__DEBUG__*/
/* USER CODE END Private defines */

mainのwhileループにこれを追加します。
    debugPrint( "loop count = %d\r\n", count++ );

以上



ディジタル回路設計とコンピュータアーキテクチャ[ARM版]

ディジタル回路設計とコンピュータアーキテクチャ[ARM版]

  • 作者: デイビッド・M・ハリス サラ・L・ハリス
  • 出版社/メーカー: 星雲社
  • 発売日: 2016/04/25
  • メディア: 大型本



nice!(0)  コメント(0) 

STM32CubeMXに関する事 4 CoIDEで開発 5 [STM32F]

STM32CubeMXコードジェネレータの出力を、CoIDE環境で動かしたい!と言う話
makeCubeMxProjectForCoIDE_033.png


前回まではLED1をチカチカしました。
今回はSTM32CubeMXでGPIOの出力を増やし、4つのLEDチカチカを行います。
1.STM32CubeMXを起動し、先に作成したSTM32CubeMXのプロジェクトを開き、PIN配置の画面でGPIOの出力を追加します。LEDとの接続は図の様になっています。
MB-STM32-led_sch.jpg


makeCubeMxProjectForCoIDE_032.png


2.LEDにラベルを付加します。
makeCubeMxProjectForCoIDE_033.png


3.コードを生成すると変更の必要なファイルは上書きされます。ただしユーザーが記述したコード、おそらく「USER CODE BEGIN」で始まり、「USER CODE END」で終わる範囲内は保護されるような気がします。
今回はmain.hとmain.cに記述が追加されています。
makeCubeMxProjectForCoIDE_034.png


4.だらっ!としたコードを書いてみました。
makeCubeMxProjectForCoIDE_035.png




たぶん続くんじゃないかなぁ。

ディジタル回路設計とコンピュータアーキテクチャ[ARM版]

ディジタル回路設計とコンピュータアーキテクチャ[ARM版]

  • 作者: デイビッド・M・ハリス サラ・L・ハリス
  • 出版社/メーカー: 星雲社
  • 発売日: 2016/04/25
  • メディア: 大型本



nice!(0)  コメント(0) 

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