現在、Crossworks ARM (2.1) を使用していますが、LPC2368 MCU の割り込みに問題があります。
アクションの 2 つのコース (UART の例):
1) 働くもの:
- uart の初期化と IRQ の実装全体は main.c ファイルにあります。
- Crossworks で必要とされるため、コードは VECTORED_IRQ_INTERRUPTS フラグを使用してビルドされます
- すべて正常に動作します (エコー テスターは応答しています)
- IRQ cpu を終了した後、モードをスーパーバイザーに変更しています (ビルド フラグも設定されていました)。これはクールで機能しています。
2) 動作していないもの:
- cpu は、main.c 以外のディレクトリ ((ProjDir)/SystemCtrl/) の別のファイルにあるルーチンによって初期化されます。
- uart init 関数は、ネストされたディレクトリ ((ProjDir)/SystemCtrl/LPC/libuart) に設定されます。
- 起動後はすべて問題ありません。ボーレートは問題なく、UART は正しく初期化されています
最初の悪い点: データが最初に受信されると、IRQ が適切に呼び出されます。ただし、受信データは異なります (つまり、送信: 0x31、受信: 0x82)。
2 つ目の悪い点: 間違ったデータが受信された場合でも、echo は PC に異なる値を送信します! (つまり、送信: 0x31、受信: 0x82、エコー送信: 0xFE)
3 つ目の悪い点: IRQ が終了し、CPSR の IRQ モードがまだ設定されている! I フラグはクリアされません。IRQ には属性((interrupt(IRQ))) があります。そして、まだ正しく動作していません。
誰にもアイデアはありますか?何が悪いのかわかりません。スタックサイズも変更しました(奇妙なスペースで何らかの形で失われたのではないかと思いました)。ディレクトリをネストすると、どのようにすべてが壊れますか? 設定を変更せずにクリーンプロジェクトでもテストされました。