硬汉嵌入式论坛

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

[ADC] H7的双重adc模式,软件触发,采样率太低

  [复制链接]

2

主题

51

回帖

57

积分

初级会员

积分
57
发表于 2024-3-1 13:25:33 | 显示全部楼层 |阅读模式
本帖最后由 风过不留痕 于 2024-3-1 18:57 编辑

请教一下,我使用stm32h743vit6+v版,时钟配置成480mhz,使用双重adc模式+12bit+1.5cycle,adc1和adc2共同采集通道3,

采集理论上单个adc的采样速率此时能得到4.5mhz,这样双重模式下软件触发,采样率是不是应该在9mhz左右?

以下是我的配置图,目前程序是正常运行,一次是采集512个数据,但是中断频率只有1m左右(512*2k);

adc1配置

adc1配置

adc1_dma

adc1_dma

adc2配置

adc2配置




这里是启动adc和adc的中断,用示波器看io口翻转速率


code1

code1

code2

code2




这个是示波器抓的图片,翻转速率是2k左右:

示波器

示波器


/////////////////////////////////////////////////

查看手册,两个adc之间有个3.5的cycle,这个是固定的吗?
H7.jpg

是不是就是软件这里的配置:
samplingTime.jpg


不知道问题出在哪,请各位大神赐教,请硬汉哥抽空帮忙指导一下


回复

使用道具 举报

2

主题

51

回帖

57

积分

初级会员

积分
57
 楼主| 发表于 2024-3-1 13:32:40 | 显示全部楼层
图片为啥刷新不出来?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-3-1 17:01:11 | 显示全部楼层
风过不留痕 发表于 2024-3-1 13:32
图片为啥刷新不出来?

上午附件服务器挂了。

注意,ADC双重模式,ADC1和ADC2之间的采样间隔是固定的几个参数配置,你要算进去,是不是和你触发速度配合上。
回复

使用道具 举报

2

主题

51

回帖

57

积分

初级会员

积分
57
 楼主| 发表于 2024-3-1 18:59:24 | 显示全部楼层
eric2013 发表于 2024-3-1 17:01
上午附件服务器挂了。

注意,ADC双重模式,ADC1和ADC2之间的采样间隔是固定的几个参数配置,你要算进 ...

触发就是软件触发一次的,然后是continues采集
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-3-2 09:21:58 | 显示全部楼层
风过不留痕 发表于 2024-3-1 18:59
触发就是软件触发一次的,然后是continues采集

就是这个,之前我发过一个帖子。

F429自带的3ADC快速交替采样不适合用于定时器触发,因为无法做到等间隔采样
https://www.armbbs.cn/forum.php? ... 1664&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

18

主题

93

回帖

147

积分

初级会员

积分
147
QQ
发表于 2025-3-14 14:53:38 | 显示全部楼层
风过不留痕 发表于 2024-3-1 18:59
触发就是软件触发一次的,然后是continues采集

请问解决了没?我遇到了一个问题是:我的逻辑是外部一个1khz的方波触发ADC采集。就是每次上电之后就触发一次,就不继续采集了。不知道是什么问题?
这是ADC的配置

void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_MultiModeTypeDef multimode = {0};
  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */

  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc1.Init.Resolution = ADC_RESOLUTION_16B;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
  hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  hadc1.Init.OversamplingMode = DISABLE;
  hadc1.Init.Oversampling.Ratio = 1;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure the ADC multi-mode
  */
  multimode.Mode = ADC_DUALMODE_INTERL;
  multimode.DualModeData = ADC_DUALMODEDATAFORMAT_32_10_BITS;
  multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_3CYCLES;
  if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_10;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  sConfig.OffsetSignedSaturation = DISABLE;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}
这是ADC2的配置

