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

Revision:
5:7851fd2f875b
Parent:
3:d1da91aec62f
--- a/F446_DAC.hpp	Sat Feb 18 05:37:31 2017 +0000
+++ b/F446_DAC.hpp	Tue Feb 21 12:56:51 2017 +0000
@@ -4,10 +4,10 @@
 //
 //  STM32F446 内蔵の DAC 用のクラス(ヘッダ)
 //      TIM3 を外付けの SCF のクロックとして使用
-//      DAC_OUT1: A2  (PA_4), 左
-//      DAC_OUT2: D13 (PA_5), 右
+//      A2  (PA_4): 左
+//      D13 (PA_5): 右
 //
-//  2017/01/30, Copyright (c) 2017 MIKAMI, Naoki
+//  2017/02/19, Copyright (c) 2017 MIKAMI, Naoki
 //--------------------------------------------------------
 
 #include "mbed.h"
@@ -41,34 +41,30 @@
         // 0 <= data1, data2 <= 4095
         //      data1: left, data2: right
         void Write(uint16_t data1, uint16_t data2)
-        {   WriteDac(SatUint16(data1), SatUint16(data2)); }
+        {   WriteDac(__USAT(data1, BIT_WIDTH_),
+                     __USAT(data2, BIT_WIDTH_)); }
         
         // Set TIM3 for clock of switched-capacitor filter
         void ScfClock(uint32_t clock);
 
     private:
-        static const uint32_t swtrig_ = DAC_SWTRIGR_SWTRIG1
+        static const uint32_t SWTRIG_ = DAC_SWTRIGR_SWTRIG1
                                       | DAC_SWTRIGR_SWTRIG2;
+        static const int BIT_WIDTH_ = 12;
         AnalogOut da1_, da2_;
 
         // Write dual-channel data
         void WriteDac(uint16_t val1, uint16_t val2)
         {
-            DAC->DHR12RD = (val2 << 16) | val1;
-            DAC->SWTRIGR = swtrig_;
+            DAC->DHR12RD = __PKHBT(val1, val2, 16);
+            DAC->SWTRIGR = SWTRIG_;
         }
 
-        // Saturate float to an unsigned 16-bit value
+        // Saturate float to an unsigned 16-bit type
         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);
+            return __USAT((val + 1.0f)*2047.0f, BIT_WIDTH_);
         }
-        
-        // 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&);