Browse Source

Переделал инициализацию TIM2 под SPL

Vladimir N. Shilov 9 năm trước cách đây
mục cha
commit
5cfd47fcb9
2 tập tin đã thay đổi với 58 bổ sung57 xóa
  1. 55 57
      lib/adc.c
  2. 3 0
      lib/adc.h

+ 55 - 57
lib/adc.c

@@ -19,7 +19,7 @@
 /* Private define ------------------------------------------------------------*/
 /* Private macro -------------------------------------------------------------*/
 /* Private variables ---------------------------------------------------------*/
-uint16_t Buffer[BUFFER_SIZE]  = {0, 0};
+uint16_t Buffer[BUFFER_SIZE]  = {0, 0, 0};
 uint16_t Voltage = 0;
 uint16_t Current = 0;
 uint16_t RefVolt = 0;
@@ -41,24 +41,12 @@ void Init_ADC(void)
 {
     /* ADC configuration */
     ADC_Config();
+
     /* DMA configuration */
     DMA_Config();
+
     /* TIM2 configuration */
     TIM2_Config();
-
-    /* Enable ADC1 DMA requests*/
-    ADC_DMACmd(ADC1, ENABLE);
-
-    /* Start ADC1 Conversion using TIM1 TRGO*/
-    ADC_ExternalTrigConfig(ADC1, ADC_ExtEventSelection_Trigger3,
-                         ADC_ExtTRGSensitivity_Rising);
-
-    /* Master Mode selection: Update event */
-    TIM2_SelectOutputTrigger(TIM2_TRGOSource_Update);
-
-    /* Enable TIM2 */
-    TIM2_Cmd(ENABLE);
-
 }
 
 /**
@@ -68,28 +56,35 @@ void Init_ADC(void)
   */
 static void ADC_Config(void)
 {
-  /* Enable ADC1 clock */
-  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
-
-  /* Initialize and configure ADC1 */
-  ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_1);
-  ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);
-  ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_384Cycles);
-
-  /* Enable ADC1 */
-  ADC_Cmd(ADC1, ENABLE);
-
-  /* Enable ADC1 Voltage meter channel */
-  ADC_ChannelCmd(ADC1, VOLTAGE_CHANNEL, ENABLE);
-  ADC_SchmittTriggerConfig(ADC1, VOLTAGE_CHANNEL, DISABLE);
-  /* Enable ADC1 Current meter channel */
-  ADC_ChannelCmd(ADC1, CURRENT_CHANNEL, ENABLE);
-  ADC_SchmittTriggerConfig(ADC1, CURRENT_CHANNEL, DISABLE);
-
-  /* ADC Voltage Reference */
-  ADC_VrefintCmd(ENABLE);
-  /* Enable ADC1 Vrefint Channel */
-  ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);
+    /* Enable ADC1 clock */
+    CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
+
+    /* Initialize and configure ADC1 */
+    ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_1);
+    ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);
+    ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_384Cycles);
+
+    /* Enable ADC1 */
+    ADC_Cmd(ADC1, ENABLE);
+
+    /* Enable ADC1 Voltage meter channel */
+    ADC_ChannelCmd(ADC1, VOLTAGE_CHANNEL, ENABLE);
+    ADC_SchmittTriggerConfig(ADC1, VOLTAGE_CHANNEL, DISABLE);
+
+    /* Enable ADC1 Current meter channel */
+    ADC_ChannelCmd(ADC1, CURRENT_CHANNEL, ENABLE);
+    ADC_SchmittTriggerConfig(ADC1, CURRENT_CHANNEL, DISABLE);
+
+    /* ADC Voltage Reference */
+    ADC_VrefintCmd(ENABLE);
+    /* Enable ADC1 Vrefint Channel */
+    ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);
+
+    /* Enable ADC1 DMA requests*/
+    ADC_DMACmd(ADC1, ENABLE);
+
+    /* Start ADC1 Conversion using TIM1 TRGO*/
+    ADC_ExternalTrigConfig(ADC1, ADC_ExtEventSelection_Trigger3, ADC_ExtTRGSensitivity_Rising);
 }
 
 /**
@@ -99,13 +94,13 @@ static void ADC_Config(void)
   */
 static void DMA_Config(void)
 {
-  /* Enable DMA1 clock */
-  CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
+    /* Enable DMA1 clock */
+    CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
 
-  /* Connect ADC to DMA channel 0 */
-  SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);
+    /* Connect ADC to DMA channel 0 */
+    SYSCFG_REMAPDMAChannelConfig(REMAP_DMA1Channel_ADC1ToChannel0);
 
