eric2013 发表于 2020-4-9 09:45:32

终于明白了H7的BGA封装芯片上带的PA0_C, PA1_C, PC2_C和PC3_C真正作用,可以实现ADC最高速度

之前一直认为几个引脚是方便接线用的,从PA0或者PA0_C也可以。

今天细细看了下H7的最新版数据手册V7.0的ADC部分,原来是给所谓的直接访问通道Direct channels准备的:


ADC通道分为了三类,直接访问通道,快速通道和慢速通道:





其中这个直接访问通道要使用PA0_C, PA1_C, PC2_C 和 PC3_C引脚





ps:特别注意,仅PA0_C, PA1_C, PC2_C 和 PC3_C引脚可以用于直接模式:

wdliming 发表于 2020-4-9 10:19:31

好专业啊!!!

wow1919 发表于 2020-4-9 16:44:07

仔细看了一下,但是不知道该怎样使用这个PA0_C功能,比如说怎样配置GPIO,怎样选择ADC的通道才能使用这个直连通道模式,还请楼主帮忙看看该怎样使用,谢谢

eric2013 发表于 2020-4-9 16:49:37

wow1919 发表于 2020-4-9 16:44
仔细看了一下,但是不知道该怎样使用这个PA0_C功能,比如说怎样配置GPIO,怎样选择ADC的通道才能使用这个直 ...

HAL库有API。

eric2013 发表于 2020-4-9 16:54:26

wow1919 发表于 2020-4-9 16:44
仔细看了一下,但是不知道该怎样使用这个PA0_C功能,比如说怎样配置GPIO,怎样选择ADC的通道才能使用这个直 ...

/**
* @briefAnalog Switch control for dual analog pads.
* @paramSYSCFG_AnalogSwitch: Selects the analog pad
*   This parameter can be one or a combination of the following values:
*   @arg SYSCFG_SWITCH_PA0 : Select PA0 analog switch
*   @arg SYSCFG_SWITCH_PA1:Select PA1 analog switch
*   @arg SYSCFG_SWITCH_PC2 : Select PC2 analog switch
*   @arg SYSCFG_SWITCH_PC3:Select PC3 analog switch
* @paramSYSCFG_SwitchState: Open or Close the analog switch between dual pads (PXn and PXn_C)
*   This parameter can be one or a combination of the following values:
*   @arg SYSCFG_SWITCH_PA0_OPEN
*   @arg SYSCFG_SWITCH_PA0_CLOSE
*   @arg SYSCFG_SWITCH_PA1_OPEN
*   @arg SYSCFG_SWITCH_PA1_CLOSE
*   @arg SYSCFG_SWITCH_PC2_OPEN
*   @arg SYSCFG_SWITCH_PC2_CLOSE
*   @arg SYSCFG_SWITCH_PC3_OPEN
*   @arg SYSCFG_SWITCH_PC3_CLOSE
* @retval None
*/

void HAL_SYSCFG_AnalogSwitchConfig(uint32_t SYSCFG_AnalogSwitch , uint32_t SYSCFG_SwitchState )
{
/* Check the parameter */
assert_param(IS_SYSCFG_ANALOG_SWITCH(SYSCFG_AnalogSwitch));
assert_param(IS_SYSCFG_SWITCH_STATE(SYSCFG_SwitchState));

MODIFY_REG(SYSCFG->PMCR, (uint32_t) SYSCFG_AnalogSwitch, (uint32_t)(SYSCFG_SwitchState));
}

wow1919 发表于 2020-4-9 17:07:54

eric2013 发表于 2020-4-9 16:54


我的意思是在ADC哪里看不到使用这个直连模式的选项,比如说PA0_C,我想使用PA0管脚实现直连模式(最快ADC采样速度),是不是我需要选择SYSCFG_SWITCH_PA0_CLOSE,完后再使用ADC的ADC12_INN1, ADC12_INP0通道就行了?

eric2013 发表于 2020-4-9 17:15:15

