投稿

1月, 2023の投稿を表示しています

STM HAL_ADC DMA

イメージ
DMA(ダイレクトメモリアクセス)を体験するというのが趣旨。一番みられるADCで行う。他にもUARTに直接とか、SPIやI2Cに直接とかもできる。 File-New-STM32Projectを選択して新規のプロジェクトを生成 USBからテキストをPCに転送できるようにしたいので、 ConectivityのUSBをクリック□Device(FS)にチェックをいれる。 Categoriesの下のMiddlewareの所に”USB_DEVICE"が反転し選択 . Class For FS IPが現れてDisableになっているが、選択できるようになる。Communication Device Class(Virtual Port Com)を選択する。 続いてCategoriesのAnalogを展開して、ADC1をクリック。ADC1 mode and configrationが開くので、ここでは、IN0~IN3の4つにチェックを入れる。その後、Parameter settingのScan Continuous ModeをEnableに。 Scan Conversion ModeもEnableになっているか確認する。 Mode: ADC1と2を両方使う場合同期させるか、独立にするか? Data Alignment: データを右詰?左詰?を選択 Scan Conversion Mode: 複数のチャンネルを次々と測定するか、しないかの指定 Continuous Conversion Mode/Discontinuous Conversion Mode ADCの完了後に次々と繰り返す/繰り返さない Number of Conversion:変換するチャンネルの数 ここでは4。 External Trigger Conversion Source:トリガの指定。ソフトウェアからトリガをあげるか、タイマーをトリガーにすることもできる。 Sampling Time:ADCのコンデンサがチャージしている時間。アナログ的な平均化が可能?と信じて長いものを設定している。 https://rt-net.jp/mobility/archives/19153 DMA settingsのタブを開いて、バッファの末端を超えると先頭からデータを格納する循環バッファを形成するためCircularを

STM HAL ADC

イメージ
 オンボードのADCの使い方 File-NewからSTM32Projectを選択と新規に作るところから。適当な名前でプロジェクトを生成。 ピンの設定からはじめる。今回はADCを使うので、CategoriesーAnalogの下のADC1を選択し、IN0にチェックを入れる。 F103では16chのADCを最大で利用する事ができるが、その1番目を使う事になる。 このIN0でPA0のピンが緑色になり選択される。データシートでもこのADCのIN0がPA0にアサインされている事が確認できる。 USBのシリアルからPCにAD変換の結果を出力したいので、以前にやっているが、 CategoriesーConectivityのUSBにチェックを入れて□Device FSにチェックをいれる。続いて、 CategoriesーMiddlewareのUSB_DEVICEを選択して、Class For FS IPをCommunication Device Classを選択する。 USBは48MHzで動作するので、クロックの設定が必須になるので外部クロックの水晶振動子に接続する設定をする。 CategoriesーRCCを選択して、High Speed ClockをCrystal/Ceramic Resonatorを選択する。 クロックの設定をする。 PLLMulを9倍にして、USB Prescalerを/1.5にする。これで48MHzになる。 ADC Prescalerは/6を選択。 これで設定が完了したので、Ctrl+Sを押して保存し、コードを自動生成させる。 コードの記載 まず、ADCの値を格納する変数を定義する。 プライベート変数を定義する所に、 /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; /* USER CODE BEGIN PV */ uint16_t adc_value; float adc_voltage; /* USER CODE END PV */ とADCの生値を格納する変数と、それを電圧に直した値を格納する変数の2つを定義する。 ちなみに、自動生成されたADCのハンドルがhadc1となっている事がここで確認できる

STM HAL Timer

イメージ
  Timerの動作について理解を深める。 File-NewからSTM32Projectを選択して適当な名前のプロジェクトを作る。ここでは、HAL_Timerとしておいた。 LEDを動作の確認に使うので、PC13をGPIO OUTPUTに指定する。 またタイマーを使うのでRCCを選択して、high speed clockをCrystal/Ceramic Resonatorを選択する。 Clock configrationのタブを開いて、クロックの設定をする。PLLの倍率を9にして、APB1のペリフェラルクロックが36MHzになるようにセットした。一番早いのという理由。 Prescaler & Counter Periodの設定 CategoriesのTimerを開いて、用いるタイマーを選択する。 データシートを覗くと、TIM1はAPB2を基に動き、TIM2~TIM4はAPB1が基に動く事がわかる。APB1のタイマークロックは、72MHzに設定した。 Prescaler:分周器  何Hzでカウントアップするかを決めるために、Prescalerで割る。 TIM4はAPB1の72MHzで動作するように設定した。 ここで、Prescalerを例えば72kHzに設定すると、  72,000kHz / 72kHz=1000 となり1kHzでカウントが一つ変わる設定になる。 ところが、Configrationで設定できる Prescaler は16ビットで入力する必要がある。16ビットの最大値は65,536なので入力できない。 72,000kHz / 7200Hz=10000 一桁落として、7200Hzで設定した。なので1カウントの時間は100usecで1万カウントして1秒になる。 Counter Period: カウントがこの設定値になったら割り込みを発生させるかの値。 Counter Periodを10000に設定すると、1秒で割り込みが入る。1000にしてやると0.1秒で1回の割り込みとなる。 設定する時に「72000-1」や「10000-1」のように設定するのは、0からスタートするので1引いた値を設定。 次に同じタイマーのConfigrationの"NVIC Setting"のタブがあるので開き、TIM4 global interruptのEn

