Analog to Digital Conversion (ADC) support(adc.h)
アナログ - デジタル変換(ADC)のサポート
概要
アナログ - デジタル変換(ADC)をサポートします。
データ型
■ struct adc_dev
ADCデバイス型
adc_reg_map *regs ADCレジスタ・マップ
rcc_clk_id clk_id RCCクロック情報
nvic_irq_num irq_num 割り込み番号
voidFuncPtr handlers[] EOC, JEOC, AWD 割り込みハンドラ
■ struct adc_reg_map
ADCレジスタマップ型
__IO uint32 SR ADC ステータスレジスタ (ADC_SR)
__IO uint32 CR1 ADC制御レジスタ1(ADC_CR1)
__IO uint32 CR2 ADC制御レジスタ2(ADC_CR2)
__IO uint32 SMPR1 ADC サンプル時間レジスタ 1(ADC_SMPR1)
__IO uint32 SMPR2 ADC サンプル時間レジスタ 2(ADC_SMPR2)
__IO uint32 JOFR1 ADC インジェクトチャネルデータオフセットレジスタ 1(ADC_JOFR1)
__IO uint32 JOFR2 ADC インジェクトチャネルデータオフセットレジスタ 2(ADC_JOFR2)
__IO uint32 JOFR3 ADC インジェクトチャネルデータオフセットレジスタ 3(ADC_JOFR3)
__IO uint32 JOFR4 ADC インジェクトチャネルデータオフセットレジスタ 4(ADC_JOFR4)
__IO uint32 HTR ADC ウォッチドッグ高閾値レジスタ (ADC_HTR)
__IO uint32 LTR ADC ウォッチドッグ低閾値レジスタ(ADC_LTR)
__IO uint32 SQR1 ADC レギュラシーケンスレジスタ 1(ADC_SQR1)
__IO uint32 SQR2 ADC レギュラシーケンスレジスタ 2(ADC_SQR2)
__IO uint32 SQR3 ADC レギュラシーケンスレジスタ 3(ADC_SQR3)
__IO uint32 JSQR ADC インジェクトシーケンスレジスタ(ADC_JSQR)
__IO uint32 JDR1 ADC インジェクトデータレジスタ 1(ADC_JDR1)
__IO uint32 JDR2 ADC インジェクトデータレジスタ 2(ADC_JDR2)
__IO uint32 JDR3 ADC インジェクトデータレジスタ 3(ADC_JDR3)
__IO uint32 JDR4 ADC インジェクトデータレジスタ 4(ADC_JDR4)
__IO uint32 DR ADC レギュラデータレジスタ(ADC_DR)
■ adc_extsel_event 列挙型
通常のグループ変換用の外部イベントセレクタ
補足説明1(11.4 A/Dコンバータ - 「外部トリガによる変換」からの抜粋)
変換は、外部イベント(タイマキャプチャ、EXTI ラインなど)によってトリガできます。EXTTRIG
制御ビットがセットされている場合、外部イベントで変換をトリガできます。EXTSEL[2:0]および
JEXTSEL[2:0]制御ビットによって、アプリケーションはレギュラおよびインジェクトグループの変
換をトリガできるイベントを 8 つのイベントから選択することができます。
補足説明2(adc.hのコメント記載内容)
外部イベントの中にはADC 1と2でのみ利用可能なもの、ADC 3でのみ利用可能なもの、3つすべてのADCで利用可能なものがあります。さらに、一部のイベントは高密度およびXL密度のSTM32F1 MCUでしか使用できません。これらのMCU密度でしか使用できない周辺機器を使用しているためです。
使いやすくするために、各イベントセレクタは、それが利用可能なADCとともに、その他の可用性の制限とともに示されています。
TODO:次のようにこれを少し洗練してください。
F1のEXTSELビットは、TIM1のTRGOイベントがADC1 / 2とADC3のどちらを使用しているかに応じて異なるビットを持つという点で、少し頭痛の種です。ADC_EXT_EV_ADC12_TIM8_TRGOとADC_EXT_EV_ADC3_TIM8_TRGOの2つの列挙子を宣言することでこれを回避します。
正しいことは、単一のものを提供することです。この状況を正しく処理するには、ADC_EXT_EV_TIM8_TRGO列挙子を使用してSTM32F1のadc_set_extselをオーバーライドします。 ただし、後でそれを行うことができ、互換性を維持するためにADCごとの列挙子の値をADC_EXT_EV_TIM8_TRGOに変更できます。
adc_extsel_event列挙型の定義値
ADC1 と ADC2 のレギュラチャネルに対する外部トリガ
ADC_EXT_EV_TIM1_CC1 = 0x00000 ADC1, ADC2:TIM1_CC1 イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_TIM1_CC2 = 0x20000 ADC1, ADC2:TIM1_CC2 イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_TIM2_CC2 = 0x60000 ADC1, ADC2:TIM2_CC1 イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_TIM3_TRGO = 0x80000 ADC1, ADC2:TIM3_TRGO イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_TIM4_CC4 = 0xA0000 ADC1, ADC2:IM4_CC4 イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_EXTI11 = 0xC0000 ADC1, ADC2:EXTI ライン 11イベント(外部ピン/内部 信号)
共通:
ADC_EXT_EV_TIM1_CC3 = 0x40000 ADC1, ADC2,ADC3:TIM1_CC3 イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_SWSTART = 0xE0000 ADC1, ADC2,ADC3:SWSTART(ソフトウェア制御ビット)
HD only:
ADC_EXT_EV_TIM3_CC1 = 0x00000 ADC3:TIM3_CC1 イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_TIM2_CC3 = 0x20000 ADC3:TIM2_CC3 イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_TIM8_CC1 = 0x60000 ADC3:TIM8_CC1 イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_ADC3_TIM8_TRGO = 0x80000 ADC3:TIM8_TRGO イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_TIM5_CC1 = 0xA0000 ADC3:TIM5_CC1 イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_ADC12_TIM8_TRGO = 0xC0000 ADC1, ADC2: TIM3_TRGO イベント(オンチップタイマからの内部信号)
ADC_EXT_EV_TIM5_CC3 = 0xC0000 ADC3:TIM5_CC3イベント(オンチップタイマからの内部信号)
■ adc_smp_rate enum列挙型
ADCクロックサイクルでのADCサンプル時間
これらは入力電圧のサンプリングに費やされる時間を制御します。
ADC_SMPR_1_5 1.5 ADC cycles
ADC_SMPR_7_5 7.5 ADC cycles
ADC_SMPR_13_5 13.5 ADC cycles
ADC_SMPR_28_5 28.5 ADC cycles
ADC_SMPR_41_5 41.5 ADC cycles
ADC_SMPR_55_5 55.5 ADC cycles
ADC_SMPR_71_5 71.5 ADC cycles
ADC_SMPR_239_5 239.5 ADC cycles
■ adc_prescaler列挙型
PCLK2の約数としてのADCプリスケーラ
ADC_PRE_PCLK2_DIV_2 = RCC_ADCPRE_PCLK_DIV_2 PCLK2 divided by 2
ADC_PRE_PCLK2_DIV_4 = RCC_ADCPRE_PCLK_DIV_4 PCLK2 divided by 4
ADC_PRE_PCLK2_DIV_6 = RCC_ADCPRE_PCLK_DIV_6 PCLK2 divided by 6
ADC_PRE_PCLK2_DIV_8 = RCC_ADCPRE_PCLK_DIV_8 PCLK2 divided by 8
■ adc_interrupt_id列挙型
ADC割り込み番号
ADC_EOC レギュラグループの変換終了
ADC_AWD アナログウォッチドッグイベント
ADC_JEOC インジェクトグループの変換終了
デバイス
const adc_dev * ADC1 ADC1 device.
const adc_dev * ADC2 ADC2 device.
const adc_dev * ADC3 ADC3 device.
API関数
■ void adc_init(adc_dev *dev)
ADCペリフェラルを初期化します。
特定のペリフェラルのRCCクロックラインを初期化します。 ADCデバイスレジスタをリセットします。
引数
dev : 初期化するADCペリフェラル
■ void adc_calibrate(adc_dev *dev)
ADCペリフェラルを校正します。
引数
dev : 校正するADCペリフェラル
■ void adc_set_extsel(adc_dev *dev, adc_extsel_event event)
レギュラー・グループに外部イベント選択を設定します。
引数
dev : ADCデバイス
event : 変換開始をトリガーするために使用されるイベント
■ void adc_enable(adc_dev *dev)
周辺機器を有効にします。
引数
dev : 有効にするADCデバイス
■ void adc_disable(adc_dev *dev)
ADCペリフェラルを無効にします。
引数
dev : 無効にするADCデバイス
■ void adc_disable_all(void)
ADC周辺機器をすべて無効にします。
■ void adc_set_sample_rate(adc_dev *dev, adc_smp_rate smp_rate)
ADC_SMPRxを指定した指定したサンプルレート値に変更します。
変換中にこれを呼び出さないでください。
引数
dev : ADCデバイス
smp_rate : 設定するサンプルレート
(補足)
Arduino STM32bでは、デフォルトの設定値は、ADC_SMPR_55_5 (55.5 ADC cycles)が設定されています。
■ uint16 adc_read(adc_dev *dev, uint8 channel)
チャネル上で単一の同期ソフトウェアトリガ変換を実行します。
引数
dev : 読み取りに使用するADCデバイス
channel : 変換するチャンネル
戻り値
変換結果
■ void adc_set_prescaler(adc_prescaler pre)
ADCプリスケーラを設定します。
これは全てのデバイスに対するA / D変換クロックを決めます。
引数
pre : ADCプリスケーラ
デフォルトでは、ADC_PRE_PCLK2_DIV_6(PCLK2 divided by 6)が設定されています。
■ void adc_set_reg_seqlen(adc_dev *dev, uint8 length)
レギュラー・チャネルシーケンス長を設定します。
引数
dev : ADCデバイス
length : 1から16までの通常のチャネルシーケンス長
■ void adc_set_exttrig(adc_dev *dev, uint8 enable)
レギュラー・チャネル用の外部トリガ変換モードイベントを設定します。
引数
dev : ADCデバイス
length : 1の場合は外部イベントの変換が有効になり、0の場合は無効になります。
■ void adc_foreach(void (*fn)(adc_dev*))
すべてのADCデバイスで関数を呼び出します。
引数
fn : 各ADCデバイスを呼び出す関数
■ void adc_config_gpio(struct adc_dev *dev, struct gpio_dev *gdev, uint8 bit)
ADC変換用にGPIOピンを設定します。
引数
dev :変換に使用するADCデバイス(現在すべてのターゲットで無視されています)
gdev :構成するGPIOデバイス
bit :ADC変換用に設定するgdevのビット
■ void adc_enable_single_swstart(adc_dev* dev)
ADCを許可して単一変換形態に設定します。
この関数は、ADCデバイスがadc_read()を使用して単一の同期正規ソフトウェアトリガ変換を実行できるようにするために必要な初期化を実行します。
引数
dev :dev有効にするデバイス
■ void adc_enable_irq(adc_dev* dev, uint8 interrupt)
割り込みを有効にします。
引数
dev :dev有効にするADCデバイス
interrupt :割り込み番号
■ void adc_attach_interrupt(adc_dev *dev, uint8 interrupt, voidFuncPtr handler)
割り込み関数のアタッチ
引数
dev :割り込み関数をアタッチするデバイス
interrupt :割り込み番号
handler :アタッチする割り込み関数
interruptには次の値が設定可能です。
ADC_EOC レギュラグループの変換終了
ADC_AWD アナログウォッチドッグイベント
ADC_JEOC インジェクトグループの変換終了
レジスタマップベースポインタ
ADC1_BASE ((struct adc_reg_map*)0x40012400) STM32F1 ADC1 レジスタマップベースポインタ
ADC2_BASE ((struct adc_reg_map*)0x40012800) STM32F1 ADC2 レジスタマップベースポインタ
ADC3_BASE ((struct adc_reg_map*)0x40013C00) STM32F1 ADC3 レジスタマップベースポインタ
レジスタのビット定義
ADC ステータスレジスタ (ADC_SR)
ビットの定義
ADC_SR_AWD_BIT 0 AWD:アナログウォッチドッグフラグ
ADC_SR_EOC_BIT 1 EOC:変換終了
ADC_SR_JEOC_BIT 2 JEOC:インジェクトチャネルの変換終了
ADC_SR_JSTRT_BIT 3 JSTRT:インジェクトチャネル開始フラグ
ADC_SR_STRT_BIT 4 STRT:レギュラチャネル開始フラグ
ビットのマスクの定義
ADC_SR_AWD BIT(ADC_SR_AWD_BIT) AWD:アナログウォッチドッグフラグ・マスク
ADC_SR_EOC BIT(ADC_SR_EOC_BIT) EOC:変換終了・マスク
ADC_SR_JEOC BIT(ADC_SR_JEOC_BIT) JEOC:インジェクトチャネルの変換終了・マスク
ADC_SR_JSTRT BIT(ADC_SR_JSTRT_BIT) JSTRT:インジェクトチャネル開始フラグ・マスク
ADC_SR_STRT BIT(ADC_SR_STRT_BIT) STRT:レギュラチャネル開始フラグ・マスク
ADC制御レジスタ1(ADC_CR1)
ビットの定義
ADC_CR1_EOCIE_BIT 5 EOCIE:EOC 割り込みイネーブル
ADC_CR1_AWDIE_BIT 6 AWDIE:アナログウォッチドッグ割り込みイネーブル
ADC_CR1_JEOCIE_BIT 7 JEOCIE:インジェクトチャネルの割り込みイネーブル
ADC_CR1_SCAN_BIT 8 SCAN:スキャンモード
ADC_CR1_AWDSGL_BIT 9 AWDSGL:スキャンモードでの単一チャネルのウォッチドッグイネーブル
ADC_CR1_JAUTO_BIT 10 JAUTO:自動インジェクトグループ変換
ADC_CR1_DISCEN_BIT 11 DISCEN:レギュラチャネルの不連続モード
ADC_CR1_JDISCEN_BIT 12 JDISCEN:インジェクトチャネルの不連続モード
ADC_CR1_JAWDEN_BIT 22 JAWDEN:アナログウォッチドッグイネーブル(インジェクトチャネル)
ADC_CR1_AWDEN_BIT 23 AWDEN:アナログウォッチドッグイネーブル(レギュラチャネル)
ビットのマスクの定義
ADC_CR1_AWDCH (0x1F) AWDCH[4:0]:アナログウォッチドッグチャネル選択ビット・マスク
ADC_CR1_EOCIE BIT(ADC_CR1_EOCIE_BIT) EOCIE:EOC 割り込みイネーブル・マスク
ADC_CR1_AWDIE BIT(ADC_CR1_AWDIE_BIT) AWDIE:アナログウォッチドッグ割り込みイネーブル・マスク
ADC_CR1_JEOCIE BIT(ADC_CR1_JEOCIE_BIT) JEOCIE:インジェクトチャネルの割り込みイネーブル・マスク
ADC_CR1_SCAN BIT(ADC_CR1_SCAN_BIT) SCAN:スキャンモード・マスク
ADC_CR1_AWDSGL BIT(ADC_CR1_AWDSGL_BIT) AWDSGL:スキャンモードでの単一チャネルのウォッチドッグイネーブル
ADC_CR1_JAUTO BIT(ADC_CR1_JAUTO_BIT) JAUTO:自動インジェクトグループ変換
ADC_CR1_DISCEN BIT(ADC_CR1_DISCEN_BIT) DISCEN:レギュラチャネルの不連続モード
ADC_CR1_JDISCEN BIT(ADC_CR1_JDISCEN_BIT) JAWDEN:アナログウォッチドッグイネーブル(インジェクトチャネル)
ADC_CR1_DISCNUM (0xE000) DISCNUM[2:0]:不連続モードチャネルカウント
ADC_CR1_JAWDEN BIT(ADC_CR1_JAWDEN_BIT) JAWDEN:アナログウォッチドッグイネーブル(インジェクトチャネル)
ADC_CR1_AWDEN BIT(ADC_CR1_AWDEN_BIT) AWDEN:アナログウォッチドッグイネーブル(レギュラチャネル)
ADC制御レジスタ2(ADC_CR2)
ビットの定義
ADC_CR2_ADON_BIT 0 ADON:A/D コンバータオン/オフ
ADC_CR2_CONT_BIT 1 CONT:連続変換
ADC_CR2_CAL_BIT 2 CAL:A/D 較正
ADC_CR2_RSTCAL_BIT 3 RSTCAL:較正リセット
ADC_CR2_DMA_BIT 8 DMA:ダイレクトメモリアクセスモード
ADC_CR2_ALIGN_BIT 11 ALIGN:データの配置
ADC_CR2_JEXTTRIG_BIT 15 JEXTTRIG:インジェクトチャネルの外部トリガ変換モード
ADC_CR2_EXTTRIG_BIT 20 EXTTRIG:レギュラチャネルの外部トリガ変換モード
ADC_CR2_JSWSTART_BIT 21 JSWSTART:インジェクトチャネルの変換開始
ADC_CR2_SWSTART_BIT 22 SWSTART:レギュラチャネルの変換開始
ADC_CR2_TSVREFE_BIT 23 TSVREFE:温度センサと VREFINT イネーブル
ビットのマスクの定義
ADC_CR2_ADON (1U << ADC_CR2_ADON_BIT) ADON:A/D コンバータオン/オフ・マスク
ADC_CR2_CONT (1U << ADC_CR2_CONT_BIT) CONT:連続変換
ADC_CR2_CAL (1U << ADC_CR2_CAL_BIT) CAL:A/D 較正
ADC_CR2_RSTCAL (1U << ADC_CR2_RSTCAL_BIT) RSTCAL:較正リセット
ADC_CR2_DMA (1U << ADC_CR2_DMA_BIT) DMA:ダイレクトメモリアクセスモード
ADC_CR2_ALIGN (1U << ADC_CR2_ALIGN_BIT) ALIGN:データの配置
ADC_CR2_JEXTSEL 0x7000 JEXTSEL[2:0]: インジェクトグループの外部イベント選択マスク
ADC_CR2_JEXTSEL_TIM1_TRGO (0x0 << 12) JEXTSEL: タイマ 1 TRGO イベント
ADC_CR2_JEXTSEL_TIM1_CC4 (0x1 << 12) JEXTSEL: タイマ 1 CC4 イベント
ADC_CR2_JEXTSEL_TIM2_TRGO (0x2 << 12) JEXTSEL: タイマ 2 TRGO イベント
ADC_CR2_JEXTSEL_TIM2_CC1 (0x3 << 12) JEXTSEL: タイマ 2 CC1 イベント
ADC_CR2_JEXTSEL_TIM3_CC4 (0x4 << 12) JEXTSEL: タイマ 3 CC4 イベント
ADC_CR2_JEXTSEL_TIM4_TRGO (0x5 << 12) JEXTSEL: タイマ 4 TRGO イベント
ADC_CR2_JEXTSEL_EXTI15 (0x6 << 12) JEXTSEL: EXTI ライン 15/TIM8_CC4 イベント
ADC_CR2_JEXTSEL_JSWSTART (0x7 << 12) JEXTSEL: JSWSTART
ADC_CR2_JEXTTRIG (1U << ADC_CR2_JEXTTRIG_BIT) JEXTTRIG:インジェクトチャネルの外部トリガ変換モード
ADC_CR2_EXTSEL 0xE0000 EXTSEL[2:0]:レギュラグループの外部イベント選択マスク
ADC_CR2_EXTSEL_TIM1_CC1 (0x0 << 17) EXTSEL:タイマ 1 CC1 イベント
ADC_CR2_EXTSEL_TIM1_CC2 (0x1 << 17) EXTSEL:タイマ 1 CC2 イベント
ADC_CR2_EXTSEL_TIM1_CC3 (0x2 << 17) EXTSEL:タイマ 1 CC3 イベント
ADC_CR2_EXTSEL_TIM2_CC2 (0x3 << 17) EXTSEL:タイマ 2 CC2 イベント
ADC_CR2_EXTSEL_TIM3_TRGO (0x4 << 17) EXTSEL:タイマ 3 TRGO イベント
ADC_CR2_EXTSEL_TIM4_CC4 (0x5 << 17) EXTSEL:タイマ 4 CC4 イベント
ADC_CR2_EXTSEL_EXTI11 (0x6 << 17) EXTSEL:EXTI ライン 11イベント
ADC_CR2_EXTSEL_SWSTART (0x7 << 17) EXTSEL:SWSTART
ADC_CR2_EXTTRIG (1U << ADC_CR2_EXTTRIG_BIT) レギュラチャネルの外部トリガ変換モード・マスク
ADC_CR2_JSWSTART (1U << ADC_CR2_JSWSTART_BIT) インジェクトチャネルの変換開始・マスク
ADC_CR2_SWSTART (1U << ADC_CR2_SWSTART_BIT) レギュラチャネルの変換開始・マスク
ADC_CR2_TSVREFE (1U << ADC_CR2_TSVREFE_BIT) 温度センサと VREFINT イネーブル・マスク
ADC サンプル時間レジスタ 1(ADC_SMPR1)
ビットのマスクの定義
ADC_SMPR1_SMP17 (0x7 << 21) SMP17:チャネル 17 サンプル時間選択・マスク
ADC_SMPR1_SMP16 (0x7 << 18) SMP16:チャネル 16 サンプル時間選択・マスク
ADC_SMPR1_SMP15 (0x7 << 15) SMP15:チャネル 15 サンプル時間選択・マスク
ADC_SMPR1_SMP14 (0x7 << 12) SMP14:チャネル 14 サンプル時間選択・マスク
ADC_SMPR1_SMP13 (0x7 << 9) SMP13:チャネル 13 サンプル時間選択・マスク
ADC_SMPR1_SMP12 (0x7 << 6) SMP12:チャネル 12サンプル時間選択・マスク
ADC_SMPR1_SMP11 (0x7 << 3) SMP11:チャネル 11 サンプル時間選択・マスク
ADC_SMPR1_SMP10 0x7 SMP10:チャネル 10 サンプル時間選択・マスク
ADC サンプル時間レジスタ 2(ADC_SMPR2)
ビットのマスクの定義
ADC_SMPR2_SMP9 (0x7 << 27) SMP9:チャネル 9 サンプル時間選択・マスク
ADC_SMPR2_SMP8 (0x7 << 24) SMP8:チャネル 8 サンプル時間選択・マスク
ADC_SMPR2_SMP7 (0x7 << 21) SMP7:チャネル 7 サンプル時間選択・マスク
ADC_SMPR2_SMP6 (0x7 << 18) SMP6:チャネル 6 サンプル時間選択・マスク
ADC_SMPR2_SMP5 (0x7 << 15) SMP5:チャネル 5 サンプル時間選択・マスク
ADC_SMPR2_SMP4 (0x7 << 12) SMP4:チャネル 4 サンプル時間選択・マスク
ADC_SMPR2_SMP3 (0x7 << 9) SMP3:チャネル 3 サンプル時間選択・マスク
ADC_SMPR2_SMP2 (0x7 << 6) SMP2:チャネル 2サンプル時間選択・マスク
ADC_SMPR2_SMP1 (0x7 << 3) SMP1:チャネル 1サンプル時間選択・マスク
ADC_SMPR2_SMP0 0x7 SMP10:チャネル 9 サンプル時間選択・マスク
ADC インジェクトチャネルデータオフセットレジスタ x(ADC_JOFRx)(x=1..4)
ADC_JOFR_JOFFSET 0x3FF JOFFSETx[11:0]:インジェクトチャネル x のデータオフセット
このドキュメントはleafLabs, LLC.が執筆し、たま吉が翻訳・一部加筆修正したものです。
NAVER、ヤフオク等の営利目的の記事転用、リンク貼りは禁止です。