贴函数原型:
一 首先配置规则通道序列
其实所有的配置函数都是在对寄存器进行操作,要想看懂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位表示以及赋值的,