STM32CubeIDEでST-Link-V2が接続できない事象の対処方法

ここには簡潔に記載することにする。

【原因】

STM32CubeIDEのCode Generator(コードジェネレーター)で出力された以下、__HAL_AFIO_REMAP_SWJ_DISABLE(); のコードである。
__HAL_AFIO_REMAP_SWJ_DISABLE()は、JTAG-DPとSW-DPをDisabledにする設定なので ST-Link等のデバッガーが接続できなくなって当然である。

main()
 +- HAL_Init()
 |   +- HAL_MspInit()
 |       +- __HAL_AFIO_REMAP_SWJ_DISABLE() ★これが原因
 |

【対処】

HAL_MspInit()でコールしている__HAL_AFIO_REMAP_SWJ_DISABLE()を削除すれば良いのだが、ST-Linkが接続できないので、STM32 ST-LINK Utilityを使用してFLASHメモリに書き込んだプログラムを削除する必要がある。

【ST-LINK Utilityで接続する方法】

前提条件として、基板にRESETスイッチが必要である。(RESETスイッチが無い場合、基板に通電した状態でマイコン端子のNRSTをGNDに落とした状態がRESETスイッチON状態、GNDから離せばスイッチOFF状態ですが、場合によっては抵抗(10KΩ)を付けないと基板が死にます。RESETサブ基板を作りましょう)
手順①:ST-LINK Utilityを起動する。※ST社サイトからダウンロードできます。
手順②:基板のRESETスイッチを押し続ける。
手順③:ST-LINK Utilityの[Connect to the target]ボタンをクリックする。
手順④:基板のRESETスイッチを離す。
※接続できない場合、手順④の実施タイミングにより接続できない時があるので、手順②からやり直しましょう。
手順⑤:書き込んだセクターだけをメニューの[Erase sector]で消去する。
※[Full chip erase]ボタンでFLASHメモリの全領域を消去しても良いが、DFU(プログラムダウンローダー)まで消去される。私はDFUを使用せず、ST-Linkでプログラムを書き込んでいるので全領域消去してます。
※Erase sectorを調べるには、プログラムが書き込まれているアドレス範囲を調べる必要がある。debugまたはreleaseフォルダからxxxx.mapファイルを検索して、エディタで開いて確認しましょう。
手順⑥:[Disconnect from the target]ボタンをクリックする。

【対処完了】

これで、STM32CubeIDEでST-Link-V2が接続できます。原因を排除したプログラムでデバッグ再開できます。

Git for windowsインストール

Git for windowsは、Gitクライアントです。

GitHubやGitLab等のGitサーバーとSSH接続するために、GitクライアントをPCにインストールして SSHキーを作成できます。
厳密にいえば、Gitクライアントは、Gitサーバーと接続するために使用するのではなく、ローカル(PC)リポジトリやGitサーバーリポジトリをgitコマンドで操作するためのCLI(Command Line Interface)ツールです。
Gitクライアントの付随機能として、GitサーバーとSSH接続するための SSHキーも生成できます。

Gitクライアントは、git for windows https://gitforwindows.orgからダウンロードして、インストールします。

ダウンロードした Git-2.26.2-64-bit.exe を実行すると、インストールが開始されます。※ 2020年5月6日時点の最新バージョンが 2.26.2です。

最近のバージョンでは、セットアップ画面が変わってますがデフォルトの設定でインストールして問題ないでしょう。

ssh鍵(キー)の生成

Git Bashを起動して、gitサーバとssh接続するためのssh鍵を生成できます。
$ ssh-keygen -t rsa -b 2048または4096[Enter]
・”-t rsa”は、RSA鍵を指定します。
・”-b 4096 / 2048″は、4096または2048を指定します。4096または2048ビット長でssh鍵が生成されます。値を大きくすると暗号・復号処理が遅くなりますが暗号強度が増します。”-b 4096″で生成した鍵でssh接続してますが遅いと感じません。

※ちまたで、-Cやパスフレーズを指定していますが、無い方がトラブル回避できますよ。
・”-C”のコメント指定は不要なので、指定しない方が良いでしょう。
・パスフレーズの入力が促されますが、[Enter]を押して何も指定しない方が、様々なgitサーバーに使用できると思います。今のところ問題おきてません。

Git, GitHub, TortoiseGitのSSH接続設定

TortoiseGitからGitHub にSSH接続する設定を展開します。以下”SSH鍵”と記載していますが、「SSH接続するための暗号化鍵」の事です。Windows 7でも確認済みです。尚、ソフトウェア版数は、現在(2019/2/6)の最新版を使用します。