STM32 HAL USB-CDC

イメージ
 Blue Pill(STM32F103)のUSBポートとPCを繋いでPCとの間で通信を行ってみる。 以前にやっている が、メモ程度だったので再度記述する。 はじめてのマイコンを手にするとLチカからはじめる。これはデジタルのアウトプットを実行する事を身に着けるため。その後デジタルのインプットでスイッチをONするとLEDを連動させて点灯させる・・と。これらの時LEDが表示器、つまりプログラム通りに動いているか?を確認する術となる。 センサから値が読めているか?とセンサ値を確認する場合表示器としてなんらかのディスプレイが欲しくなる。圧倒的にデバッグ時間も短縮できる。そこでUSBポートを経由して結果をPCに映せるようにする事が目的。(Arduinoなんかは、すぐにできるが Blue Pill(STM32F103)はそうはいかない) 前回のおさらい 前回用意した、ブレッドボードにblue pillを設けたスイッチを押すとLEDが付くところまでを改めて作成する。 →前回の内容 スイッチを押したらLEDが付くところまで確認する。 USBの設定 Device configuration tool を開く。画面右上に、MXのアイコンがあるので押すと開く。 Categoriesの下に”Connectivity”があるので、それをクリックして展開する。下の方にUSBがあるので選択する。USB Mode and ConfigurationのModeの欄に□Device(FS)があるのでチェックを入れる。 するとCategoriesの下のMiddlewareの所に”USB_DEVICE"が反転し選択できるようになる。USB Mode and ConfigurationにClass For FS IPが現れてDisableになっているが、選択できるようになる。 Communication Device Class(Virtual Port Com)を選択する。 以下STM32で何を実現するかによって選択をかえるざっと説明すると、 Audio: オーディオ機器を接続する際に利用 CDC (Communication Device Class) : デバイス間のデータのやりとりを行うための通信をするとき DFU:  Device Firmware Upgrade  ブートローダーを書い

STM32 HAL GPIO-INPUT

イメージ
GPIO_INPUT 前回のGPIOのデジタルアウトプットをやった のと同じ要領で、File-Newからはじめて、PC13をGPIOのアウトプットに設定する所まで同じようにする。LEDと名前を変えるのが面倒なので、PC13のままにしたが、お好きなように。 ファイル名はGPIO_INPUTとしておいた。 PB12をINPUTに設定する。 OUTプットに設定するのと同じく、PB12のピンを左クリックして、 GPIO_INPUTを選択する。 画面左側のCategoriesの所でGPIOを選択する。 するとアサインされているピンPB12とPC13の状態が表示されている。 PC12の所で、GPIO Pull-up/Pull-downの選択をPull-upにする。 保存し自動でコードを吐き出させる。 PULL-UPとPULL-DOWN  ここで Pull-up/Pull-downの説明。上のスイッチ回路のように、MPU(マイコン)に直接電源をスイッチを介してつなげる事を考える。スイッチがONの時、マイコンのPINもHIGHになる。そのためMPUで電圧を読むと、HIGHと検出される。一方でオフにした時、この時マイコンのピンはGNDでも電源電圧でもない状態になる。これを”浮いている状態”と呼ぶ。まあこのように配線してもHIGHではないので、大抵動いたりするが、高い周波数で触れるような信号配線が隣にあるとこの浮いている端子はその影響を受けて、本来OFFでゼロになってほしいのに誤動作して、HIHGと読まれる事が起こってしまう。スイッチぐらいなら直接続してもまあ動くが、SPI、I2Cなどの通信を行うと周波数がそれなりなので、ちゃんと通信ができない等が発生するのでPull-up抵抗の設置は必須となる。 この誤動作をなくすために、Pull-up抵抗を介してスイッチを接続する。OFFの時は、マイコン内部の電圧検出の抵抗(これはかなり大きい)はピンを介してHIGHになり、スイッチがONになると、ピンはGNDに接続されGNDと同電位なる。 ここでは、説明のためにマイコンの外にPull-up抵抗を設置しているが、実際のマイコンではマイコンの内部でPull-up抵抗を準備するか?しないのか?というのが選択する事ができる。それが、GPIO Pull-up/Pull-downの選択をしている意味である。