void MX_ADC2_Init(void)
{

  /* USER CODE BEGIN ADC2_Init 0 */

  /* USER CODE END ADC2_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC2_Init 1 */

  /* USER CODE END ADC2_Init 1 */

  /** Common config
  */
  hadc2.Instance = ADC2;
  hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc2.Init.Resolution = ADC_RESOLUTION_16B;
  hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc2.Init.LowPowerAutoWait = DISABLE;
  hadc2.Init.ContinuousConvMode = ENABLE;
  hadc2.Init.NbrOfConversion = 1;
  hadc2.Init.DiscontinuousConvMode = DISABLE;
  hadc2.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;
  hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  hadc2.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  hadc2.Init.OversamplingMode = DISABLE;
  hadc2.Init.Oversampling.Ratio = 1;
  if (HAL_ADC_Init(&hadc2) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_10;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  sConfig.OffsetSignedSaturation = DISABLE;
  if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC2_Init 2 */

  /* USER CODE END ADC2_Init 2 */

}
DMA的配置

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(adcHandle->Instance==ADC1)
  {
  /* USER CODE BEGIN ADC1_MspInit 0 */

  /* USER CODE END ADC1_MspInit 0 */
    /* ADC1 clock enable */
    HAL_RCC_ADC12_CLK_ENABLED++;
    if(HAL_RCC_ADC12_CLK_ENABLED==1){
      __HAL_RCC_ADC12_CLK_ENABLE();
    }

    __HAL_RCC_GPIOC_CLK_ENABLE();
    /**ADC1 GPIO Configuration
    PC0     ------> ADC1_INP10
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    /* ADC1 DMA Init */
    /* ADC1 Init */
    hdma_adc1.Instance = DMA1_Stream0;
    hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
    hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_adc1.Init.Mode = DMA_NORMAL;
    hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
    hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);

    /* ADC1 interrupt Init */
    HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(ADC_IRQn);
  /* USER CODE BEGIN ADC1_MspInit 1 */

  /* USER CODE END ADC1_MspInit 1 */
  }
  else if(adcHandle->Instance==ADC2)
  {
  /* USER CODE BEGIN ADC2_MspInit 0 */

  /* USER CODE END ADC2_MspInit 0 */
    /* ADC2 clock enable */
    HAL_RCC_ADC12_CLK_ENABLED++;
    if(HAL_RCC_ADC12_CLK_ENABLED==1){
      __HAL_RCC_ADC12_CLK_ENABLE();
    }

    __HAL_RCC_GPIOC_CLK_ENABLE();
    /**ADC2 GPIO Configuration
    PC0     ------> ADC2_INP10
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    /* ADC2 interrupt Init */
    HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(ADC_IRQn);
  /* USER CODE BEGIN ADC2_MspInit 1 */

  /* USER CODE END ADC2_MspInit 1 */
  }
}
然后这是我的逻辑:
#define ADC_DATA_LENGTH 256

uint32_t ADC_BUFFER[ADC_DATA_LENGTH]; // DMA缓冲区

uint16_t adc1_data[ADC_DATA_LENGTH];
uint16_t adc2_data[ADC_DATA_LENGTH];

volatile uint8_t g_adc3_dma_start_flag = 0;
volatile uint8_t g_adc3_dma_complete_flag = 0;  // 数据准备标志位

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) // 处理GPIO_PIN_1的中断事件
{
    if (GPIO_Pin == GPIO_PIN_1)
    {
      g_adc3_dma_start_flag = 1; // 设置采集完成标志位,开始采集   
    }
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{       
//    SCB_InvalidateDCache_by_Addr((uint32_t *) ADC_BUFFER, sizeof(ADC_BUFFER);
        HAL_ADC_Stop(&hadc2);
        HAL_ADC_Stop_DMA(&hadc1);
        g_adc3_dma_complete_flag = 1; // 设置DMA传输完成标志位
}

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
          if(g_adc3_dma_start_flag == 1){
          HAL_ADC_Start(&hadc2);
          HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t* )ADC_BUFFER, ADC_DATA_LENGTH);  
                  if(g_adc3_dma_complete_flag == 1){
                                          // 处理数据
                for (int i = 0; i < ADC_DATA_LENGTH; i++)
                {
                        uint16_t adc1_data = ADC_BUFFER & 0xFFFF;  // 提取主ADC数据(低16位)
                        uint16_t adc2_data = (ADC_BUFFER >> 16) & 0xFFFF;  // 提取从ADC数据(高16位)

                        // 交替打印低16位和高16位
                        printf("Sample[%d] - ADC1 (Low 16 bits): %d\n", i, ADC_BUFFER & 0xFFFF); //ADC1
                        printf("Sample[%d] - ADC2 (High 16 bits): %d\n", i,(ADC_BUFFER >> 16) & 0xFFFF);//ADC2
                }
                  }                  
                  g_adc3_dma_complete_flag = 0;
                  g_adc3_dma_start_flag = 0;
  }
}





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2025-3-15 09:17:01 | 显示全部楼层
不吃鱼的猫大人 发表于 2025-3-14 14:53
请问解决了没?我遇到了一个问题是:我的逻辑是外部一个1khz的方波触发ADC采集。就是每次上电之后就触发 ...

