硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3736|回复: 2
收起左侧

[HAL学习笔记] HAL库源文件stm32h7xx_hal_adc_ex.c学习笔记,主要是校准,注入通道和多ADC模式(2018-09-06 V1.0)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2018-9-6 00:14:48 | 显示全部楼层 |阅读模式
说明:
1、这个扩展文件主要是三方面的API -- ADC校准,注入通道和多ADC模式。
2、先把函数整理出来,后面用到这些功能了,再做深入整理。



用于ADC校准的几个函数

HAL_StatusTypeDef       HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc, uint32_t CalibrationMode, uint32_t SingleDiff);
uint32_t                HAL_ADCEx_Calibration_GetValue(ADC_HandleTypeDef *hadc, uint32_t SingleDiff);
HAL_StatusTypeDef       HAL_ADCEx_LinearCalibration_GetValue(ADC_HandleTypeDef* hadc, uint32_t* LinearCalib_Buffer);
HAL_StatusTypeDef       HAL_ADCEx_Calibration_SetValue(ADC_HandleTypeDef *hadc, uint32_t SingleDiff, uint32_t CalibrationFactor);
HAL_StatusTypeDef       HAL_ADCEx_LinearCalibration_SetValue(ADC_HandleTypeDef *hadc, uint32_t* LinearCalib_Buffer);


注入通道,查询模式
HAL_StatusTypeDef       HAL_ADCEx_InjectedStart(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef       HAL_ADCEx_InjectedStop(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef       HAL_ADCEx_InjectedPollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);


注入通道、中断模式
HAL_StatusTypeDef       HAL_ADCEx_InjectedStart_IT(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef       HAL_ADCEx_InjectedStop_IT(ADC_HandleTypeDef* hadc);


多ADC模式
HAL_StatusTypeDef       HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length);
HAL_StatusTypeDef       HAL_ADCEx_MultiModeStop_DMA(ADC_HandleTypeDef *hadc);
uint32_t                HAL_ADCEx_MultiModeGetValue(ADC_HandleTypeDef *hadc);


获取ADC数值
uint32_t                HAL_ADCEx_InjectedGetValue(ADC_HandleTypeDef* hadc, uint32_t InjectedRank);


回调函数
void                    HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc);
void                    HAL_ADCEx_InjectedQueueOverflowCallback(ADC_HandleTypeDef* hadc);
void                    HAL_ADCEx_LevelOutOfWindow2Callback(ADC_HandleTypeDef* hadc);
void                    HAL_ADCEx_LevelOutOfWindow3Callback(ADC_HandleTypeDef* hadc);
void                    HAL_ADCEx_EndOfSamplingCallback(ADC_HandleTypeDef* hadc);


