[STM32F4] STM32F407VGT6中的FFT分析效果出不来

[复制链接]
2011|2
 楼主| 大红枣我喜欢 发表于 2014-8-1 15:58 | 显示全部楼层 |阅读模式
          我用淘淘科技的STM332F407VGT6开发板 ,通过板子上DA发送一个幅值为3V、周期为1ms的正弦波,然后用AD采集一个周期的256点,之后调用DSP库中的FFT分析,然后在LCD上显示。但是在调程序的时候,对一下几个问题仍模糊:1、不知道DMA设置对不对; 2 不知道定时器设置对不对;3 不知道ADC采样时间设置对不对 ;4 不知道中断处理对不对
  1. uint16_t j=0,k=0;
  2. uint16_t capture = 0;
  3. extern uint16_t ADC1ConvertedValue[512];
  4. float32_t adc_Value[256*2];
  5. uint16_t adc_Count=0;
  6. void TIM3_IRQHandler(void)
  7. {
  8. //  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
  9.   if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  10.   {
  11.     j++;
  12.     ADC_SoftwareStartConv(ADC1);
  13.     if(j>=40000) //400
  14.     {
  15.       j=0;
  16.       GPIO_ToggleBits(GPIOD,GPIO_Pin_12);
  17.           LCD_ShowNum(25,75,78);
  18.     }
  19.     TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  20.   }
  21. }

  22. //bool adc_sample = false;
  23. void DMA2_Stream0_IRQHandler(void)
  24. {
  25.   uint16_t i=0;

  26.   if(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_TCIF0)!= RESET)                    
  27.   {                                                                                                                               
  28.       ADC_Cmd(ADC1, DISABLE);
  29.           GPIO_ToggleBits(GPIOD,GPIO_Pin_13);
  30. //          GPIO_SetBits(GPIOD,GPIO_Pin_13);
  31. //    unsigned int aa;
  32. //    aa=0;
  33.       for(adc_Count=0;adc_Count<256*2;)
  34.       {
  35.                 adc_Value[adc_Count++] = ADC1ConvertedValue[i]&0x0000ffff;
  36.                 adc_Value[adc_Count++] = 0;
  37.                 adc_Value[adc_Count++] = ADC1ConvertedValue[i++]>>16;       
  38.                 adc_Value[adc_Count++] = 0;
  39.           }
  40.       FFT();
  41.           adc_Count=0;
  42.              ADC1->SR = 0;
  43. //          DMA_Config();
  44.       ADC_Cmd(ADC1, ENABLE);
  45.   }
  46.           DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
  47. }

   弄了几天还没搞定,希望大神帮我看看程序,指点一下
  1. void DMA_Config(void)
  2. {
  3. //  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
  4.   /* DMA2 Stream0 channel0 configuration **************************************/
  5.   DMA_DeInit(DMA2_Stream0);
  6.   DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
  7.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;
  8.   DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1ConvertedValue;
  9.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;                   /////////  ??????????????
  10.   DMA_InitStructure.DMA_BufferSize = 256;       
  11.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  12.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  13.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  14.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                 //
  15.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;          
  16.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  17.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  18.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  19.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  20.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  21.   DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  22.   DMA_Cmd(DMA2_Stream0, ENABLE);

  23.   /* Enable DMA request after last transfer (Single-ADC mode) */
  24.   ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
  25.   /* Enable ADC1 DMA */
  26.   ADC_DMACmd(ADC1, ENABLE);
  27.   //使能DMA中断
  28.   DMA_ITConfig(DMA2_Stream0,DMA_IT_TC , ENABLE);

  29. }
  1. void TIM3_Config(void)  {



 楼主| 大红枣我喜欢 发表于 2014-8-7 08:47 | 显示全部楼层
搞定了
598982654 发表于 2014-8-10 12:57 | 显示全部楼层
源代码可以发下吗?最近在做这个,也是做不出来?624727713@qq.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

39

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部