・Git for Windows 2.20.1
・TortoiseGit 2.7.0 +言語パッケージ

◆ 0.準備

GitHub アカウントは登録済みであること。
Git for Windows 、TortoiseGit は、インストール済みであること。

インストール方法は、別途記載します。

◆ 1.Git Bashのコンソールからssh-keygenコマンドでSSH 鍵を生成しますが、その前に gitコマンドでconfig設定しておきましょう。

$ git config –global user.name “YourName”
$ git config –global user.email YourEmail@hoge.com $ ssh-keygen -t rsa -b 4096

コマンドを実行すると、SSH鍵をcreateするファイル名やパスフレーズが問われます。何も入力せず[Enter]キーを押します。
パスフレーズは10文字以上入力すると強固な鍵が作成できるのですが、TortoiseGit での利用が思うように出来なかったりするので、私は利用面を優先します。しかし、セキュリティ面も大事ですので4096ビットで鍵生成します。因みにデフォルトは2048ビットです。
パスフレーズを入力すると、PuTTYgenでTortoiseGit に設定するid_rsa.ppkが作成出来ません。(id_rsaの秘密鍵の読み込みに失敗します)

・id_rsa:RSA秘密鍵
・id_rsa.pub:RSA公開鍵。GitHubにはこちらの公開鍵を設定します。

秘密鍵と公開鍵ができたので、GitHub で受け入れられるか確認しましょう。

◆ 2.PuTTYgen で先に生成したSSH鍵をid_rsa.ppkファイルに変換します。

id_rsa.ppkファイルはTortoiseGit に設定して、GitHub とSSH接続するための鍵ファイルです。

PuTTYgenを起動して、[File]-[Load private key]メニューでid_rsa秘密鍵ファイルを読み込みます。読み込みがSuccess なら、[Save private key]ボタンを押して、ファイル名 id_rsa.ppkで保存します。

PuTTYgen 画面に表示されているPublic keyテキスト内をコピーして、
GitHubの[settings] – [Personal setting] -[SSH and GPG keys]のSSH keysにペーストして、GitHubでも公開鍵が受け入れるかをチェックしましょう。

以上でTortoiseGit からGitHub にSSH 接続できます。

巷のサイトではソフトバージョンが古くて思うように行かなかったゼ。

STM32CubeMX

年末年始休暇を利用して、STM32F103C8でI2CデバイスのMCP23017をPB6,PB7(I2C1 SCL,SDA)に接続した回路をブレッドボードに実装してみた。
そして、STM32CubeMX(CubeF1)にて初期化部分のコードを生成したところバグがあることが分かった。
開発環境の各バージョンは次の通りである。
・STM32FCubeMX Ver5.0.0
・STM32CubeF1 Ver1.7.0
・IAR社 EWARM 7.50.3

STM32CubeMXで自動生成された下記コードでは、I2C SCLにクロックが出力されない事が分かった。

void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hi2c->Instance==I2C1)
  {
  /* USER CODE BEGIN I2C1_MspInit 0 */

  /* USER CODE END I2C1_MspInit 0 */

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**I2C1 GPIO Configuration    
    PB6     ------> I2C1_SCL
    PB7     ------> I2C1_SDA 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* Peripheral clock enable */   ★★I2CペリフェラルへのクロックEnableは、
    __HAL_RCC_I2C1_CLK_ENABLE();    ★★HAL_GPIO_Init()より前に行わないとI2Cが正常に動作しない
  /* USER CODE BEGIN I2C1_MspInit 1 */

  /* USER CODE END I2C1_MspInit 1 */
  }

}

私は、GPIOBのクロックの直後に移動した。

__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_I2C1_CLK_ENABLE();

ちなみに、MCP23017のdevice addressは0x20であるが、I2C APIのパラメータに渡すときは、左にシフトして(0x40)渡すことが、API仕様に書いてあります。

#include "stm32f1xx.h"

/** i2cスレーブアドレス */
#define SLAVE_ADDR  0x40
/** i2cデバイスハンドル */
I2C_HandleTypeDef   MCP23017_handle;