注入通道停止转换
HAL_StatusTypeDef HAL_ADCEx_RegularStop(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADCEx_RegularStop_IT(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADCEx_RegularStop_DMA(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADCEx_RegularMultiModeStop_DMA(ADC_HandleTypeDef* hadc);


控制函数
HAL_StatusTypeDef       HAL_ADCEx_InjectedConfigChannel(ADC_HandleTypeDef* hadc,ADC_InjectionConfTypeDef* sConfigInjected);
HAL_StatusTypeDef       HAL_ADCEx_MultiModeConfigChannel(ADC_HandleTypeDef *hadc, ADC_MultiModeTypeDef *multimode);
HAL_StatusTypeDef       HAL_ADCEx_EnableInjectedQueue(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef       HAL_ADCEx_DisableInjectedQueue(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef       HAL_ADCEx_DisableVoltageRegulator(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef       HAL_ADCEx_EnterADCDeepPowerDownMode(ADC_HandleTypeDef* hadc);



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2018-9-6 00:16:32 | 显示全部楼层
把头文件结构体也整理出来,方便以后查看。


  1. /* Includes ------------------------------------------------------------------*/
  2. #include "stm32h7xx_hal_def.h"

  3. /** @addtogroup STM32H7xx_HAL_Driver
  4.   * @{
  5.   */

  6. /** @addtogroup ADCEx
  7.   * @{
  8.   */

  9. /* Exported types ------------------------------------------------------------*/
  10. /** @defgroup ADCEx_Exported_Types ADC Extended Exported Types
  11.   * @{
  12.   */

  13. /**
  14.   * @brief  ADC group injected contexts queue configuration
  15.   */
  16. typedef struct
  17. {
  18.   uint32_t ContextQueue;                 /*!< Injected channel configuration context: build-up over each
  19.                                               HAL_ADCEx_InjectedConfigChannel() call to finally initialize
  20.                                               JSQR register at HAL_ADCEx_InjectedConfigChannel() last call */

  21.   uint32_t ChannelCount;                 /*!< Number of channels in the injected sequence */
  22. }ADC_InjectionConfigTypeDef;

  23. /**
  24.   * @brief  ADC handle Structure definition
  25.   */
  26. typedef struct
  27. {
  28.   ADC_TypeDef                   *Instance;              /*!< Register base address */

  29.   ADC_InitTypeDef               Init;                   /*!< ADC initialization parameters and regular conversions setting */

  30.   DMA_HandleTypeDef             *DMA_Handle;            /*!< Pointer DMA Handler */

  31.   HAL_LockTypeDef               Lock;                   /*!< ADC locking object */

  32.   __IO uint32_t                 State;                  /*!< ADC communication state (bit-map of ADC states) */

  33.   __IO uint32_t                 ErrorCode;              /*!< ADC Error code */

  34.   ADC_InjectionConfigTypeDef    InjectionConfig ;       /*!< ADC injected channel configuration build-up structure */
  35. }ADC_HandleTypeDef;

  36. /**
  37.   * @brief  ADC Injected Conversion Oversampling structure definition
  38.   */
  39. typedef struct
  40. {
  41.   uint32_t Ratio;                         /*!< Configures the oversampling ratio.
  42.                                                This parameter can be a value between 0 to 1023 */

  43.   uint32_t RightBitShift;                 /*!< Configures the division coefficient for the Oversampler.
  44.                                                This parameter can be a value of @ref ADCEx_Right_Bit_Shift */
  45. }ADC_InjOversamplingTypeDef;

  46. /**
  47.   * @brief  Structure definition of ADC channel for regular group
  48.   * @note   The setting of these parameters by function HAL_ADC_ConfigChannel() is conditioned to ADC state.
  49.   *         ADC state can be either:
  50.   *          - For all parameters: ADC disabled (this is the only possible ADC state to modify parameter 'SingleDiff')
  51.   *          - For all except parameters 'SamplingTime', 'Offset', 'OffsetNumber': ADC enabled without conversion on going on regular group.
  52.   *          - For parameters 'SamplingTime', 'Offset', 'OffsetNumber': ADC enabled without conversion on going on regular and injected groups.
  53.   *         If ADC is not in the appropriate state to modify some parameters, these parameters setting is bypassed
  54.   *         without error reporting (as it can be the expected behavior in case of intended action to update another parameter
  55.   *        (which fulfills the ADC state condition) on the fly).
  56.   */
  57. typedef struct
  58. {
  59.   uint32_t Channel;                /*!< Specify the channel to configure into ADC regular group.
  60.                                         This parameter can be a value of @ref ADC_channels
  61.                                         Note: Depending on devices and ADC instances, some channels may not be available on device package pins. Refer to device DataSheet for channels availability. */

  62.   uint32_t Rank;                   /*!< Specify the rank in the regular group sequencer.
  63.                                         This parameter can be a value of @ref ADC_regular_rank
  64.                                         Note: to disable a channel or change order of conversion sequencer, rank containing a previous channel setting can be overwritten by
  65.                                         the new channel setting (or parameter number of conversions adjusted) */

  66.   uint32_t SamplingTime;           /*!< Sampling time value to be set for the selected channel.
  67.                                         Unit: ADC clock cycles
  68.                                         Conversion time is the addition of sampling time and processing time
  69.                                         This parameter can be a value of @ref ADC_sampling_times
  70.                                         Caution: This parameter applies to a channel that can be used into regular and/or injected group.
  71.                                                  It overwrites the last setting.
  72.                                         Note: In case of usage of internal measurement channels (VrefInt/Vbat/TempSensor),
  73.                                               sampling time constraints must be respected (sampling time can be adjusted in function of ADC clock frequency and sampling time setting)
  74.                                               Refer to device DataSheet for timings values. */

  75.   uint32_t SingleDiff;             /*!< Select single-ended or differential input.
  76.                                         In differential mode: Differential measurement is carried out between the selected channel 'i' (positive input) and channel 'i+1' (negative input).
  77.                                                               Only channel 'i' has to be configured, channel 'i+1' is configured automatically.
  78.                                         This parameter must be a value of @ref ADCEx_SingleDifferential
  79.                                        Caution: This parameter applies to a channel that can be used in a regular and/or injected group.
  80.                                                  It overwrites the last setting.
  81.                                         Note: Refer to Reference Manual to ensure the selected channel is available in differential mode.
  82.                                         Note: When configuring a channel 'i' in differential mode, the channel 'i+1' is not usable separately.
  83.                                         Note: This parameter must be modified when ADC is disabled (before ADC start conversion or after ADC stop conversion).
  84.                                               If ADC is enabled, this parameter setting is bypassed without error reporting (as it can be the expected behavior in case
  85.                                         of another parameter update on the fly) */

  86.   uint32_t OffsetNumber;           /*!< Select the offset number
  87.                                         This parameter can be a value of @ref ADCEx_OffsetNumber
  88.                                         Caution: Only one offset is allowed per channel. This parameter overwrites the last setting. */

  89.   uint32_t Offset;                 /*!< Define the offset to be subtracted from the raw converted data.
  90.                                         Offset value must be a positive number.
  91.                                         Depending of ADC resolution selected (16, 14, 12, 10 or 8 bits), this parameter must be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF,
  92.                                         0x3FFF, 0xFFF, 0x3FF or 0xFF respectively.
  93.                                         Note: This parameter must be modified when no conversion is on going on both regular and injected groups (ADC disabled, or ADC enabled
  94.                                         without continuous mode or external trigger that could launch a conversion). */

  95.   FunctionalState OffsetRightShift;   /*!< Define the Right-shift data after Offset correction.
  96.                                         This parameter is applied only for 16-bit or 8-bit resolution.
  97.                                         This parameter can be set to ENABLE or DISABLE.*/

  98.   FunctionalState OffsetSignedSaturation; /*!< Specify whether the Signed saturation feature is used or not.
  99.                                              This parameter is applied only for 16-bit or 8-bit resolution.
  100.                                              This parameter can be set to ENABLE or DISABLE. */
  101. }ADC_ChannelConfTypeDef;

  102. /**
  103.   * @brief  Structure definition of ADC group injected and ADC channel affected to ADC group injected
  104.   * @note   Parameters of this structure are shared within 2 scopes:
  105.   *          - Scope channel: InjectedChannel, InjectedRank, InjectedSamplingTime , InjectedSingleDiff, InjectedOffsetNumber, InjectedOffset
  106.   *          - Scope ADC group injected (affects all channels of injected group): InjectedNbrOfConversion, InjectedDiscontinuousConvMode,
  107.   *            AutoInjectedConv, QueueInjectedContext, ExternalTrigInjecConv, ExternalTrigInjecConvEdge, InjecOversamplingMode, InjecOversampling.
  108.   * @note   The setting of these parameters by function HAL_ADCEx_InjectedConfigChannel() is conditioned to ADC state.
  109.   *         ADC state can be either:
  110.   *          - For all parameters: ADC disabled (this is the only possible ADC state to modify parameter 'InjectedSingleDiff')
  111.   *          - For parameters 'InjectedDiscontinuousConvMode', 'QueueInjectedContext', 'InjecOversampling': ADC enabled without conversion on going on injected group.
  112.   *          - For parameters 'InjectedSamplingTime', 'InjectedOffset', 'InjectedOffsetNumber', 'AutoInjectedConv': ADC enabled without conversion on going on regular and injected groups.
  113.   *          - For parameters 'InjectedChannel', 'InjectedRank', 'InjectedNbrOfConversion', 'ExternalTrigInjecConv', 'ExternalTrigInjecConvEdge': ADC enabled and while conversion on going
  114.   *            on ADC groups regular and injected.
  115.   *         If ADC is not in the appropriate state to modify some parameters, these parameters setting is bypassed
  116.   *         without error reporting (as it can be the expected behavior in case of intended action to update another parameter (which fulfills the ADC state condition) on the fly).
  117.   */
  118. typedef struct
  119. {
  120.   uint32_t InjectedChannel;               /*!< Specifies the channel to configure into ADC group injected.
  121.                                                This parameter can be a value of @ref ADC_channels
  122.                                                Note: Depending on devices and ADC instances, some channels may not be available on device package pins. Refer to device datasheet for channels availability. */

  123.   uint32_t InjectedRank;                  /*!< Specifies the rank in the ADC group injected sequencer.
  124.                                                This parameter must be a value of @ref ADCEx_injected_rank.
  125.                                                Note: to disable a channel or change order of conversion sequencer, rank containing a previous channel setting can be overwritten by
  126.                                                the new channel setting (or parameter number of conversions adjusted) */

  127.   uint32_t InjectedSamplingTime;          /*!< Sampling time value to be set for the selected channel.
  128.                                                Unit: ADC clock cycles.
  129.                                                Conversion time is the addition of sampling time and processing time
  130.                                                This parameter can be a value of @ref ADC_sampling_times.
  131.                                                Caution: This parameter applies to a channel that can be used in a regular and/or injected group.
  132.                                                         It overwrites the last setting.
  133.                                                Note: In case of usage of internal measurement channels (VrefInt/Vbat/TempSensor),
  134.                                                      sampling time constraints must be respected (sampling time can be adjusted in function of ADC clock frequency and sampling time setting)
  135.                                                      Refer to device datasheet for timings values. */

  136.   uint32_t InjectedSingleDiff;            /*!< Selection of single-ended or differential input.
  137.                                                In differential mode: Differential measurement is between the selected channel 'i' (positive input) and channel 'i+1' (negative input).
  138.                                                Only channel 'i' has to be configured, channel 'i+1' is configured automatically.
  139.                                                This parameter must be a value of @ref ADCEx_SingleDifferential.
  140.                                                Caution: This parameter applies to a channel that can be used in a regular and/or injected group.
  141.                                                         It overwrites the last setting.
  142.                                                Note: Refer to Reference Manual to ensure the selected channel is available in differential mode.
  143.                                                Note: When configuring a channel 'i' in differential mode, the channel 'i+1' is not usable separately.
  144.                                                Note: This parameter must be modified when ADC is disabled (before ADC start conversion or after ADC stop conversion).
  145.                                                If ADC is enabled, this parameter setting is bypassed without error reporting (as it can be the expected behavior in case
  146.                                                of another parameter update on the fly) */

  147.   uint32_t InjectedOffsetNumber;          /*!< Selects the offset number.
  148.                                                This parameter can be a value of @ref ADCEx_OffsetNumber.
  149.                                                Caution: Only one offset is allowed per channel. This parameter overwrites the last setting. */

  150.   uint32_t InjectedOffset;                /*!< Defines the offset to be subtracted from the raw converted data.
  151.                                                Offset value must be a positive number.
  152.                                                Depending of ADC resolution selected (16, 14, 12, 10 or 8bits), this parameter must be a number
  153.                                                between Min_Data = 0x0000 and Max_Data = 0xFFFF, 0x3FFF, 0xFFF, 0x3FF or 0xFF respectively.
  154.                                                Note: This parameter must be modified when no conversion is on going on both regular and injected groups (ADC disabled, or ADC enabled
  155.                                                without continuous mode or external trigger that could launch a conversion). */
  156.   uint32_t InjectedOffsetRightShift;       /*!< Defines the Right-shift data after Offset correction.
  157.                                                 This parameter is applied only for 16-bit or 8-bit resolution.
  158.                                                 This parameter must be a value of @ref ADCEx_Right_Bit_Shift.*/
  159.   FunctionalState InjectedOffsetSignedSaturation;      /*!< Specifies whether the Signed saturation feature is used or not.
  160.                                                This parameter is applied only for 16-bit or 8-bit resolution.
  161.                                                This parameter can be set to ENABLE or DISABLE. */
  162.   uint32_t InjectedLeftBitShift;          /*!< Configures the left shifting applied to the final result with or without oversampling.
  163.                                                This parameter can be a value of @ref ADCEx_Left_Bit_Shift */
  164.   uint32_t InjectedNbrOfConversion;       /*!< Specifies the number of ranks that will be converted within the ADC group injected sequencer.
  165.                                                To use the injected group sequencer and convert several ranks, parameter 'ScanConvMode' must be enabled.
  166.                                                This parameter must be a number between Min_Data = 1 and Max_Data = 4.
  167.                                                Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to
  168.                                                         configure a channel on injected group can impact the configuration of other channels previously set. */

  169.   FunctionalState InjectedDiscontinuousConvMode; /*!< Specifies whether the conversions sequence of ADC group injected is performed in Complete-sequence/Discontinuous-sequence
  170.                                                (main sequence subdivided in successive parts).
  171.                                                Discontinuous mode is used only if sequencer is enabled (parameter 'ScanConvMode'). If sequencer is disabled, this parameter is discarded.
  172.                                                Discontinuous mode can be enabled only if continuous mode is disabled.
  173.                                                This parameter can be set to ENABLE or DISABLE.
  174.                                                Note: This parameter must be modified when ADC is disabled (before ADC start conversion or after ADC stop conversion).
  175.                                                Note: For injected group, discontinuous mode converts the sequence channel by channel (discontinuous length fixed to 1 rank).
  176.                                                Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to
  177.                                                         configure a channel on injected group can impact the configuration of other channels previously set. */

  178.   FunctionalState AutoInjectedConv;              /*!< Enables or disables the selected ADC group injected automatic conversion after regular one
  179.                                                This parameter can be set to ENABLE or DISABLE.
  180.                                                Note: To use Automatic injected conversion, discontinuous mode must be disabled ('DiscontinuousConvMode' and 'InjectedDiscontinuousConvMode' set to DISABLE)
  181.                                                Note: To use Automatic injected conversion, injected group external triggers must be disabled ('ExternalTrigInjecConv' set to ADC_INJECTED_SOFTWARE_START)
  182.                                                Note: In case of DMA used with regular group: if DMA configured in normal mode (single shot) JAUTO will be stopped upon DMA transfer complete.
  183.                                                      To maintain JAUTO always enabled, DMA must be configured in circular mode.
  184.                                                Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to
  185.                                                         configure a channel on injected group can impact the configuration of other channels previously set. */

  186.   FunctionalState QueueInjectedContext;          /*!< Specifies whether the context queue feature is enabled.
  187.                                                This parameter can be set to ENABLE or DISABLE.
  188.                                                If context queue is enabled, injected sequencer&channels configurations are queued on up to 2 contexts. If a
  189.                                                new injected context is set when queue is full, error is triggered by interruption and through function
  190.                                                'HAL_ADCEx_InjectedQueueOverflowCallback'.
  191.                                                Caution: This feature request that the sequence is fully configured before injected conversion start.
  192.                                                         Therefore, configure channels with as many calls to HAL_ADCEx_InjectedConfigChannel() as the 'InjectedNbrOfConversion' parameter.
  193.                                                Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to
  194.                                                         configure a channel on injected group can impact the configuration of other channels previously set.
  195.                                                Note: This parameter must be modified when ADC is disabled (before ADC start conversion or after ADC stop conversion). */

  196.   uint32_t ExternalTrigInjecConv;         /*!< Selects the external event used to trigger the conversion start of injected group.
  197.                                                If set to ADC_INJECTED_SOFTWARE_START, external triggers are disabled and software trigger is used instead.
  198.                                                This parameter can be a value of @ref ADCEx_Injected_External_Trigger_Source.
  199.                                                Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to
  200.                                                         configure a channel on injected group can impact the configuration of other channels previously set. */

  201.   uint32_t ExternalTrigInjecConvEdge;     /*!< Selects the external trigger edge of injected group.
  202.                                                This parameter can be a value of @ref ADC_injected_external_trigger_edge.
  203.                                                If trigger source is set to ADC_INJECTED_SOFTWARE_START, this parameter is discarded.
  204.                                                Caution: this setting impacts the entire injected group. Therefore, call of HAL_ADCEx_InjectedConfigChannel() to
  205.                                                         configure a channel on injected group can impact the configuration of other channels previously set. */

  206.   FunctionalState InjecOversamplingMode;                 /*!< Specifies whether the oversampling feature is enabled or disabled.
  207.                                                        This parameter can be set to ENABLE or DISABLE.
  208.                                                        Note: This parameter can be modified only if there is no conversion is ongoing (both ADSTART and JADSTART cleared) */

  209.   ADC_InjOversamplingTypeDef  InjecOversampling; /*!< Specifies the Oversampling parameters.
  210.                                                       Caution: this setting overwrites the previous oversampling configuration if oversampling already enabled.
  211.                                                       Note: This parameter can be modified only if there is no conversion is ongoing (both ADSTART and JADSTART cleared). */
  212. }ADC_InjectionConfTypeDef;



  213. /**
  214.   * @brief  Structure definition of ADC MultiMode
  215.   * @note   The setting of these parameters by function HAL_ADCEx_MultiModeConfigChannel() is conditioned by ADCs state (both Master and Slave ADCs).
  216.   *         Both Master and Slave ADCs must be disabled.
  217.   */
  218. typedef struct
  219. {
  220.   uint32_t Mode;              /*!< Configures the ADC to operate in independent or MultiMode.
  221.                                    This parameter can be a value of @ref ADCEx_Common_mode */
  222.   uint32_t DualModeData;      /*!< Configures the Dual ADC Mode Data Format:
  223.                                    This parameter can be a value of @ref ADCEx_Dual_Mode_Data_Format */
  224.   uint32_t TwoSamplingDelay;  /*!< Configures the Delay between 2 sampling phases.
  225.                                    This parameter can be a value of @ref ADCEx_delay_between_2_sampling_phases
  226.                                    Delay range depends on selected resolution:
  227.                                     from 1 to 9 clock cycles for 16 bits,
  228.                                     from 1 to 9 clock cycles for 14 bits
  229.                                     from 1 to 8 clock cycles for 12 bits
  230.                                     from 1 to 6 clock cycles for 10 bits
  231.                                     from 1 to 6 clock cycles for 8 bits     */
  232. }ADC_MultiModeTypeDef;
复制代码



回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2018-9-6 08:48:29 | 显示全部楼层
ADC校准,软硬件都有细节可以玩。
Releasing your creativity
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 02:28 , Processed in 0.154747 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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