2016-11-26 34 views
1

私はTM4C123GH6PM7で動作するようにSysTick割り込みを取得しようとしています。これは皮質m4ベースのマイクロコントローラです。 Keilデバッガを使用すると、Systick割り込みがint NVICで保留中であることがわかりますが、ハンドラは実行されません。他の例外は有効になっておらず、私はPRIMASKレジスタをクリアしています。以下のコードは、割り込みを初期化する方法です。SysTick割り込みは保留中ですが、実行されません。デバッグ割り込みマスクの問題?

systck_init LDR R0,=NVIC_ST_CTRL_R 
      LDR R1,=NVIC_ST_RELOAD_R 
      LDR R2,=NVIC_ST_CURRENT_R 
      MOV R3,#0 
      STR R3,[R0] 
      STR R3,[R2] 
      MOV R3,#0x000020 
      STR R3,[R1] 
      MOV R3,#7 
      STR R3,[R0] 
      LDR R3,=NVIC_EN0_R 
      LDR R4,[R3] 
      ORR R4,#0x00008000 
      STR R4,[R3] 
      CPSIE I 
      MOV R3,#0x3 
      MSR CONTROL,R3 

多くの検索の結果、すべての割り込みをマスクするデバッガであることがわかりました。これを制御するビットは、デバッグ停止ステータスおよび制御レジスタと呼ばれるレジスタ内にあります。私はそれをデバッガで見ることも、デバッグコマンドで読み書きすることもできません。

Keilが提供するStartup.sを使用しましたが、ベクトル/ラベルが正しいことが分かります。

はい、わかりました。なぜ組み立てるのが面倒なのか?

アイデアをいただければ幸いです。初めて:)

答えて

0

を掲示する私はのSysTick割り込みがint NVICは

のSysTickはどちらも有効にしていない保留もNVIC内のレジスタのビットを保留していることがわかります。これは特別なことであり、MCUコア自体に緊密に結合されています。

リロード値に0x20を使用すると、危険度が低くなります。次回の割り込みが早すぎるため、Systickハンドラに「スタック」する可能性があります。 Cortex M4は、割り込みハンドラを起動して終了するには少なくとも12クロック必要です。これは32サイクルのうち24サイクルを消費します。

追加ヒント:最後の命令は、SPに使用されるレジスタをMSPからPSPに変更しますが、PSPを最初に設定するコードは表示されません。 Hardfault_Handlerを実装するようにしてください。あなたのコードは、おそらくそれを引き起こします。

+0

助けてくれてありがとう! systickがNVICを介して結合されていない場合は例外ですので、ハードウェア割り込みによってプリエンプトできませんか? すべてのコードを投稿していただきありがとうございますが、たくさんあります。しかし、私はPSPを別の場所にセットアップします。私はちょうどそれがハンドラにまっすぐにジャンプするために0x20を使用しました 今日私はkeilシミュレータを使用し、ハンドラは正しく実行されますが、私はまだインサーキットデバッガで動作するようにそれを得る。 – MHilton

+0

'SCB'の' SHP'レジスタを使って、Systick(および他のシステム割り込み)の優先度を設定することができます。 –

+0

私はコードをすばやく読んだだけで間違っているかもしれませんが(コードにコメントしてください!)、開始する前にカウンタをクリアしていないようです。私はカウンタの値が起動時に定義されていないと思う(しかし、エミュレータはそれをゼロにするかもしれない)。カウンタが0x21で、リロードを0x20に設定した場合、起動する前にラップアラウンドするまで待つ必要があります。それは、SysTickカウンタがたった24ビットである限り、それほど長くはないと言いました。 –

関連する問題