STM32CubeIDEでのデバッグ
STM32 Nucleoでデバッグ
数年前から、STM32CubeMXを使ってNucleoボードのデバッグができるところを確認しようと思っていた。先日、ようやく重い腰をあげて、トライしようとSTM32の開発関連サイトを見ると、STM32CubeIDEという統合環境を使った方がベターあることが判明。(とは言っても、これもかなり前から存在している。)
STM32CubeIDE
ここからDownload。このIDEの特徴を箇条書き(引用)する。
- advanced C/C++ development platform
- based on the Eclipse®/CDT framework
- GCC toolchain for the development, and GDB for the debugging
使用したボード
Nucleo STM32F303RE。各種サイトで2000円程度で売られている。
テストサンプル
ボード内にあるボタンを押したら、LEDが数回繰り返し点滅する、、、という単純なもの。
STM32CubeIDEの操作手順
プロジェクト作成
"File","New","STM32 Project"を選択。
Targetを選ぶ画面が表示されるので、所持するSTM32F303REを”Part Number”に入れて検索&選択。
その後、"Project Name"に名称を入力して"Finish"。
ピンアサイン
初期状態は下記のとおり。
Datasheetによると、ボタンはPC13に、LEDはPA5にアサインされている。
PC13をクリックし、"GPIO_Input"を選ぶ。
PA5については、"GPIO_Output"を選ぶ。
ソースコード生成
"Project","Generate Code"を選択。
すると、Core/Src/main.cにGPIO初期化コードが自動生成される。
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
(略)
/* Initialize all configured peripherals */
MX_GPIO_Init();
(略)
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
/*Configure GPIO pin : PC13 */
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : PA5 */
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
PC13とPA5の初期化コード(前者はINPUT、校舎はOUTPUTなど)が見える。
処理をソースコードへ
「ボタンを押したら、LEDが数回(下記では5回)繰り返し点滅する」処理を、main()に追加する。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
if (!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)) {
for (i=0; i<5; i++) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
HAL_Delay(1200);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_Delay(200);
}
}
HAL_Delay(100);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
ボタン押下読み取りにはHAL_GPIO_ReadPin()を、LED点灯にはHAL_GPIO_WritePin()を使う。STM32F3シリーズのAPI(HAL)の詳細はこちらで見つかる。
実行
初めての実行、"Run"をクリック。
こんな画面が出たかもしれない。(2回目以降、表示されなくなったかも、、、。)
OKをクリックしたら、アンチウイルスソフトAvastから警告あり。
調べると、ここに該当記事が見つかったので、例外登録(例外を作成)してそのまま進むことにした。
期待どおりの動作(ボタンを押したら、LEDが数回繰り返し点滅する)を確認したので、次のデバッグに進む。
デバッグ
Runメニューにある"Debug"または"Debug As"をクリック。
次のメッセージが表示されることもあるが、"Switch"をクリックして次に進む。
すると、main()の最初の実行箇所「HAL_Init();」で止まるようだ。
次に、for文の最後の処理である102行目「HAL_Delay(200);」にブレークポイントを設定する(Toggle Line Breakpointを選択)。
設定後には、ブレークポイントらしきマークが行番号左に表示される。
実行を再開する("Resume"をクリック)。
すると、ブレークポイントで止まる。for文の繰り返し変数カウンタである”i”が"0"となっているのが見える。
さらに、"Resume"すると、同じブレークポイントで止まる。今度は、変数”i”が"1"となっているのが見える。
例えば、”Value"をクリックし、値を変更することも可能。
終わりに
まずは初期の目的達成。
Author And Source
この問題について(STM32CubeIDEでのデバッグ), 我々は、より多くの情報をここで見つけました https://qiita.com/infinite1oop/items/98e512adbeadc7136efe著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .