問題タブ [stm32f4]
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.
stm32 - 関数を IAR stm32f2/f4 フラッシュから RAM にコピーして実行する
関数をフラッシュから RAM にコピーして実行したいと考えています。
IAR には、RAM で関数を定義できる関数用の __ramfunc タイプが含まれていることは知っていますが、次の 2 つの理由から使用したくありません。
- RAM関数は、初期化時にのみ使用するRAMメモリを使用しています
- コードを 2 回アップグレードした後 (私はファームウェア更新システムを実行しています)、__ramfunc が間違った場所を示しています。
基本的に私が欲しいのは、関数をフラッシュとして宣言し、実行時にそれをメモリにコピーして実行することです。私は次のコードを持っています:
詳細として:
- 関数の sizeof が機能しない
- リンカーが間違った関数アドレス (奇数アドレス) を返しました。デバッグ ツールで確認すると、それが間違っていることに気付きました。これが &0xFFFFFFFE を実行する理由です。
このコードの後、関数はRAMに完全にコピーされますが、まったく同じコードですが、これで実行すると:
例外 HardFault_Handler が発生します。多くのテストの後、このハードフォールト例外を修正できませんでした。
asm コードを確認すると、__ramfunc と通常のフラッシュ関数の呼び出しが異なり、おそらく HardFault 例外が発生する理由であることに気付きました。
これは、flash として定義されている場合に呼び出される方法です。
直接呼び出すと、コードを __ramfunc として定義し、直接呼び出します。
例外の理由は、おそらくフラッシュから RAM にジャンプしているためであり、おそらくそれは皮質保護ですが、__ramfunc 修飾子を使用している場合もまったく同じであり、段階的にデバッグすると、関数にジャンプしません。 RAM、関数を呼び出すとすぐに例外に直接ジャンプします。
これをスキップする方法は、RAM メモリへの「goto」です。asm("...") 関数を使用して C と ASM in C を混在させようとしましたが、エラーが発生し、おそらくハードフォールト例外が発生します。
どんなヒントでも大歓迎です。
c - STM32: カスタム ブートローダーからアプリケーションにジャンプするときのハード フォールト
カスタムブートローダーとアプリケーションを備えた STM32F401 MCU に取り組んでいます。コンパイラは GCC 5.2.1 で、最適化は実行されていません。
次のジャンプ シーケンスの後の最初の割り込み後に、ハードフォールトが発生します: ブートローダー -> アプリケーション -> ブートローダー -> アプリケーション。ブートローダからアプリケーションへの最初のジャンプの後、システムは正常に動作しています。ただし、ブートローダーに戻ってからアプリケーションにジャンプした後 (意図的にボードをリセットしているわけではありません)、SysTick から EXTI までの最初の割り込みの後にハードフォールトが発生します。
この理由は何でしょうか?私が更新していないものはありますか?ありがとう。
コードのスタブ:
ジャンプ手順 (両方のプログラムで、アプリケーションは 0x08008000 にあり、ブートローダーは 0x08000000 にあります):
ジャンプする前のアプリケーションのクリーンアップ:
microcontroller - I2C SCL ライン、STM32F4 のクロックの問題
I2C インターフェースでは、
バス上にデバイスがない場合でも、SCL、クロックラインはクロック信号を送信しますか?
I2C をデバッグするにはどうすればよいですか?
stm32 - openocd を使用した STM32F3Discovery プログラミング
まず第一に、本当に下手な英語で申し訳ありません。
STM32F3Discovery ボードの使い方を学んでいます。構成コードの生成に STMCubeMX を使用して、すべてのオンボード LED をオンにする簡単なプログラムを作成しました。
私が書いたコードは、次の 8 行だけです。
ここに Eclipse プロジェクトのコピーがあります。
openocdを使用してボードをプログラムしようとしているので、実行します
それから
openocd の出力は
しかし、どのLEDも点灯していません!
私は何をすべきか?
arm - DMA でデータを送信するように STM32f405 SPI を設定する方法は?
私は STM32f405 を持っており、タスクは SPI 経由でデータを送信し、DMA でプロセッサ時間を節約することです。使用する SPI は、ピン PA4 ~ PA7 を持つ SPI1 です。DMA に DMA2 チャネル 3 からの 3 番目のストリームを選択しました。CS 信号をアクティブにしてメモリにデータを保存し、DMA によって自動的に転送され、それが完了すると DMA は割り込みをトリガーする必要があります。 CS を非アクティブ化するハンドラ。コードは次のとおりです。
デバッガーを使用すると、DMA2_Stream3_IRQHandler がアクティブ化されないことがわかりました。リファレンス マニュアルによると、DMA は SPI_DR レジスタからの TXE フラグが 1 のときにデータを転送する必要があり、そうでした。また、SPI_CR2 からのフラグ TXDMAEN が設定されました。DMA S3CR レジスタもチェックしたところ、フラグ TCIE と EN も設定されていました。さらに、関数 DMA2_Stream3_IRQHandler がメイン関数に表示されます。それでも DMA2_Stream3_IRQHandler はアクティブ化されませんでした。
更新: DMA2_S3CR レジスタの EN ビットを手動でリセットすると、DMA2_Stream3_IRQHandler がトリガーされます。リファレンス マニュアルによると、このビットはハードウェアによってクリアされます。
- 転送の DMA 終了時 (ストリームを構成する準備ができている)
- AHBマスターバスで転送エラーが発生した場合
- メモリ AHB ポートの FIFO しきい値がバーストのサイズと互換性がない場合
SPI_Config と Analog_Out_Config も変更しましたが、デバッガーを使用しない限り、DMA2_Stream3_IRQHandler はトリガーされません。DMA が転送をトリガーしておらず、何らかの理由で終了できないようです。DMA が転送をトリガーしたかどうかを確認するにはどうすればよいですか?
usb - USB CDC は割り込み endp で一度だけ動作します
STM32F4 MCU に仮想 COM ポートを実装しています。
MCU には利用可能なエンドポイントがないため、interupt エンドポイント/通知要素を削除する必要があります。問題は、MCU が PC にメッセージを一度しか送信できないことです。
デバイスの USB 記述子:
c - C: char* へのポインタの受け渡し
複数の関数 (それぞれがメッセージの一部を抽出する) を使用して char* を解析しようとしていますが、関数間でポインターを渡すのに問題があります。私が問題を抱えているメッセージの部分には、整数の後にスペース文字が続き、その後に double が続きます。
これはすべて STM32F4 で実行されています。
主な機能:
機能:
最初の関数呼び出しは、文字列の 13 文字目から始まる整数を抽出する必要があります。これは正常に動作し、strtol 呼び出しの後にリターン ポインター (nLink) を読み取ると、正しい場所 (整数の直後のスペース) を指しています。ただし、メイン関数または 2 番目の関数でポインターから文字列を読み取ると、正しい場所を指していません。
私がやろうとしているのは、メイン関数が最初の関数によって更新される配列へのポインターを渡してから、2 番目の関数がそのポインターを取得して使用することです。
どんな助けでも大歓迎です。