OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3922|回复: 8

stm32h743 adc(dma模式)只能采到一次ad值,各位大侠帮忙找下原因*_*

[复制链接]

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2013-10-12
在线时间
9 小时
发表于 2019-8-8 17:50:16 | 显示全部楼层 |阅读模式
1金钱
以下函数,能读取ad值,但值一直不变,只能读取一次



ADC_HandleTypeDef ADC1_Handler;//ADC句柄
ADC_ChannelConfTypeDef ADC1_ChanConf;
DMA_HandleTypeDef  ADC1DMA_Handler;      //DMA句柄
uint32_t   aAD_Data[30];
//初始化ADC
//ch: ADC_channels
//通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
void MY_ADC_Init(void)
{
        GPIO_InitTypeDef GPIO_Initure;
    __HAL_RCC_ADC12_CLK_ENABLE();           //使能ADC1/2时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();                        //开启GPIOA时钟
        __HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP); //ADC外设时钟选择
        
    GPIO_Initure.Pin=GPIO_PIN_5 | GPIO_PIN_6;            //PA5
    GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
    GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
    HAL_GPIO_Init(GPIOA,&GPIO_Initure);
        
        ADC1_Handler.Instance          = ADC1;
        HAL_ADC_DeInit(&ADC1_Handler);
        
    ADC1_Handler.Instance=ADC1;
    ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;         //4分频,ADCCLK=PER_CK/4=64/4=16MHZ
    ADC1_Handler.Init.Resolution=ADC_RESOLUTION_16B;                   //16位模式
    ADC1_Handler.Init.ScanConvMode=ENABLE;                            //扫描模式
    ADC1_Handler.Init.EOCSelection=ADC_EOC_SEQ_CONV;                       //关闭EOC中断
        //ADC_EOC_SEQ_CONV
        //ADC_EOC_SINGLE_CONV
        ADC1_Handler.DMA_Handle=&ADC1DMA_Handler;
        ADC1_Handler.Init.LowPowerAutoWait=DISABLE;                                        //自动低功耗关闭                                
    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_NONE;//使用软件触发
        ADC1_Handler.Init.BoostMode=ENABLE;                                                        //BOOT模式关闭
        ADC1_Handler.Init.Overrun=ADC_OVR_DATA_OVERWRITTEN;                        //有新的数据的死后直接覆盖掉旧数据
        //ADC1_Handler.Init.Overrun=ADC_OVR_DATA_PRESERVED;
        ADC1_Handler.Init.OversamplingMode=DISABLE;                                        //过采样关闭
        ADC1_Handler.Init.ConversionDataManagement=ADC_CONVERSIONDATA_DMA_CIRCULAR;  //规则通道的数据仅仅保存在DR寄存器里面
    HAL_ADC_Init(&ADC1_Handler);                                 //初始化
        HAL_ADCEx_Calibration_Start(&ADC1_Handler,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADC校准


        ADC1_ChanConf.Channel=ADC_CHANNEL_19;                             //通道
        ADC1_ChanConf.Rank=ADC_REGULAR_RANK_1;                          //1个序列
        ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_64CYCLES_5;              //采样时间      
        ADC1_ChanConf.SingleDiff=ADC_SINGLE_ENDED;                                  //单边采集                          
        ADC1_ChanConf.OffsetNumber=ADC_OFFSET_NONE;                     
        ADC1_ChanConf.Offset=0;   
        HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置
        
        ADC1_ChanConf.Channel=ADC_CHANNEL_3;                             //通道
        ADC1_ChanConf.Rank=ADC_REGULAR_RANK_2;                          //1个序列
        ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_64CYCLES_5;              //采样时间      
        ADC1_ChanConf.SingleDiff=ADC_SINGLE_ENDED;                                  //单边采集                          
        ADC1_ChanConf.OffsetNumber=ADC_OFFSET_NONE;                     
        ADC1_ChanConf.Offset=0;   
        HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置
        
        
        //HAL_ADC_Start(&ADC1_Handler);
        //HAL_ADC_PollForConversion(&ADC1_Handler,10);
}



