嵌入式学习笔记 - HAL_ADC_ConfigChannel函数解析

发布于:2025-05-14 ⋅ 阅读:(9) ⋅ 点赞:(0)

贴函数原型:

一 首先配置规则通道序列

其实所有的配置函数都是在对寄存器进行操作,要想看懂Hal库底层函数驱动就先把寄存器如何配置看懂,以下是配置规则通道寄存器的介绍,以ADC_SQR3为例,也就是通道序列1到序列6,可以看出每5位代表一个通道号,依次排列,

再看函数是怎么操作的来实现对这些寄存器位进行填充,如下图:

其中MODIFY_REG(REG, CLEARMASK, SETMASK)的作用是先对寄存器REG中CLEARMASK代表的所有位清零,再用SETMASK对SETMASK代表的位置1,如下图所示,这也是对寄存器某几个位赋值的常用方式,先与非掩码清零相应位,再或上实际设定值。

再看 ADC_SQR3_RK(ADC_SQR3_SQ1, sConfig->Rank)的作用,如下图

也就是ADC_SQR3_SQ1 左移(ADC_SQR3_SQ2_Pos * ((_RANKNB_) - 1)) 位,也就是左移ADC_SQR3_SQ2_Pos *(sConfig->Rank-1)位

其中ADC_SQR3_SQ1 最终结果为0x0000001F,也就是每个通道所占寄存器的掩码值

其中ADC_SQR3_SQ2_Pos,HAL库定义为 #define ADC_SQR3_SQ2_Pos   =  (5U)     ,也就是每个通道所占寄存器位数5位,所以最终ADC_SQR3_RK(ADC_SQR3_SQ1, sConfig->Rank)的作用也就是 ADC_SQR3_SQ1左移ADC_SQR3_SQ2_Pos *(sConfig->Rank-1)位,也就是如果是配置第sConfig->Rank=6个序列就左移5*(6-1)=25位,就是得出相应序列的寄存器位的掩码,例如第6个序列寄存器位的掩码就是0x3E000000。

最后看ADC_SQR3_RK(sConfig->Channel, sConfig->Rank) ),与上面同一个函数同样的的道理就是sConfig->Channel左移ADC_SQR3_SQ2_Pos *(sConfig->Rank-1)位,sConfig->Channel为实际通道值如通道0x01,那么sConfig->Channel=0x01,也就是如果是配置第sConfig->Rank=6个序列就左移5*(6-1)=25位,就是将0x01左移25位,最终就是得出相应序列寄存器位的实际数值,

就是0x02000000。

最终再来看MODIFY_REG(),就是先与非掩码值,将相应序列的寄存器位置清零,再或上通道实际数值,将相应序列的寄存器位赋值为通道数,其实最终结果就是将通道数赋值给相应的序列寄存器位

从中也可以看出ADC的通道是一个通道一个通道进行配置的,如果有多个通道就需要多次配置,如下是一个通道的配置过程。

二 其次配置采样时间给相应的通道

函数如下,同样可以按照上述方式进行分析,对寄存器赋值的方式是一样的

三 如果通道16或者17被选择,置位CR2寄存器23位

只不过需要注意,HAl库对寄存器位的表示方式,以通道数为例,通道数是5位的,那么hal库就是一位一位的按照bit位表示以及赋值的,


网站公告

今日签到

点亮在社区的每一天
去签到