这两天想实现输入一个脉冲,当检测到脉冲上升沿的时候进行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);
}
一周热门 更多>