硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1032|回复: 4
收起左侧

[ADC] 按照ADC+DMA的多通道采集例子配置ADC后选择PLL时钟分频后ADC不干活!

[复制链接]

4

主题

10

回帖

22

积分

新手上路

积分
22
发表于 2022-6-21 19:25:25 | 显示全部楼层 |阅读模式
adc3Handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; // 可以工作, DMA中断可以进入
改成 adc3Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4;     // 不工作,采集不到数据,

配置PLL时钟的代码
/* 配置PLL2时钟为的72MHz,方便分频产生ADC最高时钟36MHz */
    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
    PeriphClkInitStruct.PLL2.PLL2M = 25;
    PeriphClkInitStruct.PLL2.PLL2N = 504;
    PeriphClkInitStruct.PLL2.PLL2P = 7;
    PeriphClkInitStruct.PLL2.PLL2Q = 7;
    PeriphClkInitStruct.PLL2.PLL2R = 7;
    PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_0;
    PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
    PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
    PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);

ADC的配置代码:
    adc3Handle.Instance = ADC3;
    // adc3Handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; // 4分频,ADCCLK=PER_CK/4=64/4=16MHZ
    adc3Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4; //
    adc3Handle.Init.Resolution = ADC_RESOLUTION_16B;       // 16位模式
    adc3Handle.Init.ScanConvMode = ADC_SCAN_ENABLE;        //非扫描模式
    adc3Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;    //关闭EOC中断
    adc3Handle.Init.LowPowerAutoWait = DISABLE;            //自动低功耗关闭
    // adc3Handle.Init.ContinuousConvMode = DISABLE;       //关闭连续转换, 采用定时器触发转换
    adc3Handle.Init.ContinuousConvMode = ENABLE;
    adc3Handle.Init.NbrOfConversion = 7;             // 1个转换在规则序列中 也就是只转换规则序列1
    adc3Handle.Init.DiscontinuousConvMode = DISABLE; //禁止不连续采样模式
    // adc3Handle.Init.DiscontinuousConvMode = ENABLE;
    // adc3Handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_CC2;          //定时器1的CC1触发
    adc3Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;                //采用软件触发
    adc3Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; //上升沿触发
    // adc3Handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
    adc3Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR; // DMA循环模式接收ADC转换的数据
    adc3Handle.Init.BoostMode = DISABLE;                                        // ADC时钟未超过20MHz, 不使能boost
    adc3Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;                         //有新的数据直接覆盖掉旧数据
    adc3Handle.Init.OversamplingMode = DISABLE;                                 //过采样关闭







回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107643
QQ
发表于 2022-6-22 00:57:50 | 显示全部楼层
直接复制粘贴,测试下原始例子看看是否正常。
回复

使用道具 举报

4

主题

10

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2022-6-22 11:21:36 | 显示全部楼层
我是摘抄了片段,因为项目有点大, 我怀疑是不是配置系统时钟没有配 PLL2呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107643
QQ
发表于 2022-6-23 09:46:41 | 显示全部楼层
xj_solid 发表于 2022-6-22 11:21
我是摘抄了片段,因为项目有点大, 我怀疑是不是配置系统时钟没有配 PLL2呢?

这种的,只要你不是太高的时钟,都可以正常运行的。
回复

使用道具 举报

4

主题

10

回帖

22

积分

新手上路

积分
22
 楼主| 发表于 2022-6-23 12:20:54 | 显示全部楼层
搞定了 原来时初始化顺序有问题, 我先初始化ADC然后才初始化的时钟,调整顺序后就好了.哈哈
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-10 04:16 , Processed in 0.236595 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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