想实现的功能是:ADC双通道连续采样,通过DMA把值存到一个长度为700的数组里面,然后把值通过串口发送到电脑
我设想实现的方案是:开启ADC扫描模式和连续转换模式,DMA中断,等到采样350次后会进入DMA中断,然后在中断里面失能DMA并给标志位置1,再在主程序中判断标志位后发送数值,再使能DMA,可是这个过程过后发现无法再次进入DMA中断而且ADC也不再采样,请问这是为什么呀?
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
HAL_DMA_DeInit(&UART1TxDMA_Handler);
finish_flag=1;
}
//主函数里面的判断 if(finish_flag==1)
{
HAL_DMA_Init(&UART1TxDMA_Handler);
get_adc();
finish_flag=0;
}
void get_adc()
{
ADC1_Handler.Instance->DR=ADC1_Handler.Instance->DR;
HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&buffer,700);
}
我尝试的解决方案:如果我不失能DMA的话,则能一直进入DMA中断,AD采样也不会停,或者如果我再中断函数中失能DMA再马上使能DMA,则中断依然能够正常工作
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
HAL_DMA_DeInit(&UART1TxDMA_Handler);
HAL_DMA_Init(&UART1TxDMA_Handler);
get_adc();
finish_flag=1;
}
真的感觉很奇怪,不知道为什么在中断里面关掉DMA再打开就不会出问题但是如果在中断关掉在主函数里面打开就会出问题
PS:ADC配置代码
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
//ch: ADC_channels
//通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
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=ENABLE; //扫描模式
ADC1_Handler.Init.EOCSelection=DISABLE; //关闭EOC中断
ADC1_Handler.Init.ContinuousConvMode=ENABLE; //开启连续转换
ADC1_Handler.Init.NbrOfConversion=2; //1个转换在规则序列中 也就是只转换规则序列1
ADC1_Handler.Init.DiscontinuousConvMode=DISABLE; //禁止不连续采样模式
ADC1_Handler.Init.NbrOfDiscConversion=0; //不连续采样通道数为0
ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START; //软件触发
ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING;//使用软件触发
ADC1_Handler.Init.DMAContinuousRequests=ENABLE; //开启DMA请求
HAL_ADC_Init(&ADC1_Handler); //初始化
ADC_RegularChannelConfig(&ADC1_Handler, ADC_CHANNEL_5, 1, ADC_SAMPLETIME_28CYCLES);
ADC_RegularChannelConfig(&ADC1_Handler, ADC_CHANNEL_6, 2, ADC_SAMPLETIME_28CYCLES);
}
一周热门 更多>