STM32CubeIDE
STM32F103C8T6がArduinoでぼつぼつ使えるようになってきました。便利なライブラリーがありますので難しいデバイスも簡単に扱うことができます。しかしその反面、プラモデルを組み立てるような満たされない気持ちが残ります。このMCUをダイレクトに扱えないかと思っているうちにSTM32CubeIDEがバージョンアップされたことを知りました。どこまで考えられるか、はともかくとして足を踏み入れてみました。
1 CubeIDEの環境設定 2019.07.23
2 CubeIDEとBluePillについて感じること 2019.07.28
3 Lチカ 2019.07.28
4 シリアル通信のテスト 2019.07.28
5 タイマー割り込みによるLチカ 2019.07.29
1 CubeIDEの環境設定 2019.07.23
STM32CubeIDEをhttps://www.st.com/ja/development-tools/stm32cubeide.htmlからダウンロードしました。下方にあるSTM32CubeIDE-Win STM32CubeIDE Windows Installer 1.0.2 を選びます。
解凍してexeファイルを実行するとデスクトップにショートカットができます。(今日にはバージョンが1.02に変わっていました)
ショートカットのクリックで実行に移りますが、まずワークスペースの場所を聞いてきます。個人ホルダーの深いところが指定されますが浅いほうが便利なのでCドライブの浅いところに設定しています。
最初に現れるのがこの画面です。
左のSTM project を選びます。次の画面でMCUを選びます。「103C」で検索すると簡単です。
プロジェクト名を入れて次へ進みます。(時間がかかることがあります)
次の画面で クロック GPIO serial など多くの設定を行います。
この画面を終了して Project→Generate Code を押すと(押さなくても?)main.c が作られます。
あと、ユーザー領域にプログラムを書いて進めます。(自分自身よくわかっていません)
1 CubeIDEの環境設定 おわり ↑
2 CubeIDEとBluePillについて感じること 2019.07.28
1 開発プログラムを置くフォルダが自由にならない:
IDEは最初に作ったプロジェクトを記憶しているが、フォルダの変更には対応できていない。したがってサブフォルダを作って整理することなどできない。規定のフォルダに羅列することになる。mbedと似ている感じ。
2 プロジェクトの名前変更ができない:
プログラム作製は部分のテストの積み重ねでしていますが、一つのテストが終わればバックアップを取ってから次へ進みたいのですが、名前を変更して次へ進めません。test01が成功すれば、それを残してtest02へ進みたいのですがうまい方法がありません。また、一応完成したtest12をtestの名で保存することができません。(rename もあるけれど。どう使うのか…)
3 最初の設定で忘れてはならないこと:
MCUの初期設定で、SYSを定義してserial wire debug を有効にしておくこと。これを知らずにプログラムを書き込み後、読み出し・消去・書き込みがSWD端子からSTLinkでできなくて悩みました。RCCの定義も必要です。serialなども必要に応じて定義します。
:
2 CubeIDEとBluePillについて感じること おわり ↑
3 Lチカ 2019.07.28
このボードを使いました。
LEDを3コ点滅しました。ビルトインの PC13 と PA12 PB9 です。プログラム名は blink1 に最終的に変更しました。
書き加えた点は次の部分です。
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(100);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_12);
HAL_Delay(100);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
プログラム中の GPIO_PIN_9 は 1<<9 と書いても動きました。
3 Lチカ おわり ↑
4 シリアル通信のテスト 2019.07.28
上のLチカと同じボードを使っています。
serial1ポートからTeraTeamにメニューを送り、キーボードからの1文字を受け取って、それに応じた文字列を返します。
初期設定で UART1 を設定します。ボーレートはいつもの 9600 にしています。
書き込んだプログラムは次の2ヶ所です。プログラム名は uart1 です。
int main(void)
{
/* USER CODE BEGIN 1 */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
char *msg = { "1〜4までのキーを押してください。\r\n" };
HAL_UART_Transmit( &huart1, msg, strlen(msg), 0xFFFF );
char *strings[] = { "Good Morning おはよう\r\n", "Good afternoon\r\n", "Good night\r\n", "Hello\r\n" };
char v;
/* USER CODE END 1 */
/* USER CODE BEGIN WHILE */
while (1)
{
if( HAL_UART_Receive( &huart1, &v, 1, 0xFFFF ) == HAL_OK )
{
switch( v )
{
case '1': HAL_UART_Transmit( &huart1, strings[ 0 ], strlen( strings[ 0 ] ), 0xFFFF ); break;
case '2': HAL_UART_Transmit( &huart1, strings[ 1 ], strlen( strings[ 1 ] ), 0xFFFF ); break;
case '3': HAL_UART_Transmit( &huart1, strings[ 2 ], strlen( strings[ 2 ] ), 0xFFFF ); break;
default : HAL_UART_Transmit( &huart1, strings[ 3 ], strlen( strings[ 3 ] ), 0xFFFF ); break;
}
}
/* USER CODE END WHILE */
4 シリアル通信のテスト おわり ↑
5 タイマー割り込みによるLチカ 2019.07.29
タイマー動作の練習としてLチカをしました。よくわかっていないのでWEBの報告をトレースしただけです。ボードは上記のLチカのものを使っています。
TIMER2で周期を決めてLEDをトグルしています。
プロジェクトの元は上記のblink1をコピーして、プロジェクトと.iocをtimer1とrenameしています。
まず、ハードウエアの設定です。.ioc設定画面で、
TIM2 を選択し、
@Clock Source で Internal Clockを設定します。
APrescaler:999(1/1000、1000-1 を設定)に、
BCounter period:8000 (16Mhz ÷1000÷8000=2hz→0.5秒)
CNVIC settings:TIM2 global interrupt: [v] Enabled チェックを入れる。
main.cに進んで次の部分を書き込みます。
@
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == &htim2) //TIM2なら
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_12);
}
}
/* USER CODE END 0 */
----------------------------------------------
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2); //割り込み有効でスタート
HAL_SuspendTick();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
}
/* USER CODE END 3 */
予定通りのLチカになりました。スリープモードになっているせいかフラッシュの更新ができません。STM32 ST-LINK Utilityでリセット消去すると書けるようになります。スリープモードでSWDが使えるようにするにはどうすればよいのでしょうか。
5 タイマー割り込みによるLチカ おわり ↑
工事中
1 めんにゅー 1 ほ そ く
1 めんにゅー 1 おわり ↑