OpenEdv-开源电子网

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

【STM32H743-ADC】正点原子的阿波罗H743-adc第一个实验代码以及开发指南是不是写错了。

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2023-6-30
在线时间
5 小时
发表于 2023-10-24 11:23:53 | 显示全部楼层 |阅读模式
5金钱

实验21-1 单通道ADC采集实验.zip

2.35 MB, 下载次数: 19

正点原子出现问题的代码

源码分析.pdf

599.54 KB, 下载次数: 9

我的源码分析

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

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2023-6-30
在线时间
5 小时
 楼主| 发表于 2023-10-24 18:22:15 | 显示全部楼层
本帖最后由 2459268395 于 2023-10-24 18:28 编辑

不知道为啥,我没看到我的问题显示出来。
问题:【H743-ADC】正点原子的阿波罗H743-adc第一个实验代码以及开发指南是不是写错了,麻烦各位大佬仔细看下我的过程,里面我将说到为什么我会说它会写错,也说到了我对源码的分析,我实在想不明白我哪里错了,我所有3金钱。。。。麻烦各位了!!!!
g_adc_handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; /* 2 分频,ADCCLK=PER_CK/2=64/2=32MHZ */
在这段代码是stm32H743开发指南中ADC的第一个实验,对此它的解释如下:

-----------------------------------------------------------------------------------------------------------------------------------

该寄存器本章只需要用到 PRESC[3:0]这四个位,用于设置 ADC 时钟的预分频系数(即对adc_ker_ck的分频系数),由上图可以得到这四个位域的值的含义可以表示为设置2^PRESC[3:0]分频。
adc_ker_ck 的时钟源由 RCC_D3CCIPR 寄存器的 ADCSEL[1:0]位配置。
本章的实验我们都设置 ADCSEL[1:0]=2,即选择 per_ck 作为时钟源,而 per_ck 又由 RCC_D1CCIPR 寄存器的CKPERSEL[1:0]位选择,默认为 0,即选择 hsi_ker_ck(64MHz)作为 per_ck。
因此:adc_ker_ck=per_ck=hsi_ker_ck=64MHz。又由于 ADC 的输入时钟频率不能大于 36M,所以,我们需要设置 PRESC[3:0]=1,即可得到 ADC 输入时钟频率为:adc_ker_ck/2^PRESC[3:0]=64/2=32MHz。
-------------------------------------------------------------------------------------------------------------------------------------
它的解释没有错,将per_ck作为时钟源,而又将hsi_ker_ck作为per_ck,而又因为设置的hsi=64MHZ,所以二分频。
可是在正点原子的HAL库讲解中说到:你要将per_ck作为时钟源的话,就要使用异步时钟模式,也就是将CKMODE[1:0]设置为00,如下如所示

那么问题来了:
正点原子设置ADC时钟的代码是:g_adc_handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; /* 2 分频,ADCCLK=PER_CK/2=64/2=32MHZ */
也就是使用同步模式,并设置为二分频。
这样的话不就和解释相矛盾了吗?正确来说不应该是:g_adc_handle.Init.ClockPrescaler=ADC_CLOCK_ASYNC_DIV2,也就是使用异步时钟模式并二分频吗,只有使用了异步模式才能进一步选择adc的时钟源吧。
并且我在查看”g_adc_handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;“源码中,发现这个语句就是单纯的设置同步异步模式以及分频。并没有涉及到h743开发指南里面的设置per_ck作为adc的时钟源,然后hsi_ker_ck又作为per_ck。我不知道是不是我分析错了,有关源码的分析,我放在了附件里。
最后,最为神奇的是,我这样设置:g_adc_handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_PCLK_DIV2;adc采集不出来数据,采集为0,只有设置成正点原子的g_adc_handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; 才采集出来数据,是不是很神奇,然后我看了下正点原子的adc的代码,里面除了上面的设置,也没有涉及到adc时钟源的设置了,我不明白它哪里设置了时钟源为per_ck以及hsi_ker_ck作为per_ck.

有没有大佬帮忙解释一下,已经困惑了我好几天,我看正点原子的视频里面提到的也只是f103的例程,并没有涉及到h743。
附件有我的源码分析以及正点原子的源码,麻烦各位大佬了!
阿波罗STM32H743开发指南:589页,代码分析598页。
回复

使用道具 举报

9

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2019-12-6
在线时间
149 小时
发表于 2024-1-11 13:11:48 | 显示全部楼层
2459268395 发表于 2023-10-24 18:22
不知道为啥,我没看到我的问题显示出来。
问题:【H743-ADC】正点原子的阿波罗H743-adc第一个实验代码以及 ...

你好,这个问题我也遇到了,我也咨询了正点原子技术支持,确实是他们写错了,时钟应该使用异步的时钟,使用同步的时钟,无论怎么分频,都不可能得到36M的ADC时钟,你把他改成异步时钟2分频就行了(hsi=64m,二分频=32M,满足ADC时钟要求)
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 23:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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