void MCP23017_init(void)
{
    uint8_t rw_buff[2];

    /* Initialize for I2C */
    MCP23017_handle.Instance = I2C1;
    MCP23017_handle.Init.ClockSpeed = 100000;
    MCP23017_handle.Init.DutyCycle = I2C_DUTYCYCLE_2;
    MCP23017_handle.Init.OwnAddress1 = 0;
    MCP23017_handle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    MCP23017_handle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    MCP23017_handle.Init.OwnAddress2 = 0;
    MCP23017_handle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    MCP23017_handle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    if( HAL_I2C_Init( &MCP23017_handle ) != HAL_OK )
    {
        Error_Handler();
    }

    /** I2Cデバイスからの読み出し(デバッグ用) */
    rw_buff[0] = 0x05;
    if( HAL_I2C_Master_Receive( &MCP23017_handle, SLAVE_ADDR, rw_buff, 1, HAL_MAX_DELAY ) != HAL_OK ){
//  if( HAL_I2C_Master_Transmit( &MCP23017_handle, SLAVE_ADDR, rw_buff, 1, HAL_MAX_DELAY ) != HAL_OK ){
//  if( HAL_I2C_Master_Transmit_IT( &MCP23017_handle, SLAVE_ADDR, rw_buff, 1 ) != HAL_OK ){
        Error_Handler();
    }
}

doxygenとPlantUMLの組み合わせ

■doxygenとPlantUMLの組み合わせ
doxygen のドキュメント生成ツールと PluntUML の作図ツールを組み合わせてみました。
言葉だけでは理解困難なケースや誤解を招くため、doxygen生成ドキュメントに図を取り入れよう。
その方法を簡単に記載する。
(1)まずは、doxygenのコンフィグファイルを生成してカスタマイズする。
(2)次にドキュメント生成元のソースファイルにPlantUMLの記載を入れる。
(3)最後にPlantUMLによる図の.pngファイルを生成する。

◆Doxyfileコンフィグファイル生成
doxygen-1.8.12> doxygen.exe -g

◆Doxyfileコンフィグファイル設定例
・関連する設定項目
DOXYFILE_ENCODING = CP932   #Doxyfileの文字コード指定:拡張SHIFT_JIS
OUTPUT_DIRECTORY = ./out_dir  #Doxygen出力フォルダ指定
INPUT = ./in_dir          #(入力)ソースファイルのフォルダ指定
INPUT_ENCODING = CP932    #(入力)ソースファイルの文字コード指定
HAVE_DOT = YES         #graphvizを使う場合 YES
DOT_PATH = ../PlantUML/graphviz-2.38/bin
PLANTUML_JAR_PATH = ../PlantUML

・その他設定項目
PROJECT_NAME = “NewProject”
PROJECT_NUMBER = Rev 0.10
PROJECT_BRIEF = プロジェクトの概要をココに記載する
BRIEF_MEMBER_DESC = NO
REPEAT_BRIEF = NO
STRIP_FROM_PATH = in_dir
STRIP_FROM_INC_PATH = in_dir
OPTIMIZE_OUTPUT_FOR_C = YES
IDL_PROPERTY_SUPPORT = NO
GENERATE_LATEX = NO

◆doxygenの.batファイルの内容
—————————
echo *** JREパス ***
set PATH=%PATH%;D:\User\070_Document\PlantUML\jre7\jre1.7.0\bin
echo *** Graphviz起動 ***
set GRAPHVIZ_DOT=D:\User\070_Document\PlantUML\graphviz-2.38\bin\dot.exe
echo *** doxygen起動 ***
doxygen.exe
—————————

◆ソースファイルsource.cの記載例
・source.cをin_dirフォルダ下に置き、doxygenを実行する
※この時点ではPlantUMLが出力するXXXX.pngは生成されない(PlantUMLは.batで動作させるため.pngが生成されない方が利便性が良い)
—————————
/**
* @brief 大分類ステートメントテーブル
*
* 大分類の状態テーブルである
* 大分類を細分化した状態は中分類の状態テーブルを参照の事
* @note
* @startuml XXXX.png
database LargeStateTable as ”
LARGE_S1

LARGE_S2

LARGE_S3

LARGE_S4

LARGE_STATE_MAX

* @enduml
*/
—————————

・doxygenで出力されたout_dir\htmlフォルダ下の.htmlファイル抜粋
 @startuml~@endumlの部分が、img src=”XXXX.png” に成っているから、
カレントフォルダにXXXX.pngが有れば(生成されれば)、図がドキュメントに表示される。

◆PlantUMLの.batファイルの内容
・PlantUML.batを実行すると、XXXX.puが読み込まれ XXXX.pngが生成される
文字コードは、doxygenにより UTF-8で出力されてるため -charset UTF-8を指定。
(javeへのPATHが通っていない場合、javaへの相対パスを記載した例)
—————————
echo *** Graphviz起動 ***
set GRAPHVIZ_DOT=D:\User\070_Document\PlantUML\graphviz-2.38\bin\dot.exe
echo *** PlantUML起動 ***
PlantUML\jre7\jre1.7.0\bin\java -jar PlantUML\plantuml.jar -v -charset UTF-8 doxygen-1.8.12\out_dir\html\*.pu
—————————