void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx)
{
        __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能        
    __HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
        
        
    //Tx DMA配置
    ADC1DMA_Handler.Instance=DMA_Streamx;                            //数据流选择
        ADC1DMA_Handler.Init.Request=DMA_REQUEST_ADC1;                                         //ADC1发送DMA
    ADC1DMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY;             //外设到存储器
    ADC1DMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    ADC1DMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    ADC1DMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;//外设数据长度:16位
    ADC1DMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;   //存储器数据长度:16位
    ADC1DMA_Handler.Init.Mode=DMA_CIRCULAR;                          //外设流控模式
    ADC1DMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
    ADC1DMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    ADC1DMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    ADC1DMA_Handler.Init.MemBurst=DMA_PBURST_SINGLE;                                 //存储器突发单次传输
    ADC1DMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;                      //外设突发单次传输
        ADC1DMA_Handler.StreamBaseAddress=(uint32_t)aAD_Data;
        
        __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1DMA_Handler);    //将DMA与USART1联系起来(发送DMA)
        
        //HAL_DMA_DeInit(&ADC1DMA_Handler);   
    HAL_DMA_Init(&ADC1DMA_Handler);
        HAL_DMA_Start (&ADC1DMA_Handler,(u32)&ADC1->DR,(unsigned int)&aAD_Data,20);//
        
}


main()
{
        MY_ADC_Init();                                  //初始化ADC1通道5
        MYDMA_Config(DMA1_Stream7);                                //初始化DMA
        while(1)
        {
                HAL_ADC_Start_DMA(&ADC1_Handler, (uint32_t *)aAD_Data,2);
                delay_ms(450);        
                adcx=aAD_Data[0];
                  delay_ms(450);        
                  HAL_ADC_Stop_DMA(&ADC1_Handler);
        }
}




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-4-24
在线时间
4 小时
发表于 2019-8-8 18:34:54 | 显示全部楼层
您好,想请教一下

如果想测量1.5V~1.65V的电压
vref+接1.65v,GND接1.5V可行吗?

GND接1.5V会不会影响其他模块?
回复

使用道具 举报

4

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2013-10-12
在线时间
9 小时
 楼主| 发表于 2019-8-9 09:23:49 | 显示全部楼层
铭贤 发表于 2019-8-8 18:34
您好,想请教一下

如果想测量1.5V~1.65V的电压

adc有个专门的地
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-4-24
在线时间
4 小时
发表于 2019-8-9 17:47:58 | 显示全部楼层
slzfqzh 发表于 2019-8-9 09:23
adc有个专门的地

探索者F4开发版ADC的地没有引出吧?
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-11-23
在线时间
5 小时
发表于 2019-12-10 17:34:50 | 显示全部楼层
你好,我最近在做H743的双路AD同步采集,我想问问您,有没有什么经验分享,我已经弄了十天左右了,始终找不到问题所在,看到您发的帖子,想向您请教一下,打扰了
回复

使用道具 举报

27

主题

427

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4368
金钱
4368
注册时间
2017-5-30
在线时间
579 小时
发表于 2019-12-11 09:00:48 | 显示全部楼层
巾巾 发表于 2019-12-10 17:34
你好,我最近在做H743的双路AD同步采集,我想问问您,有没有什么经验分享,我已经弄了十天左右了,始终找不 ...

armfly好像有这个例程
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-9-4
在线时间
2 小时
发表于 2019-12-11 11:29:06 | 显示全部楼层
巾巾 发表于 2019-12-10 17:34
你好,我最近在做H743的双路AD同步采集,我想问问您,有没有什么经验分享,我已经弄了十天左右了,始终找不 ...

我也要用H743 做同样的事 可以加个好友沟通
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2019-4-3
在线时间
40 小时
发表于 2019-12-24 20:10:52 | 显示全部楼层
你定义的aAD_Data[30],这个函数要这么写

HAL_ADC_Start_DMA(&ADC1_Handler, (uint32_t *)aAD_Data,30);

adcx=aAD_Data[0];
回复

使用道具 举报

0

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2013-12-31
在线时间
64 小时
发表于 2020-1-23 22:34:34 | 显示全部楼层
DMA_PDATAALIGN_WORD 应该半字吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-11 09:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表