問題タブ [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.

0 投票する
1 に答える
1517 参照

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 を混在させようとしましたが、エラーが発生し、おそらくハードフォールト例外が発生します。

どんなヒントでも大歓迎です。

0 投票する
0 に答える
4196 参照

c - STM32: カスタム ブートローダーからアプリケーションにジャンプするときのハード フォールト

カスタムブートローダーとアプリケーションを備えた STM32F401 MCU に取り組んでいます。コンパイラは GCC 5.2.1 で、最適化は実行されていません。

次のジャンプ シーケンスの後の最初の割り込み後に、ハードフォールトが発生します: ブートローダー -> アプリケーション -> ブートローダー -> アプリケーション。ブートローダからアプリケーションへの最初のジャンプの後、システムは正常に動作しています。ただし、ブートローダーに戻ってからアプリケーションにジャンプした後 (意図的にボードをリセットしているわけではありません)、SysTick から EXTI までの最初の割り込みの後にハードフォールトが発生します。

この理由は何でしょうか?私が更新していないものはありますか?ありがとう。

コードのスタブ:

ジャンプ手順 (両方のプログラムで、アプリケーションは 0x08008000 にあり、ブートローダーは 0x08000000 にあります):

ジャンプする前のアプリケーションのクリーンアップ:

0 投票する
1 に答える
836 参照

microcontroller - I2C SCL ライン、STM32F4 のクロックの問題

I2C インターフェースでは、

バス上にデバイスがない場合でも、SCL、クロックラインはクロック信号を送信しますか?

I2C をデバッグするにはどうすればよいですか?

0 投票する
1 に答える
1286 参照

stm32 - openocd を使用した STM32F3Discovery プログラミング


まず第一に、本当に下手な英語で申し訳ありません。
STM32F3Discovery ボードの使い方を学んでいます。構成コードの生成に STMCubeMX を使用して、すべてのオンボード LED をオンにする簡単なプログラムを作成しました。
私が書いたコードは、次の 8 行だけです。

ここに Eclipse プロジェクトのコピーがあります。
openocdを使用してボードをプログラムしようとしているので、実行します

それから

openocd の出力は

しかし、どのLEDも点灯していません!
私は何をすべきか?

0 投票する
1 に答える
1739 参照

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 が転送をトリガーしたかどうかを確認するにはどうすればよいですか?

0 投票する
1 に答える
999 参照

usb - USB CDC は割り込み endp で一度だけ動作します

STM32F4 MCU に仮想 COM ポートを実装しています。

MCU には利用可能なエンドポイントがないため、interupt エンドポイント/通知要素を削除する必要があります。問題は、MCU が PC にメッセージを一度しか送信できないことです。

デバイスの USB 記述子:

0 投票する
2 に答える
268 参照

c - C: char* へのポインタの受け渡し

複数の関数 (それぞれがメッセージの一部を抽出する) を使用して char* を解析しようとしていますが、関数間でポインターを渡すのに問題があります。私が問題を抱えているメッセージの部分には、整数の後にスペース文字が続き、その後に double が続きます。

これはすべて STM32F4 で実行されています。

主な機能:

機能:

最初の関数呼び出しは、文字列の 13 文字目から始まる整数を抽出する必要があります。これは正常に動作し、strtol 呼び出しの後にリターン ポインター (nLink) を読み取ると、正しい場所 (整数の直後のスペース) を指しています。ただし、メイン関数または 2 番目の関数でポインターから文字列を読み取ると、正しい場所を指していません。

私がやろうとしているのは、メイン関数が最初の関数によって更新される配列へのポインターを渡してから、2 番目の関数がそのポインターを取得して使用することです。

どんな助けでも大歓迎です。