不韋 呂 / UITDSP_ADDA2

Dependents:   UITDSP_ADDA_Example2

Revision:
0:46d099dfd9d6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ADC_BuiltIn.cpp	Sat Mar 14 06:49:49 2015 +0000
@@ -0,0 +1,60 @@
+//------------------------------------------------------
+// Class for ADC using TIM2 trigger
+//      To get bit definition for register in
+//      peripheral, see "stm32f401xe.h"
+//
+// 2015/03/14, Copyright (c) 2014 MIKAMI, Naoki
+//------------------------------------------------------
+
+#include "ADC_BuiltIn.hpp"
+
+namespace Mikami
+{
+    ADC_BuiltIn::ADC_BuiltIn(PinName pin1, int frequency,
+                             PinName pin2, PinName pin3)
+        : adc_(pin1), myAdc_(ADC1)
+    {
+        myAdc_->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING   // External Trigger on the rising edge
+                    | ADC_EXTERNALTRIGCONV_T2_TRGO      // Use Timer2 TRGO event
+                    | ADC_CR2_ADON;                     // Enable ADC
+
+        ch1_ = GetChannelNumber(pin1);
+        if (pin2 != NC)
+        {
+            adc2_ = new AnalogIn(pin2);
+            ch2_ = GetChannelNumber(pin2);
+        }
+        if (pin3 != NC)
+        {
+            adc3_ = new AnalogIn(pin3);
+            ch3_ = GetChannelNumber(pin3);
+        }
+        SetTim2(frequency);
+        Select1stChannel();
+    }
+
+    // Extract channel number
+    uint8_t ADC_BuiltIn::GetChannelNumber(PinName pin)
+    {
+        uint8_t ch = 0;
+        if ((pin & 0x30) == 0x00) ch = pin;
+        if ((pin & 0x30) == 0x10) ch = (pin & 0x01) + 8;
+        if ((pin & 0x30) == 0x20) ch = (pin & 0x07) + 10;
+        return ch;
+    }
+
+    void ADC_BuiltIn::SetTim2(int frequency)
+    {
+        __TIM2_CLK_ENABLE();    // Supply clock, See "stm32f4xx_hal_rcc.h"
+        
+        SystemCoreClockUpdate();    // Update core clock (for F411RE)
+                                    // See system_stm32f4xx.h
+        TIM_TypeDef* myTim = TIM2;
+
+        myTim->CR2 = TIM_CR2_MMS_1; // Update event: as trigger out
+        myTim->ARR = SystemCoreClock/frequency - 1; // Auto-reload
+        myTim->PSC = 0;             // Prescaler
+        myTim->CR1 = TIM_CR1_CEN;   // Enable TIM2
+    }
+}
+