STM32F429外部触发AD采样的问题

2019-07-20 04:06发布

这两天想实现输入一个脉冲,当检测到脉冲上升沿的时候进行ADC采样再用DMA传输,可是配置了之后发现根本没用,到网上搜了好多方法可是都不行,而且大部分都是标准库的,请求原子哥帮忙看看到底哪里配置错了
还有就是想问一下如果要用定时器触发ADC的话能用溢出更新事件来触发吗,还是说只能用PWM输出来触发
谢谢啦,下面是我初始化的代码
void ADC_RegularChannelConfig(ADC_HandleTypeDef *AdcHandle, uint32_t Channel, uint32_t Rank, uint32_t SamplingTime)
{
    ADC_ChannelConfTypeDef ADC1_ChanConf;
    ADC1_ChanConf.Channel      = Channel;                               //通道
    ADC1_ChanConf.Rank         = Rank;                                  //第几个序列
    ADC1_ChanConf.SamplingTime = SamplingTime;                          //采样时间
    HAL_ADC_ConfigChannel(AdcHandle,&ADC1_ChanConf);                    //通道配置
}
//初始化ADC
void MY_ADC_Init(void)
{
    ADC1_Handler.Instance=ADC1;
    ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ
    ADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式
    ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
    ADC1_Handler.Init.ScanConvMode=DISABLE;                      //关闭扫描模式
    ADC1_Handler.Init.EOCSelection=DISABLE;                      //关闭EOC中断
    ADC1_Handler.Init.ContinuousConvMode=ENABLE;                //连续转换
    ADC1_Handler.Init.NbrOfConversion=1;                         //1个转换在规则序列中 也就是只转换规则序列1
    ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
    ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
    ADC1_Handler.Init.ExternalTrigConv=ADC_EXTERNALTRIGCONV_Ext_IT11;       //外部触发
    ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_RISING;//上升沿触发
    ADC1_Handler.Init.DMAContinuousRequests=ENABLE;             //开启DMA请求

    HAL_ADC_Init(&ADC1_Handler);                                 //初始化
          ADC_RegularChannelConfig(&ADC1_Handler, ADC_CHANNEL_5, 1, ADC_SAMPLETIME_28CYCLES);
}
void MYDMA_Config()
{
    __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能       
    __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,UART1TxDMA_Handler);    //将DMA与ADC1联系起来(发送DMA)
    UART1TxDMA_Handler.Instance=DMA2_Stream0;                            //数据流选择
    UART1TxDMA_Handler.Init.Channel=DMA_CHANNEL_0;                                //通道选择
    UART1TxDMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY;             //外设到储存器
    UART1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    UART1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    UART1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;    //外设数据长度:32位
    UART1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;       //存储器数据长度:32位
    UART1TxDMA_Handler.Init.Mode=DMA_CIRCULAR;                            //循环模式
    UART1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
    UART1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    UART1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    UART1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
    UART1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输
    UART1TxDMA_Handler.XferCpltCallback =HAL_DMA_IRQHandler ;
    HAL_DMA_DeInit(&UART1TxDMA_Handler);   
    HAL_DMA_Init(&UART1TxDMA_Handler);
    HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 1, 1);                     //DMA中断优先级
    HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);                             //使能DMA中断
}
void EXTI_Init()
{
          GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_GPIOH_CLK_ENABLE();           //开启GPIOH时钟
       
    GPIO_Initure.Pin=GPIO_PIN_11;            //PH11
    GPIO_Initure.Mode=GPIO_MODE_EVT_RISING;      //下降沿 外部事件
    GPIO_Initure.Pull=GPIO_PULLDOWN;        //下拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
    HAL_GPIO_Init(GPIOH,&GPIO_Initure);
       
          HAL_NVIC_SetPriority(EXTI15_10_IRQn ,2,0); //设置中断优先级并且设置通道
                HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。