ADC有专门的外部EXTI触发模式,可以考虑使用。
回复

使用道具 举报

18

主题

93

回帖

147

积分

初级会员

积分
147
QQ
发表于 2025-3-15 09:35:06 | 显示全部楼层
eric2013 发表于 2024-3-2 09:21
就是这个,之前我发过一个帖子。

F429自带的3ADC快速交替采样不适合用于定时器触发,因为无法做到等间 ...

硬汉大佬,我想请问一下:
1.就是目前遇到了这个现象,我想的是在外部上升沿中断触发双ADC采集,但是我发现只会运行一次就卡住了,我的中断里面的标志位也被置为1了,但是我的外部中断明明没有来啊。
2.我仿真看了一下就是ADC确实是采集了一次,主循环打印完之后标志位才置为0,但是我的程序压根就没打印。
3.如果我在ADC回调函数不停止ADC,也不需要外部上升沿触发ADC采集的话就没问题,可以一直打印,这个是为啥呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2025-3-17 05:29:06 | 显示全部楼层
不吃鱼的猫大人 发表于 2025-3-15 09:35
硬汉大佬,我想请问一下:
1.就是目前遇到了这个现象,我想的是在外部上升沿中断触发双ADC采集,但是我 ...

先不管外部中断触发,你看下你的ADC支持反复stop和start使用不
回复

使用道具 举报

18

主题

93

回帖

147

积分

初级会员

积分
147
QQ
发表于 2025-3-17 10:49:00 | 显示全部楼层
eric2013 发表于 2025-3-17 05:29
先不管外部中断触发,你看下你的ADC支持反复stop和start使用不

不支持,我在回调函数停止之后就不能在while里面开启了。不知道为啥
回复

使用道具 举报

18

主题

93

回帖

147

积分

初级会员

积分
147
QQ
发表于 2025-3-17 10:54:58 | 显示全部楼层
eric2013 发表于 2025-3-17 05:29
先不管外部中断触发,你看下你的ADC支持反复stop和start使用不

如果我不在回调函数停止ADC的话,就可以一直采集一直打印
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{      
//    SCB_InvalidateDCache_by_Addr((uint32_t *) ADC_BUFFER, sizeof(ADC_BUFFER);
        HAL_ADC_Stop(&hadc2);
        HAL_ADC_Stop_DMA(&hadc1);
        g_adc3_dma_complete_flag = 1; // 设置DMA传输完成标志位

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
          HAL_ADC_Start(&hadc2);//先启动从ADC
          HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t* )ADC_BUFFER, ADC_DATA_LENGTH);  
         if(g_adc3_dma_complete_flag == 1){
                // 处理数据
                for (int i = 0; i < ADC_DATA_LENGTH; i++)
                {
                        // 交替打印低16位和高16位
                        printf("Sample[%d] - ADC1 (Low 16 bits): %d\n", i, ADC_BUFFER & 0xFFFF); //ADC1
                        printf("Sample[%d] - ADC2 (High 16 bits): %d\n", i,(ADC_BUFFER >> 16) & 0xFFFF);//ADC2
                }
                                
                  g_adc3_dma_complete_flag = 0;
  }  
}
回复

使用道具 举报

2

主题

51

回帖

57

积分

初级会员

积分
57
 楼主| 发表于 2025-3-17 14:50:37 | 显示全部楼层
hdma_adc1.Init.Mode = DMA_NORMAL;这里不应该是circular吗
回复

使用道具 举报

18

主题

93

回帖

147

积分

初级会员

积分
147
QQ
发表于 2025-3-17 16:45:22 | 显示全部楼层
风过不留痕 发表于 2025-3-17 14:50
hdma_adc1.Init.Mode = DMA_NORMAL;这里不应该是circular吗

我最开始是外部上升沿触发所以改成ADC_CONVERSIONDATA_DMA_ONESHOT,就设置的Normal
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2025-3-18 08:48:15 | 显示全部楼层
不吃鱼的猫大人 发表于 2025-3-17 10:49
不支持,我在回调函数停止之后就不能在while里面开启了。不知道为啥

下次重新初始化,调用下DeInit函数,再调用ADC Init函数试试
回复

