野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11013|回复: 3

【F1-ADC】STM32 ADC 库函数概览+疑惑:JOFR到底是用来干嘛的

[复制链接]
发表于 2015-10-2 19:29:48 | 显示全部楼层 |阅读模式
STM32F1 系列的ADC 库函数如下,也不是很多,一个上午就可以看完。
  1. void ADC_DeInit(ADC_TypeDef* ADCx);
  2. void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
  3. void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);
  4. void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  5. void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  6. void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);
  7. void ADC_ResetCalibration(ADC_TypeDef* ADCx);
  8. FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
  9. void ADC_StartCalibration(ADC_TypeDef* ADCx);
  10. FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
  11. void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  12. FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);
  13. void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);
  14. void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  15. void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
  16. void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  17. uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
  18. uint32_t ADC_GetDualModeConversionValue(void);
  19. void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  20. void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  21. void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv);
  22. void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  23. void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
  24. FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);
  25. void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
  26. void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length);
  27. void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset);
  28. uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel);
  29. void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
  30. void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
  31. void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
  32. void ADC_TempSensorVrefintCmd(FunctionalState NewState);
  33. FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
  34. void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
  35. ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);
  36. void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);
复制代码

每一个库函数我都看了下,也对着手册的寄存器看过库的底层,总体上都可以理解,没有什么大问题,


但是有个:设置注入通道转换偏移值这个函数不知道用来干嘛,对应的寄存器是:ADC注入通道数据偏移寄存器x (ADC_JOFRx)(x=1..4)
函数原型如下:
  1. /**
  2.   * @brief  Set the injected channels conversion value offset
  3.   * @param  ADCx: where x can be 1, 2 or 3 to select the ADC peripheral.
  4.   * @param  ADC_InjectedChannel: the ADC injected channel to set its offset.
  5.   *   This parameter can be one of the following values:
  6.   *     @arg ADC_InjectedChannel_1: Injected Channel1 selected
  7.   *     @arg ADC_InjectedChannel_2: Injected Channel2 selected
  8.   *     @arg ADC_InjectedChannel_3: Injected Channel3 selected
  9.   *     @arg ADC_InjectedChannel_4: Injected Channel4 selected
  10.   * @param  Offset: the offset value for the selected ADC injected channel
  11.   *   This parameter must be a 12bit value.
  12.   * @retval None
  13.   */
  14. void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset)
  15. {
  16.   __IO uint32_t tmp = 0;
  17.   
  18.   /* Check the parameters */
  19.   assert_param(IS_ADC_ALL_PERIPH(ADCx));
  20.   assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel));
  21.   assert_param(IS_ADC_OFFSET(Offset));  
  22.   
  23.   tmp = (uint32_t)ADCx;
  24.   tmp += ADC_InjectedChannel;
  25.   
  26.   /* Set the selected injected channel data offset */
  27.   *(__IO uint32_t *) tmp = (uint32_t)Offset;
  28. }
复制代码
在手册中:JOFR这个寄存器的描述是:当转换注入通道时,这些位定义了用于从原始转换数据中减去的数值。转换的结果可以在
ADC_JDRx寄存器中读出。我们可以知道,注入通道的转换结果是直接从JDR寄存器读取的,JOFR里面的值并没有影响到转换结果,
那么JOFR寄存器设置的偏移值到底用在什么场合? 暂时做个笔记备注下。


至于注入通道的转换值有没有被JOFR寄存器里面设置的值影响到,我们可以从下面这个库函数里面了解:
  1. uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel)
  2. {
  3.   __IO uint32_t tmp = 0;
  4.   
  5.   /* Check the parameters */
  6.   assert_param(IS_ADC_ALL_PERIPH(ADCx));
  7.   assert_param(IS_ADC_INJECTED_CHANNEL(ADC_InjectedChannel));

  8.   tmp = (uint32_t)ADCx;
  9.   tmp += ADC_InjectedChannel + JDR_Offset;
  10.   
  11.   /* Returns the selected injected channel conversion data value */
  12.   return (uint16_t) (*(__IO uint32_t*)  tmp);   
  13. }
复制代码
ADC注入通道数据偏移寄存器JOFR的偏移是:0X14~0X20,对应着四个注入通道,分别是:
  1. #define ADC_InjectedChannel_1                       ((uint8_t)0x14)
  2. #define ADC_InjectedChannel_2                       ((uint8_t)0x18)
  3. #define ADC_InjectedChannel_3                       ((uint8_t)0x1C)
  4. #define ADC_InjectedChannel_4                       ((uint8_t)0x20)
复制代码
ADC 注入数据寄存器JDR的地址偏移是:0X3C~0X48,注入通道转换的值就存在这个寄存器当中。
在:返回注入通道转换值的库函数:uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel)
有如下代码:
  1.   tmp = (uint32_t)ADCx;
  2.   tmp += ADC_InjectedChannel + JDR_Offset;
  3.   
  4.   /* Returns the selected injected channel conversion data value */
  5.   return (uint16_t) (*(__IO uint32_t*)  tmp);  
复制代码
其他JDR_Offset是一个宏,定义为:0x28,0X28其实就是JDR和JOFR这两个寄存器地址偏移的差值,
JDR的地址偏移为:0X3C~0X48,JOFR的地址偏移为:0X14~0X20,(0X3C~0X48)-(0X14~0X20)= 0X28。


最后返回的也就是JDR寄存器里面的值,即:(ADCx+0X3C~0X48),也就是注入通道转换的值。所以,JOFR,你到底是干什么的?




回复

使用道具 举报

 楼主| 发表于 2015-12-16 09:58:59 | 显示全部楼层
消灭0回复                 
回复 支持 反对

使用道具 举报

发表于 2016-10-13 10:05:05 | 显示全部楼层
围观围观围观围观围观围观围观围观围观围观围观
回复 支持 反对

使用道具 举报

发表于 2017-2-25 18:05:55 | 显示全部楼层
支持支持:):)支持支持:):):):):):):):):):):)
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-20 21:35 , Processed in 0.030190 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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