管理员
最后登录1970-1-1
在线时间 小时
注册时间2013-3-25
|
参考资料:《STM32中文参考手册》—— 11 模拟/数字转换(ADC)
SQR: 规则序列寄存器
JSQR: 注入序列寄存器
SQR和JSQR寄存器说明.xls
(11.5 KB, 下载次数: 29)
STM32 的ADC 在转换的时候有规则通道和注入通道,无论使用这两种模式都必须操作相对应的规则序列寄存器SQR和注入序列寄存器JSQR。
SQR有3个,分别为SQR1、SQR2、SQR3,这三个寄存器决定规则转换的顺序。
第一次转换的是SQR3寄存器的SQ1[4:0],第二次转换的是SQ2[4:0],第x次转换的是SQx[4:0],以此类推。
SQR3寄存器决定的是SQ1~SQ6,SQR2寄存器决定的是SQ7~SQ12,SRQ1寄存器决定的是SQ13~SQ16。
ADC支持最多16个通道,具体要使用多少个通道,在SQR1的L[3:0]设置。当我们设置好要使用
多少个通道之后,就面临着这些通道的转换顺序,我们先讲解SQR。这个转换顺序由SQR决定,
SQR就好像做了16个蹲位,每个蹲位按照1~16标号,标号1表示第一次转换,以此类推,标号16表示最后一次转换。
剩下的就是要转换的通道往相应的蹲位跳即可,如果是通道16(CH16)想第一次转换,那么CH16往SQ1这个蹲位跳即可,
我们只要在SQR3这个寄存器的SQ1[4:0]位设置0X10(即16)就可以了,如果第二次转换的是通道1(CH1)那么只要在SQR3寄存器的SQ2[4:0]位设置0X01即可,
而JSQR则跟SQR不一样,JSQR最多只支持4个通道,这个由JSQR的JL[2:0]决定。
JSQR跟SQR决定转换顺序的时候也不一样,第一次转换的不是JSQR1[4:0],而是JCQRx[4:0] ,x = (4-JL),更SQR刚好是反过来的。
如果JL=00(1个转换),那么转换的顺序是从JSQR4[4:0]开始,而不是从JSQR1[4:0]开始,这个要注意,编程的时候不要搞错了。
有关规则序列寄存器:SQR的库函数应用
该库函数的功能是:设定ADC某个通道的转换顺序,并设定该通道的采样时间。
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
举例:如果我们在项目中需要使用 ADC1的通道10、通道11、通道12、通道13这四个通道,那么在转换的时候就需要设置这四个通道的转换顺序,
我们设置通道13第一个转换,通道10第二个转换,通道11第三个转换,通道12第四个转换,这时候我们就需要操作SQR寄存器了,具体是怎么操作的我们可以看该库函数的底层,现在我告诉大家该库函数的使用方法,怎么样来设置通道的转换顺序。
每个通道的采样时间我们都统一设置成1.5个周期(这个周期是ADC_CLK)
通道13第一个转换:
- ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_1Cycles5);
复制代码 通道10第二个转换:
- ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_1Cycles5);
复制代码 通道11第三个转换:
- ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 3, ADC_SampleTime_1Cycles5);
复制代码 通道12第四个转换:
- ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 4, ADC_SampleTime_1Cycles5);
复制代码 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
规则通道配置函数的原型如下:
- void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)
- {
- uint32_t tmpreg1 = 0, tmpreg2 = 0;
- /* Check the parameters */
- assert_param(IS_ADC_ALL_PERIPH(ADCx));
- assert_param(IS_ADC_CHANNEL(ADC_Channel));
- assert_param(IS_ADC_REGULAR_RANK(Rank));
- assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime));
- /* if ADC_Channel_10 ... ADC_Channel_17 is selected */
- if (ADC_Channel > ADC_Channel_9)
- {
- /* Get the old register value */
- tmpreg1 = ADCx->SMPR1;
- /* Calculate the mask to clear */
- tmpreg2 = SMPR1_SMP_Set << (3 * (ADC_Channel - 10));
- /* Clear the old channel sample time */
- tmpreg1 &= ~tmpreg2;
- /* Calculate the mask to set */
- tmpreg2 = (uint32_t)ADC_SampleTime << (3 * (ADC_Channel - 10));
- /* Set the new channel sample time */
- tmpreg1 |= tmpreg2;
- /* Store the new register value */
- ADCx->SMPR1 = tmpreg1;
- }
- else /* ADC_Channel include in ADC_Channel_[0..9] */
- {
- /* Get the old register value */
- tmpreg1 = ADCx->SMPR2;
- /* Calculate the mask to clear */
- tmpreg2 = SMPR2_SMP_Set << (3 * ADC_Channel);
- /* Clear the old channel sample time */
- tmpreg1 &= ~tmpreg2;
- /* Calculate the mask to set */
- tmpreg2 = (uint32_t)ADC_SampleTime << (3 * ADC_Channel);
- /* Set the new channel sample time */
- tmpreg1 |= tmpreg2;
- /* Store the new register value */
- ADCx->SMPR2 = tmpreg1;
- }
- /* For Rank 1 to 6 */
- if (Rank < 7)
- {
- /* Get the old register value */
- tmpreg1 = ADCx->SQR3;
- /* Calculate the mask to clear */
- tmpreg2 = SQR3_SQ_Set << (5 * (Rank - 1));
- /* Clear the old SQx bits for the selected rank */
- tmpreg1 &= ~tmpreg2;
- /* Calculate the mask to set */
- tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 1));
- /* Set the SQx bits for the selected rank */
- tmpreg1 |= tmpreg2;
- /* Store the new register value */
- ADCx->SQR3 = tmpreg1;
- }
- /* For Rank 7 to 12 */
- else if (Rank < 13)
- {
- /* Get the old register value */
- tmpreg1 = ADCx->SQR2;
- /* Calculate the mask to clear */
- tmpreg2 = SQR2_SQ_Set << (5 * (Rank - 7));
- /* Clear the old SQx bits for the selected rank */
- tmpreg1 &= ~tmpreg2;
- /* Calculate the mask to set */
- tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 7));
- /* Set the SQx bits for the selected rank */
- tmpreg1 |= tmpreg2;
- /* Store the new register value */
- ADCx->SQR2 = tmpreg1;
- }
- /* For Rank 13 to 16 */
- else
- {
- /* Get the old register value */
- tmpreg1 = ADCx->SQR1;
- /* Calculate the mask to clear */
- tmpreg2 = SQR1_SQ_Set << (5 * (Rank - 13));
- /* Clear the old SQx bits for the selected rank */
- tmpreg1 &= ~tmpreg2;
- /* Calculate the mask to set */
- tmpreg2 = (uint32_t)ADC_Channel << (5 * (Rank - 13));
- /* Set the SQx bits for the selected rank */
- tmpreg1 |= tmpreg2;
- /* Store the new register value */
- ADCx->SQR1 = tmpreg1;
- }
- }
复制代码
|
|