硬汉嵌入式论坛

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

[ADC] STM32-H743,一段ADC设置分频代码问题

[复制链接]

2

主题

2

回帖

8

积分

新手上路

积分
8
发表于 2023-10-25 15:12:56 | 显示全部楼层 |阅读模式

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

2.35 MB, 下载次数: 2

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2023-10-25 15:40:02 | 显示全部楼层
楼主的问题只有个附件?
回复

使用道具 举报

2

主题

2

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-10-25 15:55:45 | 显示全部楼层
eric2013 发表于 2023-10-25 15:40
楼主的问题只有个附件?

不好意思,第一次发帖在里面描述了,不知道为啥,没看到我的问题显示出来。
问题:【H743-ADC】H743-adc代码是不是写错了,麻烦各位大佬仔细看下我的过程,里面我将说到为什么我会说它会写错.
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,如下如所示
C:\Users\24592\Desktop
那么问题来了:
代码中设置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。
附件有我的源码,麻烦各位大佬了!
回复

使用道具 举报

2

主题

2

回帖

8

积分

新手上路

积分
8
 楼主| 发表于 2023-10-26 08:54:55 | 显示全部楼层
我看到了有配置寄存器的设置”__HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP);            /* ADC外设时钟选择 */“,分频这段代码应该是写错了,只是为什么在设置 sys_stm32_clock_init(160, 5, 2, 4);        /* 设置时钟, 400Mhz */系统时钟为400Mhz的情况下,用ADC_CLOCK_SYNC_PCLK_DIV2;也能跑通代码呢?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 07:22 , Processed in 0.566749 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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