wow1919 发表于 2020-4-9 17:07
我的意思是在ADC哪里看不到使用这个直连模式的选项,比如说PA0_C,我想使用PA0管脚实现直连模式(最快ADC ...
用不了,楼主位那个框图太简单,容易误导大家,根据数据手册的说明仅仅那个PAn_C引脚可以使用

wow1919 发表于 2020-4-9 17:26:17

eric2013 发表于 2020-4-9 17:15
用不了,楼主位那个框图太简单,容易误导大家,根据数据手册的说明仅仅那个PAn_C引脚可以使用

如果不能使用PA0,PA1,PC2和PC3这样的管脚用于直连模式的话,想不明白他为啥要加一个模拟开关用于连接PA0和PA0_C,要不就是为了PA0_C能够使用PA0的IO功能才设置的这个模拟开关?

eric2013 发表于 2020-4-9 17:28:29

wow1919 发表于 2020-4-9 17:26
如果不能使用PA0,PA1,PC2和PC3这样的管脚用于直连模式的话,想不明白他为啥要加一个模拟开关用于连接PA ...
这个就不清楚了,咨询ST吧:
https://community.st.com/s/

ST就爱搞这种骚操作。
ps:有可能就是导通PAn用的,如果不导通,这个开关真是没啥用了。

wow1919 发表于 2020-4-9 17:29:15

eric2013 发表于 2020-4-9 17:28
这个就不清楚了,咨询ST吧:
https://community.st.com/s/



好的,谢谢。:handshake

wow1919 发表于 2020-4-9 18:18:47

eric2013 发表于 2020-4-9 17:28
这个就不清楚了,咨询ST吧:
https://community.st.com/s/



看了一个文章,这个模拟开关的功能可能是为了让Pxy管脚通过Pxy_C管脚,从慢速通道变为快速通道,他这个PA0, PA1, PC2和PC3连接的都是ADC的慢速通道,此时如果将Pxy和Pxy_C之间的模拟开关闭合的话,PA0, PA1, PC2和PC3就可以变为快速通道使用,这个直连通道和快速通道之间就是差了一个模拟开关的阻抗。

eric2013 发表于 2020-4-9 18:23:38

wow1919 发表于 2020-4-9 18:18
看了一个文章,这个模拟开关的功能可能是为了让Pxy管脚通过Pxy_C管脚,从慢速通道变为快速通道,他这个PA ...
是的,就是我在楼上补充的说明,方便没有PAn_C引脚的芯片使用。

从这个图来看,基本印证了,那个直接通道仅支持PXn_C

a65268193 发表于 2020-10-25 16:20:19

那是不是意味着 STM32H7 的PC3_C只能用于ADC, 比如其他的做IO输出是不行的了?

初晴sama 发表于 2020-10-25 22:23:18

a65268193 发表于 2020-10-25 16:20
那是不是意味着 STM32H7 的PC3_C只能用于ADC, 比如其他的做IO输出是不行的了?

只能配置成adc其他都配置不了,可以看cubemx里面

samge 发表于 2022-4-11 22:26:23

PC2_C、PC3_C不能复用为SPI2吗

eric2013 发表于 2022-4-12 00:15:37

samge 发表于 2022-4-11 22:26
PC2_C、PC3_C不能复用为SPI2吗

可以做,注意ADC稳压基准,这几个引脚受ADC稳压决定幅值。

elecpioneer 发表于 2023-9-11 20:25:25

eric2013 发表于 2022-4-12 00:15
可以做,注意ADC稳压基准,这几个引脚受ADC稳压决定幅值。

坛主您好,我现在用H750VB,用了PC2_C和PC3_C作SPI接口,目前出现的问题就是波形不对,低电平才2.7V。我目前VREF+是没接任何电源的,悬空的,请问可能和这个有关吗?谢谢。

eric2013 发表于 2023-9-12 07:23:01

elecpioneer 发表于 2023-9-11 20:25
坛主您好,我现在用H750VB,用了PC2_C和PC3_C作SPI接口,目前出现的问题就是波形不对,低电平才2.7V。我 ...

必须要接上,他们的电平是受到VREF+控制的。

elecpioneer 发表于 2023-9-12 09:45:38

eric2013 发表于 2023-9-12 07:23
必须要接上,他们的电平是受到VREF+控制的。

好的,谢谢!

庄永 发表于 2023-9-12 10:46:33

硬汉看的好深呀这个手册

szjdb 发表于 2024-1-1 20:16:21

硬汉哥和众神们新年好!
我也有个PA0_C /PC2_C 问题请教下。 我计划使用两路带直接通道的ADC 同时采样两路信号。 目前只有能接到内部ADC1/2的 PA0_C/PA1_C和 接到ADC3的PC2_C/PC3_C能使用。 但是参考手册介绍只有ADC1/2能在双ADC模式工作。没有介绍如何使用ADC1/ADC3同步工作。 因为采样的信号达到1Mhz,且对相位敏感, 希望ADC1/ADC3能够向ADC1/2一样能够在常规同时模式下准确同步。不知道硬汉哥和众神能不能给点建议?

另外,如果不能让ADC1/ADC3同步工作,我单独使用PA0_C/PA1_C作为ADC1/2单端输入,工作在DUAL模式,是否可行?

最后,用MX试了下,PA0_C/PA1_C和 PC2_C/PC3_C这几个脚好像没有专门的IO配置代码,比如模式等,是不是仅仅配置与标准PA0/PA1和 PC2/PC3 的开关通断即可?

多谢!

eric2013 发表于 2024-1-3 08:16:08

szjdb 发表于 2024-1-1 20:16
硬汉哥和众神们新年好!
我也有个PA0_C /PC2_C 问题请教下。 我计划使用两路带直接通道的ADC 同时采样两路 ...

1、使用同一个定时器的不同CC通道触发控制。
2、双ADC快速交替采样就是用的同一个引脚。
3、有个API的,如果你选择的是带后缀C的,是会生成相应设置API的。

szjdb 发表于 2024-1-3 21:04:16

多谢硬汉哥!
用定时器触发,那么采样频率就是定时器频率了吧。数据也是用两个DMA读回来吧。我试试看。

eric2013 发表于 2024-1-4 08:58:06

szjdb 发表于 2024-1-3 21:04
多谢硬汉哥!
用定时器触发,那么采样频率就是定时器频率了吧。数据也是用两个DMA读回来吧。我试试看。

对,是这样的。

szjdb 发表于 2024-1-5 19:27:55

多谢硬汉哥!再请教一个问题,ADC的DMA可不可以使用MDMA? 我想把数据直接放进DTCM,

szjdb 发表于 2024-1-5 20:38:43

查了下,好像不能直接支持,但是有说能与普通DMA协同工作,还支持 MDMA_REQUEST_DMA1_Stream0_TC等,就不知道具体的流程了。还望多指导!

eric2013 发表于 2024-1-6 09:25:06

szjdb 发表于 2024-1-5 19:27
多谢硬汉哥!再请教一个问题,ADC的DMA可不可以使用MDMA? 我想把数据直接放进DTCM,

不可以。

eric2013 发表于 2024-1-6 09:26:15

szjdb 发表于 2024-1-5 20:38
查了下,好像不能直接支持,但是有说能与普通DMA协同工作,还支持 MDMA_REQUEST_DMA1_Stream0_TC等,就不 ...

这个没什么用,这种操作无需研究,ADC那点速度,普通的AXI SARM处理绰绰有余。

szjdb 发表于 2024-1-8 20:59:10

多谢硬汉哥, 想法是尽量利用H7的优势资源,缩小这块的处理时间。另外,在ST 双ADC模式例子里面开了ADC和DMA中断,且ADC中断基本较高。我实际跟踪了下,只有DMA中断会触发,ADC中断是不会进入的。不知道这两个中断中为何ADC优先级要设置高一些?我移植过来后,采集音频,滤波处理后通过SAI DMA到音频编码器播放,居然SAI DMA无法启动,SAI DMA是在ADC DMA中断中启动的,优先级比ADC DMA低。 不知道这种多条高速DMA情况下,是不是优先级有什么讲究? 先谢过了!!!
   /* NVIC configuration for DMA interrupt (transfer completion or error) */
    /* Priority: high-priority */
    HAL_NVIC_SetPriority(ADCx_DMA_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(ADCx_DMA_IRQn);

/* NVIC configuration for ADC interrupt */
/* Priority: high-priority */
HAL_NVIC_SetPriority(ADCx_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADCx_IRQn);

eric2013 发表于 2024-1-9 08:56:47

szjdb 发表于 2024-1-8 20:59
多谢硬汉哥, 想法是尽量利用H7的优势资源,缩小这块的处理时间。另外,在ST 双ADC模式例子里面开了ADC和DM ...

这个应该是你的处理还有问题,早期我在F1上还测试过这种方式的玩法,ADC+DMA采集,然后DAC+DMA输出音频。

szjdb 发表于 2024-1-9 10:10:33

再次感谢硬汉哥,我再找找问题! {:33:}

szjdb 发表于 2024-1-12 16:10:17

再打扰下硬汉哥。 按照您建议,这两天在测试ADC1/3使用LPTIM同步触发模式。为了能设置标准音频采样频率,并且减小TIMER和ADC之间不同步问题,选择两者时钟来源于PLL2P, 设置为49.152Mhz. DMA传输长度为256半字。目前LPTIM输出能测到准确的时钟分频,但ADC触发的DMA 频率和ADC传输完成中断频率跟LPTIM的触发频率完全对不上,而且改变LPTIM频率,DMA频率还不变,固定为25Khz. 推算出ADC频率也是固定不变,不受LPTIM控制。 关键驱动代码如下:
ADC部分:
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc1.Init.Resolution = ADC_RESOLUTION_16B;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_LPTIM1_OUT;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;

LPTIM部分:
hlptim1.Instance = LPTIM1;
hlptim1.Init.Clock.Source = LPTIM_CLOCKSOURCE_APBCLOCK_LPOSC;
hlptim1.Init.Clock.Prescaler = LPTIM_PRESCALER_DIV1;
hlptim1.Init.UltraLowPowerClock.Polarity = LPTIM_CLOCKPOLARITY_RISING;
hlptim1.Init.UltraLowPowerClock.SampleTime = LPTIM_CLOCKSAMPLETIME_DIRECTTRANSITION;
hlptim1.Init.Trigger.Source = LPTIM_TRIGSOURCE_SOFTWARE;
hlptim1.Init.OutputPolarity = LPTIM_OUTPUTPOLARITY_HIGH;
hlptim1.Init.UpdateMode = LPTIM_UPDATE_IMMEDIATE;
hlptim1.Init.CounterSource = LPTIM_COUNTERSOURCE_INTERNAL;//LPTIM_COUNTERSOURCE_EXTERNAL;
hlptim1.Init.Input1Source = LPTIM_INPUT1SOURCE_GPIO;
hlptim1.Init.Input2Source = LPTIM_INPUT2SOURCE_GPIO;

也验证过如果不启动LPTIM, ADC DMA是不会启动的,说明ADC的确是LPTIM触发的。 难道说LPTIM触发不能控制ADC采样频率吗?

还望硬汉哥和众高手多多指教! 先谢过了!

eric2013 发表于 2024-1-13 08:01:41

szjdb 发表于 2024-1-12 16:10
再打扰下硬汉哥。 按照您建议,这两天在测试ADC1/3使用LPTIM同步触发模式。为了能设置标准音频采样频率,并 ...

把连续转换关闭了
hadc1.Init.ContinuousConvMode = ENABLE;

szjdb 发表于 2024-1-13 16:51:00


多谢硬汉哥! 改了果然可以了。向您学习!{:33:}

szjdb 发表于 2024-1-22 20:35:10

向硬汉哥及兄弟们汇报下,最终发现无法将ADC1/3同步起来,按相同采样率工作,BDMA回来的ADC3数据始终是乱的。还是得老实用回ADC1/2.多谢硬汉哥指导!

szjdb 发表于 2024-1-26 17:02:35

硬汉哥和众兄弟们好!
今天详细看硬汉哥推荐的ADC详细文档,dm00628458-getting-started-with-the-stm32h7-series-mcu-16bit-adc-stmicroelectronics , 发现ST给出了3个ADC tripple 模式的数据,如下图,说明3ADC 是可以很好同步的。 我开始怀疑上次测试ADC1 和ADC3同步是不是代码或是使用方法错误。上次观察到的现象是ADC1/3输入同样的正弦波信号,ADC3与ADC1相位在变化,正常应该固定不变。
1. 上次使用了LPTIM1_OUT去触发ADC1/3 , 同一个信号,不知道是不是不行。
2. 次使用了 DMA1的两个不同通道分别对应ADC1/3, 不知道是不是因为DMA通道竞争冲突导致两个通道相位不确定。
3. 因为两个DMA不可能同时中断,为了得到同步数据,我在其中一个DMA中断中设置标志,另一个DMA中断等待这个标志有效,才将两个DMA数据进行处理比较。这里逻辑应该没错吧。
4. 不知道ST官方有没有TRIPPLE 模式的例程放出来?

打搅了,先谢过。

eric2013 发表于 2024-1-27 09:13:18

szjdb 发表于 2024-1-26 17:02
硬汉哥和众兄弟们好!
今天详细看硬汉哥推荐的ADC详细文档,dm00628458-getting-started-with-the-stm32h7 ...

3 ADC确实是可以的。我也还没有去测试验证。

szjdb 发表于 2024-1-27 11:38:02

多谢硬汉哥了,ADC3我用DMA1和 BDMA都试过,一样的现象,有机会帮忙试试{:33:}

叶落秋无声 发表于 2024-3-7 11:17:07

硬汉哥,我有个STM32H743XIH6板子+LAN7820网络模块,这个板子没有把PA1(ETH_REF_CLK)引脚引出来,我看了下PA1_C也可以作为ETH_REF_CLK,我直接用STM32CUBEIDE选择PA1_C作为ETH_REF_CLK脚生成的代码但是不能用,代码里的GPIO好像也只是配置了PA1而不是PA1_C的,请问怎么配置吗

叶落秋无声 发表于 2024-3-7 11:19:11

不能回复呢?
页: [1] 2
查看完整版本: 终于明白了H7的BGA封装芯片上带的PA0_C, PA1_C, PC2_C和PC3_C真正作用,可以实现ADC最高速度