STM32CubeMXに関する事 6 RTC割り込みを使う 2 [STM32F]
STM32CubeMXを使って割り込みを設定します。
こんどこそRTCによる周期割り込みを利用します。
1.コールバックルーチン
RTC割り込みをユーザーが利用する時は、stm32f1xx_hal_rcc_ex.cの中のHAL_RTCEx_RTCIRQHandlerからユーザーのコールバックルーチンが呼ばれます。
この時の関数名は指定されており、どこかのファイルに以下の様に記述します。
この例では1秒周期でunixTimeと言う大域変数が1増加します。
2.あとはこの変数を煮るなり焼くなり。
気を取り直して、、、
こんどこそ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.あとはこの変数を煮るなり焼くなり。
気を取り直して、、、
STM32CubeMXに関する事 6 RTC割り込みを使う 1 [STM32F]
STM32CubeMXを使って割り込みを設定します。
すでにRTCを有効にしていますので、RTCによる周期割り込みを行います。
1.STM32CubeMXのConfigurationタブからSystemのNVICをクリックしてRTCの割り込み優先度を調整します。
2.ControlのRTCをクリックしてParameter Settingを開きます。
初期のカレンダーの値を設定しています。設定していますがSTM32F103のRTCはカレンダー機能を持っていませんので、ソフトウエア的に何かをしているのだと思います。
注意点は、時間は12時間表記、西暦は下位の2桁を入力する点でしょうか?
3.コードを生成します。CoIDEのファイル構成が更新されますので、CoIDEのProjectウインドウ上のProject名を選択してF5キーを押します。
それでビルドすると、あらあらエラーが出ちゃいました。この作業、2回目ですが、もしかして2回目以降はこのバグが出るのかも。
4.バッテリーバックアップ付き対策
このAitendoの基板にはバッテリーが搭載されている為、STM32F103のバックアップドメインは電源が落とされてしまっても、元の内容が消えません。RTCはこのバックアップドメインに属するので、電源断時も動いています。
このMX_RTC_Init関数の内部ではバックアップドメインのバックアップレジスタの内容が、以前設定された値であるかどうかでRTCの状況を判断しています。もしその値が正常であれば、RTCのカウンターの値(カレンダー)を変更しません!ってことが通常処理なのですが、今は今の時間を刻んで欲しいので、0x32F2と比較しているIF文を無効にしました。
5.割り込み許可
1秒割り込み許可をMX_RTC_Init()の後に記述します。
すでにRTCを有効にしていますので、RTCによる周期割り込みを行います。
1.STM32CubeMXのConfigurationタブからSystemのNVICをクリックしてRTCの割り込み優先度を調整します。
2.ControlのRTCをクリックしてParameter Settingを開きます。
初期のカレンダーの値を設定しています。設定していますがSTM32F103のRTCはカレンダー機能を持っていませんので、ソフトウエア的に何かをしているのだと思います。
注意点は、時間は12時間表記、西暦は下位の2桁を入力する点でしょうか?
3.コードを生成します。CoIDEのファイル構成が更新されますので、CoIDEのProjectウインドウ上のProject名を選択してF5キーを押します。
それでビルドすると、あらあらエラーが出ちゃいました。この作業、2回目ですが、もしかして2回目以降はこのバグが出るのかも。
4.バッテリーバックアップ付き対策
このAitendoの基板にはバッテリーが搭載されている為、STM32F103のバックアップドメインは電源が落とされてしまっても、元の内容が消えません。RTCはこのバックアップドメインに属するので、電源断時も動いています。
このMX_RTC_Init関数の内部ではバックアップドメインのバックアップレジスタの内容が、以前設定された値であるかどうかでRTCの状況を判断しています。もしその値が正常であれば、RTCのカウンターの値(カレンダー)を変更しません!ってことが通常処理なのですが、今は今の時間を刻んで欲しいので、0x32F2と比較しているIF文を無効にしました。
5.割り込み許可
1秒割り込み許可をMX_RTC_Init()の後に記述します。
/* USER CODE BEGIN 2 */ HAL_RTCEx_SetSecond_IT( &hrtc ); /* USER CODE END 2 */6.動かす セミホスティングでカレンダー出力しています。
7.割り込みが来ている事を確認してみる stm32f1xx_it.cの中にRTC_IRQHandlerと言う割り込みハンドラーが追加されています。 この中にBREAKを貼り、止めてみました。
まあでも、このカレンダー機能は要らないかなぁ、、、 ひじょうにbuggyで、このまま使い続けて大丈夫なんだろうか、、、と思っているところです、、、はぁ。
STM32CubeMXに関する事 4 CoIDEで開発 6 [STM32F]
STM32CubeMXコードジェネレータの出力を、CoIDE環境で動かしたい!と言う話
STM32CubeMXで機能を追加してコードを生成する度に、mainの中のwhileループ辺りが変な事になるなぁ!と思っていたんです。
もともと最初に生成されるコードが以下の様に、気持ち悪い入れ子構造になっています。
これ、以下の様に直しましょう。たぶん、、、
コードジェネレーター、たぶんまだまだ不具合があるので、コードを再生成する前に上手く動いていた前のバージョンは保存しておいた方が良いかも。
それと、頑張って作った重要なコードは、なるべくコードジェネレーターに依存しない別のファイルに書いた方が良いと思う。
たぶん続くんじゃないかなぁ。
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 */
コードジェネレーター、たぶんまだまだ不具合があるので、コードを再生成する前に上手く動いていた前のバージョンは保存しておいた方が良いかも。
それと、頑張って作った重要なコードは、なるべくコードジェネレーターに依存しない別のファイルに書いた方が良いと思う。
たぶん続くんじゃないかなぁ。
STM32CubeMXに関する事 5 セミホスティングを使う [STM32F]
ST-LINK V2だけの機能なのか?ST-LINK V1ではどうだっけ?他のオンチップデバッガーの状況は?さっぱり知りませんが、セミホスティング便利です。
従来UARTの一部を使って、動作中のメッセージ等を出力してデバッグとかしている事も多いと思いますが、セミホスティングを使えば特別にI/Fを用意する事無く、デバッガーの画面にメッセージを出力する事も、なにか文字を受信することもできます。
使い方は簡単。プロジェクトにリポジトリでSemihostingを追加し、CoIDEの設定(Configuration)のDebuggerタブでAdvanceのSemihosting Enableにチェックを入れるだけでした。
main.cのこの部分にsemihosting.hをインクルードします。
main.hのこの部分に以下のマクロを追加します。
mainのwhileループにこれを追加します。
以上
従来UARTの一部を使って、動作中のメッセージ等を出力してデバッグとかしている事も多いと思いますが、セミホスティングを使えば特別にI/Fを用意する事無く、デバッガーの画面にメッセージを出力する事も、なにか文字を受信することもできます。
使い方は簡単。プロジェクトにリポジトリでSemihostingを追加し、CoIDEの設定(Configuration)のDebuggerタブでAdvanceのSemihosting Enableにチェックを入れるだけでした。
main.cのこの部分にsemihosting.hをインクルードします。
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++ );
以上
STM32CubeMXに関する事 4 CoIDEで開発 5 [STM32F]
STM32CubeMXコードジェネレータの出力を、CoIDE環境で動かしたい!と言う話
前回まではLED1をチカチカしました。
今回はSTM32CubeMXでGPIOの出力を増やし、4つのLEDチカチカを行います。
1.STM32CubeMXを起動し、先に作成したSTM32CubeMXのプロジェクトを開き、PIN配置の画面でGPIOの出力を追加します。LEDとの接続は図の様になっています。
2.LEDにラベルを付加します。
3.コードを生成すると変更の必要なファイルは上書きされます。ただしユーザーが記述したコード、おそらく「USER CODE BEGIN」で始まり、「USER CODE END」で終わる範囲内は保護されるような気がします。
今回はmain.hとmain.cに記述が追加されています。
4.だらっ!としたコードを書いてみました。
たぶん続くんじゃないかなぁ。
前回まではLED1をチカチカしました。
今回はSTM32CubeMXでGPIOの出力を増やし、4つのLEDチカチカを行います。
1.STM32CubeMXを起動し、先に作成したSTM32CubeMXのプロジェクトを開き、PIN配置の画面でGPIOの出力を追加します。LEDとの接続は図の様になっています。
2.LEDにラベルを付加します。
3.コードを生成すると変更の必要なファイルは上書きされます。ただしユーザーが記述したコード、おそらく「USER CODE BEGIN」で始まり、「USER CODE END」で終わる範囲内は保護されるような気がします。
今回はmain.hとmain.cに記述が追加されています。
4.だらっ!としたコードを書いてみました。
たぶん続くんじゃないかなぁ。
STM32CubeMXに関する事 4 CoIDEで開発 4 [STM32F]
STM32CubeMXコードジェネレータの出力を、CoIDE環境で動かしたい!と言う話
前回まではCoIDEで生成したコードを取り込みました。
今回はLEDチカチカを記述していきます。
1.STM32CubeMXの出力にはサンプルが含まれていないので、生成されたコードの使い方がイマイチ判りません。
STマイクロのサイトに行って、このファイルを落としてくると周辺機能ごとのサンプルが有りますので、これを参照します。
http://www.st.com/en/embedded-software/stm32cube-embedded-software.html?querycriteria=productId=LN1897
2.先ほどのPC6にラベル付けを行った定義はmain.hに、初期化コードはmain.cに書かれています。
3.mainのwhileループの中にチカチカを書いてみました。
HAL_GPIO_WritePinはstm32f1xx_hal_gpio.hに、HAL_Delayはstm32f1xx_hal.hに宣言されていますが、なぜかHAL_Delayにはエラー表示が、、、
4.デバッガーを起動して、今回はREMAPによるデバッガーの暴走は発生しませんでした(笑)。
たぶん続く。
前回まではCoIDEで生成したコードを取り込みました。
今回はLEDチカチカを記述していきます。
1.STM32CubeMXの出力にはサンプルが含まれていないので、生成されたコードの使い方がイマイチ判りません。
STマイクロのサイトに行って、このファイルを落としてくると周辺機能ごとのサンプルが有りますので、これを参照します。
http://www.st.com/en/embedded-software/stm32cube-embedded-software.html?querycriteria=productId=LN1897
2.先ほどのPC6にラベル付けを行った定義はmain.hに、初期化コードはmain.cに書かれています。
3.mainのwhileループの中にチカチカを書いてみました。
HAL_GPIO_WritePinはstm32f1xx_hal_gpio.hに、HAL_Delayはstm32f1xx_hal.hに宣言されていますが、なぜかHAL_Delayにはエラー表示が、、、
4.デバッガーを起動して、今回はREMAPによるデバッガーの暴走は発生しませんでした(笑)。
たぶん続く。
STM32マイコン徹底入門 (TECH I Processor)
- 作者: 川内 康雄
- 出版社/メーカー: CQ出版
- 発売日: 2010/10/29
- メディア: 単行本
ARM Cortex‐M3システム開発ガイド―最新アーキテクチャの理解からソフトウェア開発までを詳解 (Design Wave Advance)
- 作者: Joseph Yiu
- 出版社/メーカー: CQ出版
- 発売日: 2009/05/01
- メディア: 単行本
STM32CubeMXに関する事 4 CoIDEで開発 3 [STM32F]
STM32CubeMXコードジェネレータの出力を、CoIDE環境で動かしたい!と言う話
前回まではSTM32CubeMXを使ってコード生成しました。
今回はCoIDEで生成したコードを取り込みます。
1.STM32CubeMXの出力先に、先に生成したCoIDEのプロジェクトフォルダーを指定したためか、C Libraryとかセミホスティングのコードが削除されてしまいました。諦めてもう一度リポジトリから追加します。
また、ファイルエクスプローラからドラッグ&ドロップでCoIDEのプロジェクトツリーに
Drivers、Inc、Src、startupの4つを放り込みます。
2.CoIDEの設定(Configuration)タブを開き、Compileタブから設定します。赤枠の定義を追加します。
3.Linkタブでオプションを赤枠の通りに、リンカースクリプトをTrueIDE用に生成されたスクリプトを選択します。
4.DebuggerタブでSWDとなっている事を確認します。セミホスティングを使う場合はSemiHosting enableにチェック
5.ビルドするとエラーが出ます(笑)。
セミホスティング機能を追加した時に追加されたファイルのsh_cmd.sのHardFault_Handlerがぶつかっている為です。プロジェクトから削除してしまいます。
嘘です。sh_cmd.sを削除するのではなく、sh_cmd.sの15行目辺りのglobal宣言をコメントアウトします。こんな風に。
/*.global HardFault_Handler*/
またまた長いので続く。
前回まではSTM32CubeMXを使ってコード生成しました。
今回はCoIDEで生成したコードを取り込みます。
1.STM32CubeMXの出力先に、先に生成したCoIDEのプロジェクトフォルダーを指定したためか、C Libraryとかセミホスティングのコードが削除されてしまいました。諦めてもう一度リポジトリから追加します。
また、ファイルエクスプローラからドラッグ&ドロップでCoIDEのプロジェクトツリーに
Drivers、Inc、Src、startupの4つを放り込みます。
2.CoIDEの設定(Configuration)タブを開き、Compileタブから設定します。赤枠の定義を追加します。
3.Linkタブでオプションを赤枠の通りに、リンカースクリプトをTrueIDE用に生成されたスクリプトを選択します。
4.DebuggerタブでSWDとなっている事を確認します。セミホスティングを使う場合はSemiHosting enableにチェック
5.ビルドするとエラーが出ます(笑)。
セミホスティング機能を追加した時に追加されたファイルのsh_cmd.sのHardFault_Handlerがぶつかっている為です。
嘘です。sh_cmd.sを削除するのではなく、sh_cmd.sの15行目辺りのglobal宣言をコメントアウトします。こんな風に。
/*.global HardFault_Handler*/
またまた長いので続く。
STM32マイコン徹底入門 (TECH I Processor)
- 作者: 川内 康雄
- 出版社/メーカー: CQ出版
- 発売日: 2010/10/29
- メディア: 単行本
ARM Cortex‐M3システム開発ガイド―最新アーキテクチャの理解からソフトウェア開発までを詳解 (Design Wave Advance)
- 作者: Joseph Yiu
- 出版社/メーカー: CQ出版
- 発売日: 2009/05/01
- メディア: 単行本
STM32CubeMXに関する事 4 CoIDEで開発 2 [STM32F]
STM32CubeMXコードジェネレータの出力を、CoIDE環境で動かしたい!と言う話
前回まではCoIDEでプロジェクトを新規生成しました。
今回はSTM32CubeMXを使ってコード生成します。
1.STM32CubeMXを起動して
2.ポチポチとマイコンを選択
3.PIN配置の画面が開く
4.マイコンのICの足をクリックすると、この端子の機能が選択できるようになる。今回はGPIOの出力に設定。また左のペインのSYSを展開してデバッガ機能としてSWDを有効化。
5.RCC、RTC等はクロックソースに応じて有効化。
6.クロックの設定のタブを開き、クロックソースとか、倍率を設定。今回は外部に8Mのクリスタルを実装している事から、このマイコンの最大の72MHzで動くように設定。
7.設定のタブでGPIOをクリックし、LEDを接続してあるPC6に適当なラベルを付加
8.電力計算機能の使い方はよく判らんので、スルー。
9.生成するプロジェクトの名前などの設定。ToolchainはTrueIDEを選択している。
10.生成するプロジェクトの生成コードに関する設定。必要な機能のみ生成と未接続の端子をアナログ扱い?
11.コードの生成を行う。また、コード生成プロジェクト自身を適当なフォルダーに保存。
またまた長いので続く。
前回まではCoIDEでプロジェクトを新規生成しました。
今回はSTM32CubeMXを使ってコード生成します。
1.STM32CubeMXを起動して
2.ポチポチとマイコンを選択
3.PIN配置の画面が開く
4.マイコンのICの足をクリックすると、この端子の機能が選択できるようになる。今回はGPIOの出力に設定。また左のペインのSYSを展開してデバッガ機能としてSWDを有効化。
5.RCC、RTC等はクロックソースに応じて有効化。
6.クロックの設定のタブを開き、クロックソースとか、倍率を設定。今回は外部に8Mのクリスタルを実装している事から、このマイコンの最大の72MHzで動くように設定。
7.設定のタブでGPIOをクリックし、LEDを接続してあるPC6に適当なラベルを付加
8.電力計算機能の使い方はよく判らんので、スルー。
9.生成するプロジェクトの名前などの設定。ToolchainはTrueIDEを選択している。
10.生成するプロジェクトの生成コードに関する設定。必要な機能のみ生成と未接続の端子をアナログ扱い?
11.コードの生成を行う。また、コード生成プロジェクト自身を適当なフォルダーに保存。
またまた長いので続く。
STM32マイコン徹底入門 (TECH I Processor)
- 作者: 川内 康雄
- 出版社/メーカー: CQ出版
- 発売日: 2010/10/29
- メディア: 単行本
STM32CubeMXに関する事 4 CoIDEで開発 1 [STM32F]
STM32CubeMXコードジェネレータの出力を、CoIDE環境で動かしたい!と言う話
まずCoIDEでプロジェクトを新規生成します。ターゲットはAitendoのSTM32F103VE基板(MB-STM32F103)、なんと引っ越し価格?で一枚999円だす。
※ただしUSB/シリアルのPL-2303HXのドライバがWindows10に対応していないくて、ちょっとだけ苦労します。ここを参照-> http://www.ifamilysoftware.com/news37.html
このボードには4つのLEDが実装されています。接続はこんな感じです。って、回路図が断片化したjpegファイルしか無くてつらい、、、
PC6に接続されているLED、D1をチカチカさせてみましょう。
1.CoIDEで新規プロジェクトを作成開始
2.CHIPを選択
3.STM32F103VEを選択
4.リポジトリで最低限の機能を追加。欲しいのはC Libraryと、デバック用にセミホスティング
※とは言え、後程Stm32CubeMXを動かすと無残にも削除?されてしまうので、何も選択しなくてもいいのかも、、、
5.main.cとか要らないので、、、フォルダーとプロジェクトから削除、
長いので続く!
まずCoIDEでプロジェクトを新規生成します。ターゲットはAitendoのSTM32F103VE基板(MB-STM32F103)、なんと引っ越し価格?で一枚999円だす。
※ただしUSB/シリアルのPL-2303HXのドライバがWindows10に対応していないくて、ちょっとだけ苦労します。ここを参照-> http://www.ifamilysoftware.com/news37.html
このボードには4つのLEDが実装されています。接続はこんな感じです。って、回路図が断片化したjpegファイルしか無くてつらい、、、
PC6に接続されているLED、D1をチカチカさせてみましょう。
1.CoIDEで新規プロジェクトを作成開始
2.CHIPを選択
3.STM32F103VEを選択
4.リポジトリで最低限の機能を追加。欲しいのはC Libraryと、デバック用にセミホスティング
※とは言え、後程Stm32CubeMXを動かすと無残にも削除?されてしまうので、何も選択しなくてもいいのかも、、、
5.main.cとか要らないので、、、フォルダーとプロジェクトから削除、
長いので続く!
STM32マイコン徹底入門 (TECH I Processor)
- 作者: 川内 康雄
- 出版社/メーカー: CQ出版
- 発売日: 2010/10/29
- メディア: 単行本