2021年4月28日水曜日

HAL STM32 GPIO EDGE検出 を割込みを使わずに行う方法。

 こんにちは

やましょうです。

 

なんかなんでも割り込みって風潮はよくない。

割込みは最小限度の処理であとはメインで処理すべきと思っているやましょうです。 


STM32に限らず、ポートの変化でSPIで取込みとかよくある話なんですけど。

そのポートの変化検出で割込みにする必要ないんですよね。。。

通知だけですからね。。。ってことで割込みにせずSTM32で検知する方法で。

STM32 CUBE MXでのNVICでポートの割込みのチェックボックスをオフします。

その後code gane!

あとはメインで、 EXTI ペンディングレジスタ(EXTI_PR)を見るだけですね。


例:

    if(EXTI->PR & EXTI_PR_PR1)

    {    /*エッジ検出    */

            EXTI->PR |= EXTI_PR_PR1;      // 検出結果リセット

           /* エッジ時の処理。。。。*

 

 

以上

やましょうでした。

 

HAL STM32 MASTER-SPI使用時 起動後即SCKがHIGHにならない問題の対応

 こんにちは、やましょうです。

 STM32のSPI-MASTERでSPIで通信を行っていないときにCLOCKラインをHIGHにしておきたいのですが、なぜかCUBE MXの吐き出すコードだと1度SPIを使用するまでCLOCKラインがLOWですね。

 まぁ、問題はないんでしょうけど、最初だけ通常時と異なるのはちょっと考えてしまいますよね。

 

波形としてこんな感じです。(上の黄色がCLOCK)

 

この原因を調査すると、

SPI_CR1の SPE BITの設定ですね。

(注意:SPE BITはいろいろな回路に使われている様でON時には設定変更はできない様なことが書いてあります。)

6 SPE:SPI ペリフェラル  イネーブル フラグな様です。

 

対応 SPIの初期化部でフラグオンを追加します。

  /* USER CODE BEGIN SPI1_Init 2 */
   __HAL_SPI_ENABLE(&hspi1);
 
  /* USER CODE END SPI1_Init 2 */

}

 対応後

 最初の時点でHIGHになりました。

 

以上

やましょうでした。