製作モジュール一覧

2021年2月7日日曜日

STM32CubeIDE: I2SをDMAで使う

DMA経由でI2S通信を行います。48kHz/16bitでLch、Rchそれぞれ16bit値をインクリメント、デクリメントして送信します。DACに入力するとL/Rで逆位相のノコギリ波が出力されます。

STM32CubeIDE: Version 1.5.1
Target board: Nucleo-F446RE

MXの設定



Real Audio Frequencyが47.619kHzとなっていますがI2SのクロックがMCUの内部クロックに依存しているためで、正確に48kHzにするためには元になるClockをうまく調整する必要があります。


Addボタンを押してSPI2_TXを選択するとDMA Request Settingsを設定できるようになります。SPI2_TXとなっているのは、I2SはSPIと同じハードウェアを利用しているためです。

メモリの値を連続して送信するため、ModeはCiruclarにします。Data WidthをHalf Wordに設定します。

Multimedia
  I2S2
    Mode
      Mode: Half-Duplex Master
  Configuration
    Parameter Settings
      Generic Parameters
        Selected Audio Frequency: 48KHz
    DMA Settings
      SPI2_TX
        DMA Request Settings
          Mode: Circular
          Peripheral: Data Width: Half Word
          Memory   : Data Width: Half Word

Pinout



main.cにコードを追加


/* USER CODE BEGIN PV */
uint16_t tx_buffer[2] = { 0, 0 };
/* USER CODE END PV */

割り込みで処理するため、送信するデータを大域変数で定義します。

  /* USER CODE BEGIN 2 */
  HAL_I2S_Transmit_DMA(&hi2s2, tx_buffer, 2);
  /* USER CODE END 2 */

DMAをCircularモードにしているので、1度だけI2S送信を開始します。DMAを使う場合はHAL_I2S_Transmit_DMA()を使います。

/* USER CODE BEGIN 4 */
void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
{
	tx_buffer[0] ++;
}

void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s)
{
	tx_buffer[1] --;
}
/* USER CODE END 4 */

割り込みハンドラを定義します。Lch/Rchそれぞれ送信が完了した時点でインクリメント/デクリメントしています。

I2S出力信号


出力信号をAnalog Discovery 2のScope機能とLogic機能で観測しました。


上側のScopeはC1がWS、C2がBCLKで、WSが47.634kHz、BCKが1.5244MHzとなっています。

下側のLogicを見るとLchがインクリメント、Rchがデクリメントされています。

2021年2月4日木曜日

STM32CubeIDE: I2SをPollingで使う

I2SをPollingで使うことはあまりないと思いますが、動作確認が簡単です。オーソドックスに16bit/48kHzで設定します。

STM32CubeIDE: Version 1.5.1
Target board: Nucleo-F446RE

MXの設定

Multimedia
  I2S2
    Mode
      Mode: Half-Duplex Master
  Configuration
    Parameter Settings
      Generic Parameters
        Selected Audio Frequency: 48KHz

Pinout



main.cにコードを追加


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  uint16_t data[2] = { 12345, 23456 };
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	if (HAL_I2S_Transmit(&hi2s2, data, 2, 100) != HAL_OK) {
		Error_Handler();
	}
  }
  /* USER CODE END 3 */

簡単ですね。

I2S出力信号


出力信号をAnalog Discovery 2のLogic機能で観測しました。


Lchに12345、Rchに23456が出力されています。

WSがR->Lに切り替わるところで、一瞬SD(Data)がHighになっています。HAL_I2S_Transmit()は終了後SDをHighにする仕様なのでしょうか?

LABRICOと2x4材で自転車ハンガー用の柱を立てる

ロードバイクは室内保管が基本です。玄関に置いてすぐに乗り出せるようにしたいのですが、設置スペースを小さくするために、2x4材を使って柱を立て宙吊りにました。



使った資材は以下のとおりです。

品名 メーカー 価格 購入先
2x4 8F - 680円 コメリ
2x4アジャスター LABRICO 1100円 コメリ
バイクハンガー4R ミノウラ 2910円 Amazon
ワトコオイル エボニー/ナチュラル ワトコ - 余り物

2x4材とLABRICOは以前リビング用のラックを作った方法を踏襲しました。

設置場所の床から天井の高さを測定し(レーザー距離計があると便利)、-95mmした長さに2x4材を切り出します。私はホームセンターでカットしてもらいました。

生木でもとりあえずは大丈夫だと思いますが、ワトコオイルが余っていたので塗装しました。今回はエボニーとナチュラルを半々で混ぜて薄めの色合いにしてみました。

ミノウラのバイクハンガーは25mmと50mmのビスも付属しています。2x4なら25mmを使います。わざわざ買わなくても良いので親切ですね。



2x4定規で材の中心に墨付け、ハンガーを当ててビス打ちしておしまい。あっという間に完成です。細めのドリルで下穴を開けておいたほうが良いでしょう。


糸に50円玉をぶらさげて柱の垂直を確保しました。

また小物を下げるフックも一緒にビス打ちします。最初つけるのを忘れていてやり直しました。


ちなみにLABRICOは間違えてグリーンのものを買ってしまいましたが、設置してみるとそれほど気にならないようです。パッケージで製品の色がわかりにくいので、お店で買うときは注意しましょう。