2018年11月10日

STM32F373 SDADCマルチチャンネル読み込み

今回は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


sdadc-conf.jpg


・Mode: Circular
・Increment Address: Memory Checked


sdadc-dma.jpg



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の変換結果が格納されていることが確認できます。

sdadc-res.jpg

DMA転送でContinuous Mode :EnableかつCircularモードの場合は
void HAL_SDADC_ConvCpltCallback(SDADC_HandleTypeDef* hsdadc)の
関数内でDMA割込みの設定し直す必要はないようです。


HAL_SDADC_PollForConversionを使用すると変換待ちの時間を要するため、
DMA転送できると変換待ちがなく、色々応用範囲が広がります。

posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする

2018年09月08日

gcc ARMコンパイラ エラー対処方法

System Workbench toolchain for STM32(SW4STM32) を使用している際、
突然、コンパイルができなくなりました。
その際の対処法について、紹介します。

コンパイルができなくなった際に下記のようなエラーメッセージがでました。


/usr/bin/ld: error: perf_test uses VFP register arguments, perf_test.o does not
/usr/bin/ld: failed to merge target specific data of file perf_test.o
/usr/bin/ld: error: perf_test uses VFP register arguments, util.o does not
/usr/bin/ld: failed to merge target specific data of file util.o
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(a.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(a.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(b.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(b.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(c.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(c.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(d.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(d.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(e.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(e.o)
/usr/bin/ld: error: perf_test uses VFP register arguments, ../baseline/lib.a(f.o) does not
/usr/bin/ld: failed to merge target specific data of file ../baseline/lib.a(f.o)
collect2: ld returned 1 exit status
make: *** [perf_test] Error 1


パラメータや設定を見直しても改善しませんでした。
結局、Eclipseのプロジェクトファイルの破損だと判明しました。
再度、.cprojectファイルを削除し、
CubeMXで再度生成すると正常にコンパイルできるようになりました。
posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする

2017年12月27日

STM32CubeProgrammer


STM32マイコンの書き込みソフトというと
STM32 ST-Link Utilityですが、
先日、STM32CubeProgrammerが発表されました。


従来の差としては
マルチOS対応と
ST-Linkだけでなく、
UartやUSBを介した書込みも
統合して同じソフトで出来るようになった点です。

早速使ってみました。
インストール時にSTM32TrustedPackageCreatorは
通常使用では使用しないため、インストールしませんでした。



stm32cubeprg1.jpg

起動後の画面はCubeMX風です。

stm32cubeprg2.jpg

右上でST-Linkが選択されていることを確認します。
UartやUSBを使用する場合はそれぞれ応じたインタフェースを選択します。

stm32cubeprg3.jpg

ConnectをクリックするとデバイスとST-Linkが接続されます。

stm32cubeprg4.jpg

左の書き込みモードボタンを選択して、
Browseから書き込みたいbinファイル等を選択します。

stm32cubeprg5.jpg

右下のStartProgrammingをクリックすると書込みが開始されます。

イレース、書込みなどの度に画面にメッセージが
表示されるため、少し煩雑です。
正直メッセージは毎回でなくてもいいです。
どこかで止められればいいのですが。

UartやUSBなど含めて書込みインタフェースが統合されたのは歓迎ですが、
現時点では使い勝手はST-Link Utilityの方が使いやすいと思いました。

バージョンアップによる使い勝手の向上に期待です。


posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする

2017年12月02日

ADC微小電圧読込

今回はSTM32F103のAD変換を使用した際に
ちょっとした問題に遭遇したため紹介します。


TI製電流検知センサINA181A1の出力を
STM32F103のADCで読み込む際に
意図した電圧が読み込めてないことが分かりました。


シャント抵抗に10mΩを接続し、
0.3Aの電流を流しているので
60mVの出力が出ます。
※INA181A1はゲイン20倍

60mVの出力が出ていることは確認できましたが、
ADCで読み込むと6mVしか読み込めていない状況でした。


調査するとTI製電流検知センサINA181A1は全く問題がなく、
STM32F103のADCの初期化に問題があることが分かりました。


HAL_ADCEx_Calibration_Start
というADCのキャリブレーションを初期化時に実行すると
意図した60mVの出力を読み取ることができました。



可変抵抗などでざっくりとした値をAD変換で読み込む場合は
ADCのキャリブレーションをしなくとも問題ありませんが、
電流検知センサなどの微小な電圧を読み込む際には
ADCのキャリブレーションが必須です。


//ADの初期化
MX_ADC1_Init(); 

//ADのキャリブレーション
if (HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK) 
  {
    /* Calibration Error */
    Error_Handler();
  }


思った以上に微小電圧の読み込む場合は誤差が出るので、
面倒でもADCのキャリブレーションは初期化時に行った方が良さそうです。





ラベル:部品 STM32 HAL
posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする

2017年09月24日

ソフトリセット

今回はSTM32マイコンでソフトリセットの使用方法について紹介します。


I2Cのデバイスが検出できない場合や何かしらの異常が発生した場合に
電源投入時の状態に初期化したい場合があります。

その場合に便利な機能がソフトリセットです。



使用するSTM32マイコンのコアに応じて、
ヘッダが異なります。

CortexM0の場合は#include "core_cm0.h"
CortexM3の場合は#include "core_cm3.h"
CortexM4の場合は#include "core_cm4.h"
必要に応じて、変更します。

ソフトリセットを行う関数は
NVIC_SystemReset();
です。

何かしらの異常が発生した後に
上記の関数を入れておくと、
ソフトリセットが掛かります。

異常が連続して起きた場合に変な挙動にならないように
ソフトリセットの使い方には要注意ですが、
比較的簡単に実装できました。

続きを読む
posted by Crescent at 00:00| Comment(0) | 組込ソフト | このブログの読者になる | 更新情報をチェックする