問題タブ [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.
c++ - 組み込みでのシリアル化 - RTTI なしでシリアルを使用していますか?
組み込みシステムで Cereal 1.2.1 を使用したいのですが、RTTI を使用するとコード サイズが大きくなりすぎて使用できません。typeid のサポートを終了する必要があります。RTTI なしでシリアルを使用する方法はありますか? 私がシリアライズしている構造はポリモーフィックではなく、いくつかの数値と数値の配列のコンテナーです。
役立つ場合は、gcc 5.4.1 を使用しています。
ありがとう。
c - STM32、フラッシュに保存された変数を他のファイルで更新できませんでした
STM32F411REを使用しています。RAMにメモリがなくなったので。大きな変数をフラッシュに保存することにしました。そのために、 にセクションを作成しましたsection.ld
。
ファイルではmain.c
、次のように変数を宣言します。
この時点ですべて問題ありません。バッファは RAM (bss) にストックされていません。アクセスして書き換えることができます。
問題は、他のファイルから変数を編集したいときに発生します。
main.c
other.c
buffer
別のファイルで変更されることはありません (パラメーターとして渡されます)。
私は何か見落としてますか ?
stm32 - stm32f4 サスペンド後に DMA が開始されない場合がある
したがって、この質問は一種の「続編」です: Stm32f4: DMA + ADC Transfer pausing。
繰り返しますが、私はそのようなアルゴリズムを実装しようとしています:
- 1 つのチャネルでトリプル インターリーブ モードの ADC を使用して DMA を初期化する
- 外部割り込み待ち
- DMA転送とADCをサスペンド
- 割り込みでUSARTを介してメモリからバッファリングされたデータを送信します
- DMA と ADC を再開する
- 割り込みを終了し、2 に進みます。
DMA と ADC は一時停止して再開しますが、(割り込み呼び出しの約 16% で) 再開に失敗することがあります。再び再開) そして - さて、次のそのようなバグまで、すべてが正常に戻ります。
リファレンス マニュアルにあるように、DMA を一時停止してみました。
転送が停止したポイントから再開するには、ソフトウェアは、DMA_SxCR レジスタに EN ビットを書き込んでストリームを無効にした後 (次に、EN ビットが「0」であることを確認)、DMA_SxNDTR レジスタを読み取って、転送の数を知る必要があります。収集済みのデータ項目。次に、 –
アドレス ポインタを調整するために、ペリフェラルおよび/またはメモリ アドレスを更新する必要があります
– SxNDTR レジスタを、転送するデータ項目の残りの数で更新する必要があります (ストリームが無効になったときに読み取られた値)
–その後、ストリームを再度有効にして、停止した時点から転送を再開することができます
唯一の実際の違いは、DMA の動作を再開する際に書き込まれる NDTR 値にあります。私の場合は buffer_size です。RefMan の場合は、DMA の一時停止中に読み取られた値です。RefMan の場合、一時停止後に DMA が再び開始されることはありません。私の場合、上で述べたように、開始しますが、常にではありません。
どうすればこれを防ぐことができますか?
現在、割り込みコードは次のようになっています。
c - マイクロコントローラ STM32F401RET6 からマイクロ SD カードにデータを書き込む
私は、マイクロコントローラ STM32F401RET6 に基づくボード Nucleo F401RE を使用しています。ボードに Micro SD スロットを接続し、SD カードにデータを書き込んだり、SD カードからデータを読み取ったりすることに興味があります。ソフトウェア STM32CubeX を使用してコードを生成し、特に組み込み関数を備えた SD ライブラリを使用しました。配列を特定の配列に書き込み、後で同じデータを読み取ろうとする単純なコードを作成しようとしました。コードは次のとおりです。
ただし、データの書き込みには成功しませんが、関数 HAL_SD_WriteBlocks() は値 SD_CMD_CRC_FAIL を返します。これは、「コマンド応答を受信しました (ただし、CRC チェックに失敗しました)」という意味です。何が欠けていますか?ハードウェア構成を何度も確認したところ、micro SD カードが正しくマイコンに接続されています。必要に応じて、HAL 組み込み関数の実装を追加できます。ありがとうございました。
interrupt-handling - STM32F4 DMA の動作中に TIM6 割り込みが発生しない
STM32F4Discovery ボードで作業し、Cube からコードを生成します。SYSCLK は 168MHz、APB1 タイマー クロックは 42MHz、TIM6 にはプリスケーラ 1000 があり、62 までカウントします。次の実験を行います。
TIM6 割り込みを有効にする
DAC_DMA を 30 要素配列の通常モードで開始します。
タイマー割り込みが発生した回数を数える
この関数にブレークポイントを設定します。
私が期待するもの:
1) HAL_DAC_ConvCpltCallbackCh1 が 1 回呼び出されます (非循環モードのため)。それは本当です。
2) DAC データ バッファの長さが 30 であるため、tim6Counter は 30 に等しくなければなりません。実験では、tim6Counter は 1 です。
3) DAC が完了したら、ブレークポイントを TIM6 ハンドラに設定し、main while(1) ループに設定します。問題は、TIM6 ハンドラーでハングすることです。
質問:
1) TIM6 割り込みが有効になっていない場合でも、DMA は機能します。しかし、有効にした場合、すべての DMA 要求ではなく、1 回だけ発生するのはなぜですか?
2) タイマー ハンドラでハングするのはなぜですか?
3) TIM6 SR レジスタは、HAL マクロまたは HAL_TIM_IRQHandler によってクリアされません。私はopenOCDでEclipseを使用しています。ツールの問題でしょうか?またはハンドラーにぶら下がっているためですか?
linux - Cortex-M4 STM32F4 (29I-DISC1) での Linux 4.9 の実行
私は理解しようと数日を費やしていますが、行き詰まっています。STM32F429I-DISC1 ボードで「bootm 8100000」と入力した後、「Starting kernel...」というメッセージしか表示されません。
uboot を 2011 から 2016 に更新する前は、「Starting Kernel...」+ UNHANDED EXCEPTION HARDFAULT でしたが、現在は「Starting Kernel...」メッセージだけです。
MCU は stm32F429、2MB フラッシュ + ext です。8MBのRAM。
フラッシュ開始アドレスは0x08000000 (uboot addr) で、カーネルを0x08100000の 2 番目のフラッシュ バンクの開始位置に配置しました。
外部 8MB RAM の開始は0xD0000000 です
u-boot-2016.11 はそのボードでかなりうまく動作するようです。
これは私がカーネルを構築する方法です:
そして、これは bootm コマンドの完全な出力です:
「robutest」/「emcraft」カーネル/構成ファイルを使用して、同じログを取得しましたが、エントリ ポイントが 08100001 であるためより正確であると思われる場合を除きます。
robutest/emcraft カーネルで、ボードの LCD 画面をアクティブにしようとしましたが、何も起こりません。
すべてのテストで、カーネル構成の「early printk」と「DEBUG_LL_xxx」をアクティブにしました。
これは私の .config ファイルへのリンクです: http://pastebin.com/gBNYx3Gs
PS: uCLinux emcraft/robutest で何が起こっているのかを調べてみましたが、私の主な目標は Linux 4.9 を実行することです。
私を読んでくれてありがとう!!!
編集:dtbを「古い方法」で渡そうとしましたが、同じ結果になりました:
私は必死です、どんなアイデアも大歓迎です:'(
EDIT2:u-bootでカーネルを解凍しようとしましたが、同じです:
EDIT3: dtb でメモリ/USART1 アドレスを確認しましたが、問題ありません。カーネルのメッセージがないのはなぜですか?
EDIT4:uxipImageを使用:
08060000、08060040、08060041 の異なるエントリ ポイントで試しました。
freertos - FreeRtos コンテキスト切り替え中に関数アドレスを保存する方法
プロジェクトで freertos を使用しています。コードが hardfault ハンドラーでスタックしています。デバッグ用に最後に実行された関数アドレスまたは最後に実行された行アドレスを知りたいです。PC が Hardfault ハンドラーを指しているときにコードをデバッグする方法。