qq793040564 发表于 2014-11-9 20:19:12

stm32f103 外部中断触发ad dma采样 求指导

最近项目中想用stm32做类似示波器的功能,想用外部中断触发ad的dma采样,看了网上的一些例程,但是感觉都不全,能给个例程包含addma采样时间控制的么?

wenyangzeng 发表于 2014-11-25 15:52:55

本帖最后由 wenyangzeng 于 2014-11-26 22:04 编辑

ADC基本配置就不用上了,相关的如下:

//允许ADC1的DMA模式
ADC_DMACmd(ADC1, ENABLE);                                             

//用定时器触发:
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;                   //定时器2 CC2
ADC_ExternalTrigConvCmd(ADC1, ENABLE);
TIM_Cmd(TIM2,ENABLE);
TIM_CtrlPWMOutputs(TIM2,ENABLE);

//-----------
//DMA的配置
//-----------
void DMA_Configuration(void)
{
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);                                    //允许 DMA1 DMA通道1
      DMA_DeInit(DMA1_Channel1);
      DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)( &(ADC1->DR));                         //ADC1数据寄存器
      DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;                                 //获取ADC的数组
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                          //片内外设作源头
      DMA_InitStructure.DMA_BufferSize = N*M;                                                                  //每次DMA传输 N*M 个数据
      DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                           //外设地址不增加
      DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                              //内存地址增加
      DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;      //半字
      DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;             //半字
      DMA_InitStructure.DMA_Mode =DMA_Mode_Circular;                                                   //DMA_Mode_Normal 普通模式
      DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                                 //高优先级
      DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                   //非内存到内存
      DMA_Init(DMA1_Channel1, &DMA_InitStructure);
      DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, DISABLE);                                                //ENABLE or DISABLE   DMA通道1传输完成中断
      DMA_Cmd(DMA1_Channel1, ENABLE);                                                                        //Enable DMA1 channel1
}

//TIM2通道2作为ADC1转换的触发时钟500US转换一次
      
TIM_DeInit(TIM2);                                                
TIM_TimeBaseStructure.TIM_Period = 500;                        
TIM_TimeBaseStructure.TIM_Prescaler = 70;                        
TIM_TimeBaseStructure.TIM_ClockDivision = 0;                     
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;      
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

最重要的都给出了。不要偷懒,剩下的自己动手吧。

沐紫 发表于 2014-11-14 15:36:10

哪位大侠帮楼主看下这个问题呢

qq793040564 发表于 2016-1-2 00:53:15

很感谢楼上的回复,虽然 是定时器的, 但是后来 我确实也改成了外部中断触发定时器然后定时器触发 采样,其实这个用途有点像示波器,
页: [1]
查看完整版本: stm32f103 外部中断触发ad dma采样 求指导