Library for build-in ADC and DAC in STM32F446 mounted on Nucleo F446RE. Nucleo F446RE に搭載されている STM32F446 の内蔵 ADC, DAC 用のライブラリ.
Dependents: Demo_F446_AD_DA F446_MySoundMachine F446_ADF_Nlms F446_Spectrogram
Diff: F446_DAC.hpp
- Revision:
- 0:c945b4fe9a48
- Child:
- 1:6b9f2af6613d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/F446_DAC.hpp Fri Nov 11 06:28:48 2016 +0000 @@ -0,0 +1,77 @@ +//-------------------------------------------------------- +// Class for buit-in dual DAC on STM32F446 ---- Header +// TIM3 is used for clock to external SCF +// +// STM32F446 内蔵の DAC 用のクラス(ヘッダ) +// TIM3 を外付けの SCF のクロックとして使用 +// Analog Out1: A2 (PA_4) +// Analog Out2: D13 (PA_5) +// +// 2016/11/11, Copyright (c) 2016 MIKAMI, Naoki +//-------------------------------------------------------- + +#include "mbed.h" + +#ifndef STM32F446xx +#error Select STM32F446. +#endif + +#ifndef F446_DAC_DUAL_HPP +#define F446_DAC_DUAL_HPP + +namespace Mikami +{ + class DacDual + { + public: + // Constructor + DacDual() : da1_(PA_4), da2_(PA_5) + { + DAC->CR = DAC_CR_EN1 | DAC_CR_TEN1 | DAC_CR_TSEL1 | + DAC_CR_EN2 | DAC_CR_TEN2 | DAC_CR_TSEL2; + } + + virtual ~DacDual() {} + + // -1.0f <= data1, data2 <= 1.0f + void Write(float data1, float data2) + { WriteDac(ToUint16(data2), ToUint16(data1)); } + + // 0 <= data1, data2 <= 4095 + void Write(uint16_t data1, uint16_t data2) + { WriteDac(SatUint16(data2), SatUint16(data1)); } + + // Set TIM3 for clock of switched-capacitor filter + void ScfClock(uint32_t clock); + + private: + static const uint32_t swtrig_ = DAC_SWTRIGR_SWTRIG1 + | DAC_SWTRIGR_SWTRIG2; + AnalogOut da1_, da2_; + + // Write dual-channel data + void WriteDac(uint16_t val1, uint16_t val2) + { + DAC->DHR12RD = (val2 << 16) | val1; + DAC->SWTRIGR = swtrig_; + } + + // Saturate float to an unsigned 16-bit value + uint16_t ToUint16(float val) + { + if (val < -1.0f) val = -1.0f; + if (val > 1.0f) val = 1.0f; + return (uint16_t)((val + 1.0f)*2047); + } + + // Saturate to an unsigned 16-bit value + uint16_t SatUint16(uint16_t val) + { return (val > 4095) ? 4095 : val; } + + // for inhibition of copy constructor + DacDual(const DacDual&); + // for inhibition of substitute operator + DacDual& operator=(const DacDual&); + }; +} +#endif // F446_DAC_DUAL_HPP \ No newline at end of file