使用道具 举报

18

主题

93

回帖

147

积分

初级会员

积分
147
QQ
发表于 2025-3-18 11:35:30 | 显示全部楼层
eric2013 发表于 2025-3-18 08:48
下次重新初始化,调用下DeInit函数,再调用ADC Init函数试试

神医啊,这是为啥!
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{       
        if (hadc->Instance == ADC1 || hadc->Instance == ADC2)
    {
    SCB_InvalidateDCache_by_Addr((uint32_t *) ADC_BUFFER, sizeof(ADC_BUFFER));
                HAL_ADC_Stop_DMA(&hadc1);
                HAL_ADC_Stop(&hadc2);

                g_adc3_dma_complete_flag = 1; // 设置DMA传输完成标志位
        }
}
         if(g_adc3_dma_start_flag == 1){
                 /* ADC1 DMA DeInit */
                HAL_ADC_MspDeInit(&hadc2);
                HAL_ADC_MspDeInit(&hadc1);
                HAL_ADC_MspInit(&hadc2);
                 HAL_ADC_MspInit(&hadc1);
                   MX_ADC1_Init();
                        MX_ADC2_Init();
          HAL_ADC_Start(&hadc2);
          HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t* )ADC_BUFFER, ADC_DATA_LENGTH);  
                  if(g_adc3_dma_complete_flag == 1){
                                          // 处理数据
                                        for (int i = 0; i < ADC_DATA_LENGTH; i++)
                                        {
                        //                        uint16_t adc1_data = ADC_BUFFER & 0xFFFF;  // 提取主ADC数据(低16位)
                        //                        uint16_t adc2_data = (ADC_BUFFER >> 16) & 0xFFFF;  // 提取从ADC数据(高16位)

                                                // 交替打印低16位和高16位
                                                printf("%d\r\n", ADC_BUFFER & 0xFFFF); //ADC1
                                                printf("%d\r\n",(ADC_BUFFER >> 16) & 0xFFFF);//ADC2
                                        }
                                }                  
                  g_adc3_dma_complete_flag = 0;
                  g_adc3_dma_start_flag = 0;
  }
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2025-3-19 05:06:10 | 显示全部楼层
不吃鱼的猫大人 发表于 2025-3-18 11:35
神医啊,这是为啥!
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{       

会将其设置到复位状态,然后再初始化就比较好用了。
回复

使用道具 举报

18

主题

93

回帖

147

积分

初级会员

积分
147
QQ
发表于 2025-3-19 09:40:06 | 显示全部楼层
eric2013 发表于 2025-3-19 05:06
会将其设置到复位状态,然后再初始化就比较好用了。

谢谢大佬!很奇怪,单独ADC的时候就没问题,双ADC交替采集会有问题
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2025-3-20 09:11:40 | 显示全部楼层
不吃鱼的猫大人 发表于 2025-3-19 09:40
谢谢大佬!很奇怪,单独ADC的时候就没问题,双ADC交替采集会有问题

DeInit是最保险的做法
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 5 天前 | 显示全部楼层
我在使用H743的双重ADC交替采样模式。两个ADC综合采样率均配置为4.5MHz(顶配)。当使用连续模式时,采出的样本点个数是符合预期的(比如采集10kHz的正弦信号,一个周期内能采集900个点),而当配置为TIM单次触发模式时,仅能采到一般的点(TIM配置为4Mhz,理论上采集10Khz正弦信号单个周期应该能采集800个点,实际上只有400个)。请问这是为什么?哪位有经验能解答一下?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 4 天前 | 显示全部楼层
wangzz 发表于 2025-6-5 14:52
我在使用H743的双重ADC交替采样模式。两个ADC综合采样率均配置为4.5MHz(顶配)。当使用连续模式时,采出的样 ...

这种的交错模式,使用定时器触发效果一般,因为根本原因是交错的间隔是固定的,而你的定时器触发也有一个间隔,他们两个无法做到动态的等间隔。

最后注意两个问题
1、V版硬件芯片的,ADC强制二分频的,这个特别注意。
2、然后就是不同封装的最高支持ADC速度是不同的

STM32H7中ADC功能被ST玩出花,现在分直接通道,快速通道和慢速通道,不同封装最高速不同, LQFP封装速度最低
https://www.armbbs.cn/forum.php? ... 7343&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 13:44 , Processed in 0.400417 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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