STM32配置ADC时钟分频因子问题小结

引言

这两天在研究32的G4系列,在使用HAL库配置ADC的时候,发现初始化ADC结构体的时钟分频成员变量时可供选择的宏有点奇怪(和以前见过的不太一样),特此写篇博客记录一下。

问题描述

ADC初始化代码比较简单,就不全部贴上来了,就介绍一下时钟分频的成员变量初始化了。

ADC_HandleTypeDef ADC_HandleTypeStr;

HAL_StatusTypeDef My_Adc_Init(uint8_t num_ch){
	ADC_HandleTypeStr.Instance = ADC1;
	ADC_HandleTypeStr.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV8;
	...
}

就按照经验准备初始化ADC1的通道3,在设置ADC的时钟分频因子的时候发现我输入ADC_C之后Keil5的自动补全功能跳出了上面的这个宏定义,选择分频为8之后敲回车,Keil5报警告,说该宏没有定义,编译一下直接报错了:
在这里插入图片描述
转到声明处之后发现G431这款单片机的HAL库仅有1、2、4三种分频选择,下面两种没有定义(32其他型号我没去了解过),所以会报错。
在这里插入图片描述
本来想着也就选个1、2、4之间的一个分频因子走人了,再次转到声明发现除去这三个分频选择之外,好像还可以选择其他选项:
在这里插入图片描述
如上所示,刚刚说到的1、2、4分频因子好像都是属于同步分频因子,但是下面还有一群好像属于异步分频因子什么的,顿时懵了,这还有同步异步的差别?

解惑

点进HAL_ADC_Init函数体内部寻找时钟分频因子使用的地方如下:
在这里插入图片描述
MODIFY_REG大家应该都很熟了,上面黑色的框是操作的寄存器,黄框是需要修改的寄存器位,最后红框内是给进的分频因子的值。所以打开32G4参考手册找到这个寄存器的对应位:
在这里插入图片描述
在这里插入图片描述
结合HAL库中宏的值对应着看这个寄存器的配置,具体的就不多说了,手册上说的很详细,位21:18这4位是用来配置异步分频因子的,此时CKMODE位(位17:16)必须为00。而刚刚说的1、2、4分频因子配置只需要配置CKMODE即可,不需要管21:18,默认即可。

说了那么多,那么到底什么是异步,什么是同步呢,回到ADC的框图:
在这里插入图片描述
这边确实有两个时钟源,那么这个和同步异步什么关系呢?接着向下看:
在这里插入图片描述
在这里插入图片描述
看到这里,基本上也就明了了,通过对AHB总线的时钟信号进行分频得到的时钟即为同步时钟,直接对系统时钟进行分频得到ADC时钟即为异步时钟。至于为什么前者是同步,后者是异步,我找了一些资料,有一位博主解释说:“众多外设都是连接在AHB、APB总线上的,比如说用TIM来触发ADC,二者都是在一个总线上的时候即为同步,但是如若ADC接到了系统时钟上,此时我们需要做时钟同步工作,为整个系统增大工程量的同时也减小了稳定性。这一点和手册上描述一致:
在这里插入图片描述

那么异步的优点呢?首先一点分频选择更多,这是看得到的,其次按照手册上说明,系统时钟的主频相对于APB等频率是要高的,最差也是相等,那么我们可以获得更高的采样频率(当然不能超过上限)。

结语

说了那么多,也算是搞明白ADC的时钟来源与分频了,可见M4乃至M7所设计单片机相较于M3不仅仅在外设上丰富了,同时对于外设的配置也更加精细化、可靠化。

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值