今回はSTM32F373マイコンに内蔵されている
デルタシグマADC(SDADC)のMulti Channelでの
読み込みする方法を紹介します。
SDADCは一部のSTM32マイコンのみ内蔵のため、
サンプルコードや情報がなかなかありません。
試行錯誤してSDADC+DMA+2channelという条件で動作したため、
方法を覚書として紹介します。
今回はSDADC1の2チャンネルを順次変換します。
CubeMX上の設定は下記の通りです。
ポイントは
・Injected Conversions有効化
・DMA転送
です。
・Injected Conversions :Enable
・Number of Channels To be converted :2
・Continuous Mode :Enable
・Channel Configuration1,2: Channel 4,5
・Mode: Circular
・Increment Address: Memory Checked
main.cでは下記のコードを追記します。
//グローバル変数
uint16_t g_SDADCBuffer1[2];
//while文の前に初期化
HAL_SDADC_InjectedStart_DMA(&hsdadc1 , (uint32_t*)g_SDADCBuffer1,2);
//while文
printf(" %d,\t %d, \n\r",g_SDADCBuffer1[0],g_SDADCBuffer1[1]);
HAL_Delay(100);
g_SDADCBuffer1[0]にChennel 4
g_SDADCBuffer1[1]にChennel 5
がDMA転送で格納されます。
実際に実行した結果は下記の通りです。
順次SDADCの変換結果が格納されていることが確認できます。
DMA転送でContinuous Mode :EnableかつCircularモードの場合は
void HAL_SDADC_ConvCpltCallback(SDADC_HandleTypeDef* hsdadc)の
関数内でDMA割込みの設定し直す必要はないようです。
HAL_SDADC_PollForConversionを使用すると変換待ちの時間を要するため、
DMA転送できると変換待ちがなく、色々応用範囲が広がります。