-  DMA_Init(DMA1_Channel0, BUFFER_ADDRESS,
+    DMA_Init(DMA1_Channel0, BUFFER_ADDRESS,
            ADC1_DR_ADDRESS,
            BUFFER_SIZE,
            DMA_DIR_PeripheralToMemory,
@@ -114,14 +109,14 @@ static void DMA_Config(void)
            DMA_Priority_High,
            DMA_MemoryDataSize_HalfWord);
 
-  /* DMA Channel0 enable */
-  DMA_Cmd(DMA1_Channel0, ENABLE);
+    /* DMA Channel0 enable */
+    DMA_Cmd(DMA1_Channel0, ENABLE);
 
-  /* Enable DMA1 channel0 Transfer complete interrupt */
-  DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE);
+    /* Enable DMA1 channel0 Transfer complete interrupt */
+    DMA_ITConfig(DMA1_Channel0, DMA_ITx_TC, ENABLE);
 
-  /* DMA enable */
-  DMA_GlobalCmd(ENABLE);
+    /* DMA enable */
+    DMA_GlobalCmd(ENABLE);
 }
 
 /**
@@ -134,17 +129,20 @@ static void TIM2_Config(void)
     /* Enable TIM2 clock */
     CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);
 
-    //Âîëøåáíîå ÷èñëî 1250 ïîëó÷èëîñü òàê:
-    // ×àñòîòà ÌÊ (16 ÌHz) / Ïðåääåëèòåëü òàéìåðà (128) * Íóæíîå âðåìÿ â ñåêóíäàõ (0.01)
-    TIM2->ARRH = 1250>>8; //Çàïèñûâàåì ñíà÷àëà ñòàðøèé áàéò
-    TIM2->ARRL = (uint8_t)(1250); //Ïîòîì ìëàäøèé
-    TIM2->CR1 |= TIM_CR1_URS; //Íàñòðàèâàåì èñòî÷íèê ñîáûòèÿ update
-//    TIM2->CR2 |= (2<<4); //Íàñòðàèâàåì íà ïîäà÷ó ñèãíàëà äëÿ ÀÖÏ ïðè ïåðåïîëíåíèè òàéìåðà == TIM2_TRGOSource_Update
-    TIM2->PSCR = 7; //Ïðåääåëèòåëü = 2^7 = 128
-    TIM2->EGR |= TIM_EGR_UG;  //Ãåíåðèì ñîáûòèå update, ÷òîáû îáíîâèëñÿ ïðåääåëèòåëü
-    TIM2->CR1 |= TIM_CR1_CEN; //Çàïóñêàåì
+    /* Initializes the TIM2 Time Base Unit */
+    TIM2_TimeBaseInit(TIM2_Prescaler_128, TIM2_CounterMode_Up, TIM_PERIOD);
+
+    /* Selects the TIM2 Update Request Interrupt source */
+    TIM2_UpdateRequestConfig(TIM2_UpdateSource_Regular);
+
+    /* Master Mode selection: Update event */
+    TIM2_SelectOutputTrigger(TIM2_TRGOSource_Update);
+
+    /* Enable TIM2 */
+    TIM2_Cmd(ENABLE);
 }
 
+
 /**
   * @}
   */

+ 3 - 0
lib/adc.h

@@ -24,6 +24,9 @@
 #define BUFFER_SIZE         ((uint8_t) 0x03)
 #define BUFFER_ADDRESS      ((uint16_t)(&Buffer))
 
+// (×àñòîòà ÌÊ (16 ÌHz) / Ïðåääåëèòåëü òàéìåðà (128) * Íóæíîå âðåìÿ â ñåêóíäàõ (0.01)) - 1
+#define TIM_PERIOD          ((uint16_t)1249)
+
 /* Exported constants --------------------------------------------------------*/
 __near __no_init const unsigned char Factory_VREFINT @ 0x4910;