問題タブ [stm32]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
embedded - STM32 フラッシュで複数のアプリケーションを実行する
STM32 フラッシュに 2 つのアプリケーションが必要です。1 つは基本的にブートで、もう 1 つは「メイン」アプリケーションです。それぞれをフラッシュのさまざまな領域にロードする方法を見つけました。メモリ ダンプを取得した後、すべてが適切な場所にあるように見えます。
そのため、リセットを行うとブートがロードされ、現時点でブートが行うのはアプリケーションへのジャンプだけです。ブートをデバッグすると、これはすべて正しく機能しているように見えます。ただし、アプリケーションにジャンプした後に問題が発生し、1 つの命令 (アセンブリ) を実行しただけで、ブートに戻ります。アプリケーションに無期限に保持する必要があります。
私の質問は、アプリのどこに「ジャンプ」する必要があるかということです。
割り込みベクトル、リセット ハンドラー、アプリのメイン関数など、いくつかの潜在的なスポットがあるようです。実際、私はそれらすべてを試しましたが、成功しませんでした。
うまくいけば、それが理にかなっています。そうでない場合は、質問を更新します。
ご協力いただきありがとうございます!リチャード
アップデート:
- 私はデバッガーで遊んで、手動でプログラム カウンターをアプリケーションのメインに変更しましたが、それは魅力的に機能したので、ジャンプに何か問題があると思います。なぜプログラム カウンターが動かないのですか?ジャンプの後?
- 実際には PSR のようです。「T」はジャンプ時にリセットされます。ジャンプ後に再度設定すると、アプリは希望どおりに続行します
- わかりました解決策が見つかりました。分岐を行うとき、または「ARM」モードに入るときにPC LSBを1に設定する必要があるようです(「サム」モードのような16ビット命令ではなく32ビット命令。かなりあいまいな小さな問題、あなたと共有させてくれてありがとう!
gcc - Ubuntu: STM32 (Cortex-M3) のクロスコンパイル時に使用する gcc は?
私は STM32 (Cortex-M3) を使い始めようとしています。私の計画は、これを Ubuntu (9.04 / AMD64) から機能させることです。
まず、Olimex stm32-h103ヘッダー ボードとOlimex ARM-USB-OCD jtagを入手しました。その上で、おそらく OpenOCD、gcc、および Eclipse を使用します。
しかし、現在、使用する gcc のバージョンと、コードをクロスコンパイルできるように設定する方法を検討しています。
そこにはいくつかの腕のプロジェクトがあるようですが、何から始めるべきかわかりません。誰かが私を正しい方向に押してくれますか?
ありがとうヨハン
更新: codesourceryから欲しいものがほとんどあるようですが、AMD64 ではなく IA32 に焦点を当てているようです。
ただし、サポートされているデバイスでは、Cortex-M3 を見つけました
- ARM EABI、ARM M プロファイル シミュレータ -mcpu=cortex-m3 -mthumb
更新:AMD64にIA32をインストールする可能性があるため、マークされた回答はすでに廃止されている可能性があります。
更新: Cortex-M3 のクロスコンパイルに関するこのリンクを見つけました。
c - STM32 I2C1 開始ビットが SR1 レジスタに設定されていません
i2c EEprom と通信するように stm32 をプログラムしようとしていますが、次のように言うたびに次のようになります。
デバッガーを使ってみたところ、SR1 ビット 0 フラグ (開始ビット生成フラグ) が設定されていないことがわかりました。これが原因で、コードがハングします。オシロスコープで、スタート ビットが生成されていることがわかります。これは時々機能します。連続して複数の書き込みを行おうとすると、通常は壊れます。ハードウェアがすべて正常に見えることを確認しました。i2c バスで実行している周波数を確認しました。24lc1025 eeprom 内で 100Khz です。
何か案は、
ありがとう
c - Cortex-M3(STM32)のRAMから関数を実行するにはどうすればよいですか?
Cortex-M3プロセッサ(STM32)のRAMから関数を実行しようとしています。この関数は内部フラッシュを消去して再書き込みするので、私は間違いなくRAMにいる必要がありますが、どうすればよいですか?
私が試したことはこれです:memcpyを使用してRAM内のバイト配列に関数をコピーし(正しく整列されることを確認します)、バイト配列を指すように関数ポインターを設定してから、関数(ポインター)を呼び出します。
これはおそらく10命令で正常に機能しますが(デバッガーで実行を追跡できます)、バスエラーが発生し、プロセッサーがリセットされます。バスエラーはループの2番目のパスで発生するため、コードは正常である必要があります(最初のパスで機能するため)。RAMアクセスが速いと、バスのタイミングがなんらかの形で台無しになると思います...
とにかく、これを行う正しい方法はありますか?関数をRAMに自動的に配置するスキャッターファイルはどのように見えますか(私はCortex-M3にKeil uVisionを使用しています)?
編集:詳細:ツールチェーン:RealView MDK-ARM V 4.10コンパイラ:Armcc v4.0.0.728アセンブラ:Armasm v4.0.0.728リンカー:ArmLink v4.0.0.728プロセッサ:STM32F103ZE
リセットが発生すると、IMPRECISERRビットがバス障害レジスタに設定されます。
embedded - Cortex-M3 STM32F103 コアは、FPEC がビジーでフラッシュからこれ以上命令をフェッチできないため、フラッシュ ページの消去中に停止しますか?
STM32F103 では、フラッシュ ページの消去に 20 ミリ秒かかり、その間にコアがストールします。ST PM00042 フラッシュ プログラミング マニュアルからは、フラッシュ ページを消去するときにコアが常にストールするのか、それとも命令ストリーム自体がフラッシュ メモリ (私のプロジェクト) にあり、FPEC (フラッシュ メモリ インターフェイス) がビジーで、これ以上命令をフェッチできません。
この質問のもう 1 つの言い方は、「フラッシュ プログラミング コードを RAM から実行すると、フラッシュ ページ消去のストールを回避できますか?」です。
ありがとう、
c - STM32 printf と RTC
* アップデート *
これが私が見つけたものです。その関数がそこにあるときはいつでも、実際にコードがロックされることはありません。実際には、RTC I²C 関数の読み取りが非常に遅くなりますが、コードは適切に実行されますが、RTC を読み取るたびに、通過するまで非常に長い時間待たなければなりませんでした。
そのため、RTC のアラーム割り込みがあり、これが ISR 内の他の I²C 相互作用をトリガーしていたため、2 つの I²C 通信を同時に実行しようとしていたようで、プロセスが遅くなりました。ISR の機能を削除しましたが、現在は機能しています。引き続き調査していきます。
IAR 5.40 を使用して STM32F103 マイクロコントローラをプログラミングしているときに、この問題が発生しています。ローカル変数を printf しようとすると、問題の関数に到達する前に別の時点でコードがフリーズするというこの関数があります。
これを引き起こしている可能性があるのは何ですか?
これは機能です:
私もこれを試しましたが、これは私が経験したロックを引き起こしません:
最適化がまったく有効になっておらず、I²C RTC からバイトを読み込もうとするとコードが動かなくなりますが、これを削除するprintf("index = %s\n", bTmpSms);
か、代わりにこれを使用するとすぐにprintf("index = 2\n");
、すべてがうまくいきます。何か案は?
bSmsIndex が実際には 30 を超えることはありません。その場合でも、この関数が呼び出される前にロックが発生します。
arm - ARM Cortex M3 ベースの MCU のサンプル コードは?
より具体的にはSTM32F107。
ST の Web サイトにはほとんどコードがなく、ダウンロード可能なライブラリさえも見つかりませんでした (ただし、それらが存在する必要があることを示すいくつかの言及は見つかりましたか?)。他の選択肢があるときに使いにくいプロセッサを選択したくないので、これは少し怖いです。(ただし、この特定のプロセッサーは他のすべての要件を満たしているため、これを代替品の質問として解釈しないでください)
だから基本的に、ここの誰かが私を正しい方向に向けてくれることを望んでいました.
無料の Raisonance ツールセットを使用する予定ですが、C に限定されているようです。ただし、C と C++ (および純粋なアセンブリ) の両方の例は素晴らしいでしょう。USB の例は特に興味深いものです。
c - IAR での C プログラミング
IAR プラットフォームでコーディングを行っており、次のことを行いたいと考えています。私は次のように持ってtypedef
います
これらの後、次の変数を宣言します。
しかし、エラーが発生します:
これを解決するにはどうすればよいですか?
gdb - openOCDとgdbを使用してSTM32フラッシュをプログラムする方法
私はOlimexARM-USB-OCDドングルとopenOCDおよびGDBを使用して、stm32f103マイクロをプログラムおよびデバッグしています。私が使用しているIDEは、Olimex dev-kit CDからのものであり、Eclipseganymedeを使用しています。
小さなプログラムをRAMにロードして、問題なくコードをステップ実行できます。
私は今、RAMに収まらないはるかに大きなプログラム(わずか20K)を持っているので、フラッシュ(128K)から実行したいと思います。
プログラムコードをフラッシュセクション(アドレス0x8000000)に配置する必要があることを示すリンカースクリプトを変更しましたが、gdbはプログラムのロードに失敗します。
gdbにプログラムをフラッシュにロードさせるにはどうすればよいですか?
embedded - USB仮想COMポートデバイスから開いているPCCOMポートを検出する
STM32_USB-FS-Device_Lib_V3.2.1 USBライブラリでSTM32F105マイクロコントローラーを使用しており、VCPの例を目的(RTOSおよびシリアルAPIとの統合)に適合させています。
問題は、USBケーブルが接続されているが、Windowsホストでポートが開いていない場合、数分後、ポートが開くまでデバイスがUSB ISRに永続的に再入して、すべてが正常に動作し始めることです。
割り込みハンドラーをインストルメントしましたが、障害が発生すると、ISRハンドラーが終了し、すぐに再入することがわかります。これは、割り込みの終了時にOTG_FS_GINTSTSのIEPINTフラグがクリアされていないために発生します。この時点でのOTG_FS_DAINTには0x00000002(IEPINT1セット)が含まれていますが、DIEPINT1には0x00000080(TXFE)が含まれています。TXFEをクリアするOTGD_FS_Handle_InEP_ISR()の行が呼び出されますが、ビットはクリアされないか、すぐに再アサートされます。ホストのCOMポートが再度開かれると、割り込み終了時のOTG_FS_GINTSTSおよびOTG_FS_DAINTの状態は常にゼロになり、それ以降の割り込みは通常のレートで発生します。この問題は、データが出力されているが、ホストに開いているポートがない場合にのみ発生することに注意してください。ポートが開いているか、データが出力されていない場合、システムは無期限に実行されます。
VCPコードには、次の列挙値をとる状態変数があります。
そして、CONFIGURED状態を使用して、送信のためにデータをドライバーバッファーに入れるかどうかを決定します。ただし、CONFIGURED状態は、ホストがポートを開いてアプリケーションが接続されているときではなく、ケーブルが接続されているときに設定されます。Windowsがポートを開くと、割り込みのバーストが発生するため、このイベントで何らかの通信が発生しているように見えます。したがって、ホストがポートを開いているかどうかを検出できるかどうか疑問に思います。
おそらく次の2つのうちの1つが必要です。
- USBコードが最初にISRでスタックするのを防ぐため
- ホストがデバイス側からポートを開いているかどうかを判断し、開いているときにのみデータをプッシュして送信します。