硬汉嵌入式论坛

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

[UART] STM32H743VIHx USART DMA 闲时中断读取数据不对

  [复制链接]

1

主题

26

回帖

29

积分

新手上路

积分
29
发表于 2021-8-29 16:41:17 | 显示全部楼层 |阅读模式
STM32H743VIHx USART DMA 闲时中断读取不到数据
没有开启DACHE . 用的CUBEMX生成的代码。

代码如下:

uint8_t RX_SIZE_2=50;
#pragma data_alignment=32
uint8_t  uart2RxBuf[50];



void MX_USART6_UART_Init(void)
{

  /* USER CODE BEGIN USART6_Init 0 */

  /* USER CODE END USART6_Init 0 */

  /* USER CODE BEGIN USART6_Init 1 */

  /* USER CODE END USART6_Init 1 */
  huart6.Instance = USART6;
  huart6.Init.BaudRate = 100000;
  huart6.Init.WordLength = UART_WORDLENGTH_9B;
  huart6.Init.StopBits = UART_STOPBITS_2;
  huart6.Init.Parity = UART_PARITY_EVEN;
  huart6.Init.Mode = UART_MODE_RX;
  huart6.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart6.Init.OverSampling = UART_OVERSAMPLING_16;
  huart6.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart6.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
  huart6.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
  if (HAL_UART_Init(&huart6) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart6, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart6, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart6) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART6_Init 2 */

  /* USER CODE END USART6_Init 2 */

}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  if(uartHandle->Instance==USART6)
  {
  /* USER CODE BEGIN USART6_MspInit 0 */

  /* USER CODE END USART6_MspInit 0 */
  /** Initializes the peripherals clock
  */
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART6;
    PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }

    /* USART6 clock enable */
    __HAL_RCC_USART6_CLK_ENABLE();

    __HAL_RCC_GPIOC_CLK_ENABLE();
    /**USART6 GPIO Configuration
    PC7     ------> USART6_RX
    PC6     ------> USART6_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART6;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF7_USART6;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    /* USART6 DMA Init */
    /* USART6_RX Init */
    hdma_usart6_rx.Instance = DMA2_Stream7;
    hdma_usart6_rx.Init.Request = DMA_REQUEST_USART6_RX;
    hdma_usart6_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_usart6_rx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart6_rx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart6_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart6_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart6_rx.Init.Mode = DMA_CIRCULAR;
    hdma_usart6_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH;
    hdma_usart6_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_usart6_rx) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart6_rx);

    /* USART6 interrupt Init */
    HAL_NVIC_SetPriority(USART6_IRQn, 8, 0);
    HAL_NVIC_EnableIRQ(USART6_IRQn);
  /* USER CODE BEGIN USART6_MspInit 1 */


  /* USER CODE END USART6_MspInit 1 */
  }
}

void UART_RxIdleCallback(UART_HandleTypeDef *huart)
{   


         if(huart->Instance==huart6.Instance)                                   //判断是否是串口1
        {
       if(RESET != __HAL_UART_GET_FLAG(&huart6, UART_FLAG_IDLE))   //判断是否是空闲中断
            {
                __HAL_UART_CLEAR_IDLEFLAG(&huart6);                     //清楚空闲中断标志(否则会一直不断进入中断)
                     data_length  = RX_SIZE_2 -__HAL_DMA_GET_COUNTER(&hdma_usart6_rx);   //计算接收到的数据长度
               每次接收到的长度都是0
                if(data_length)
                {
                   HAL_UART_DMAStop(&huart6);

               if(data_length>=10)
                {
                      for (int16_t i = 0; i < data_length; i++)         // Process bytes received
                        { sbus_share[i]=uart2RxBuf[i];}
                }
                else{sbus_updated=0;
                }
                memset(&uart2RxBuf,0,RX_SIZE_2);                                            //清零接收缓冲区
                data_length = 0;
                HAL_UART_Receive_DMA(&huart6, (uint8_t*)uart2RxBuf, RX_SIZE_2);                    //重启开始DMA传输 每次255字节数据
               __HAL_UART_DISABLE_IT(&huart6,UART_IT_PE);
               __HAL_UART_DISABLE_IT(&huart6,UART_IT_ERR);

                }
                else
                {
                READ_REG(huart6.Instance->RDR);
                __HAL_UART_CLEAR_OREFLAG(&huart6);
                }

            }
            if(RESET != __HAL_UART_GET_FLAG(&huart6, UART_FLAG_TC))
            {
            MP++;        
      每次中断都会进来很奇怪我只配了接收 没有配发送
            }
        }




}


  void main()
{
......

   __HAL_UART_ENABLE_IT(&huart6,UART_IT_IDLE);
   __HAL_UART_CLEAR_IDLEFLAG(&huart6);//清除标志位

   if( HAL_UART_Receive_DMA(&huart6,&uart2RxBuf[0],RX_SIZE_2)!= HAL_OK)
     {
  Error_Handler();
      }
   __HAL_UART_DISABLE_IT(&huart6, UART_IT_ERR);
  __HAL_UART_DISABLE_IT(&huart6, UART_IT_PE);


.........

}

回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-8-29 16:56:46 | 显示全部楼层
cubemx6.3,  STM32Cube FW_H7 V1.9.0 开发环境 IAR8.30
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-8-29 16:58:00 | 显示全部楼层
STM32CubeMX 6.3 STM32Cube FW_H7 V1.9.0
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106995
QQ
发表于 2021-8-30 00:48:01 | 显示全部楼层
不使用DMA是否可以进入空闲中断
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-8-30 20:53:31 | 显示全部楼层
eric2013 发表于 2021-8-30 00:48
不使用DMA是否可以进入空闲中断

不使用DMA的闲时中断 要怎么写
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-8-30 20:58:23 | 显示全部楼层
eric2013 发表于 2021-8-30 00:48
不使用DMA是否可以进入空闲中断

把HAL_UART_Receive_DMA换成了HAL_UART_Receive。试了还是会进闲时中断
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-8-30 21:06:06 | 显示全部楼层
eric2013 发表于 2021-8-30 00:48
不使用DMA是否可以进入空闲中断

第一次进入空闲中断uart2RxBuf存满了数据,第二次进入uart2RxBuf中的数据就没有变化了,还是第一次的那些。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-8-30 21:16:14 | 显示全部楼层
eric2013 发表于 2021-8-30 00:48
不使用DMA是否可以进入空闲中断

当我在HAL_UART_Receive  后面加入
   __HAL_UART_DISABLE_IT(&huart6,UART_IT_PE);
               __HAL_UART_DISABLE_IT(&huart6,UART_IT_ERR);
后每次进入uart2RxBuf数据就会更新了
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-8-30 22:19:34 | 显示全部楼层
接收到的数据都是错误的,是不是噪声太大,造成传输错误,可是我的线才5CM直接焊在板上的
回复

使用道具 举报

5

主题

132

回帖

147

积分

初级会员

积分
147
发表于 2021-8-31 08:39:37 | 显示全部楼层
把库更新到最新的, F1和F4都有的配套的 HAL_UARTEx_ReceiveToIdle_DMA  函数,CUBE配好UART+DMA 直接用就行了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106995
QQ
发表于 2021-8-31 08:49:05 | 显示全部楼层
px601 发表于 2021-8-30 22:19
接收到的数据都是错误的,是不是噪声太大,造成传输错误,可是我的线才5CM直接焊在板上的

1、你的收发数据格式一致吗
huart6.Init.WordLength = UART_WORDLENGTH_9B;
  huart6.Init.StopBits = UART_STOPBITS_2;
  huart6.Init.Parity = UART_PARITY_EVEN;

2、然后波特率用个标准波特率115200试试
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-8-31 10:18:54 来自手机 | 显示全部楼层
eric2013 发表于 2021-8-31 08:49
1、你的收发数据格式一致吗
huart6.Init.WordLength = UART_WORDLENGTH_9B;
  huart6.Init.StopBits = ...

这个没错,数据发送端是航模的接收机输出的sbus协议数据。相同的代码在stm32h743vit6上就正常。我也试着改一下速度试一下
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-8-31 10:20:28 来自手机 | 显示全部楼层
无关风月 发表于 2021-8-31 08:39
把库更新到最新的, F1和F4都有的配套的 HAL_UARTEx_ReceiveToIdle_DMA  函数,CUBE配好UART+DMA 直接用就 ...

我是h7.hal是1.9的,就是用的配套函数。
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2021-8-31 12:51:44 | 显示全部楼层
px601 发表于 2021-8-31 10:20
我是h7.hal是1.9的,就是用的配套函数。

解决了没,晚上回去用的陈年V7开发板试试!
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-1 21:13:25 | 显示全部楼层
eric2013 发表于 2021-8-31 08:49
1、你的收发数据格式一致吗
huart6.Init.WordLength = UART_WORDLENGTH_9B;
  huart6.Init.StopBits = ...

试了115200一样,收到的数据还是不对
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-1 22:13:36 | 显示全部楼层
旮旯旭 发表于 2021-8-31 12:51
解决了没,晚上回去用的陈年V7开发板试试!

没解决,波特率改了都不行
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2021-9-2 07:12:05 | 显示全部楼层
px601 发表于 2021-9-1 22:13
没解决,波特率改了都不行

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1

这个你那天提完问题,我回去写的,1.9.0 HAL库自带函数 串口空闲中断DMA实现

开I cache , 关闭D cache和MPU, cache和MPU还没开始了解

不开cache MPU的话我测试了收发都没有问题。

你接收不到数据有没有.map下的文件,你的DMA缓冲区地址是多少,DMA是不能访问TCM SRAM的

你的DMA缓存区是不是地址被编译器分配到 TCM 的地址去了
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2021-9-2 07:58:02 | 显示全部楼层
px601 发表于 2021-9-1 22:13
没解决,波特率改了都不行

开了D-Cache和MPU 使用AXI-SRAM也实现了,收发没问题啊,不过我就一个串口1的DMA空闲中断收发
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-2 18:49:23 | 显示全部楼层
旮旯旭 发表于 2021-9-2 07:58
开了D-Cache和MPU 使用AXI-SRAM也实现了,收发没问题啊,不过我就一个串口1的DMA空闲中断收发

没有开D-chache ,接收缓冲是在0X240000地址段,属于DMA可以直接访问的范围。这个我通过在线调试功能直接察看了分配折地址  。MPU只是硬浮点运算功能,不会影响接收。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-2 19:28:00 | 显示全部楼层
旮旯旭 发表于 2021-9-2 07:58
开了D-Cache和MPU 使用AXI-SRAM也实现了,收发没问题啊,不过我就一个串口1的DMA空闲中断收发

没开D=Cache,接收变量在0X240000地址段,DMA可以直接访问。MPU是硬浮点运算没有关系。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-5 22:02:13 | 显示全部楼层
我用STM32CUBE 又做了一工程,只是串口空闲中断,两块板不同,一块是STM32H743VIH6,一块 是STM32H743VIT6。代码一样,前者是用串口8,后者是用串口2,晶振频率不同,但是串口的时钟频率我都调到都是120MHZ。其它的设置也一样,结果前都依然读不到数据,后者就可以。太奇怪了,难道STM32H743VIH6与STM32H743VIT6有很大差异?
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2021-9-6 08:03:08 | 显示全部楼层
px601 发表于 2021-9-5 22:02
我用STM32CUBE 又做了一工程,只是串口空闲中断,两块板不同,一块是STM32H743VIH6,一块 是STM32H743VIT6 ...

真的假的,你把H6的工程发上来看看。如果都没问题,是不是你板子是坏的
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2021-9-6 12:41:51 | 显示全部楼层
__HAL_UART_ENABLE_IT(&huart6,UART_IT_IDLE); 开启空闲中断
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2021-9-6 12:43:58 | 显示全部楼层
__HAL_UART_ENABLE_IT(&huart6,UART_IT_IDLE);开启空闲中断  
使用DMA后不用在使能接收中断
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-7 19:11:36 | 显示全部楼层
我把工程与 相关的几个文件传上来。让大家试试。

MAKE-3 .ioc

9.14 KB, 下载次数: 1

main.c

7.39 KB, 下载次数: 1

usart.c

5.23 KB, 下载次数: 1

stm32h7xx_it.c

12.4 KB, 下载次数: 1

stm32h743xx_flash.icf

1.56 KB, 下载次数: 0

回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-7 19:13:12 | 显示全部楼层
旮旯旭 发表于 2021-9-6 08:03
真的假的,你把H6的工程发上来看看。如果都没问题,是不是你板子是坏的

我发上来了。HAL是STM32Cube FW_H7 V1.9.0
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-7 19:17:48 | 显示全部楼层
上传的都是STM32H743VIH6工程的

stm32h7xx_hal_dma.c

68.58 KB, 下载次数: 1

stm32h7xx_hal_dma_ex.c

25.29 KB, 下载次数: 0

stm32h7xx_hal_uart.c

155.32 KB, 下载次数: 1

stm32h7xx_hal_uart_ex.c

34.67 KB, 下载次数: 0

回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-7 19:18:23 | 显示全部楼层
旮旯旭 发表于 2021-9-6 08:03
真的假的,你把H6的工程发上来看看。如果都没问题,是不是你板子是坏的

我试过SPI通讯读传感器正常,板应该没坏
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-7 19:27:43 | 显示全部楼层
点灯一流大师 发表于 2021-9-6 12:43
__HAL_UART_ENABLE_IT(&huart6,UART_IT_IDLE);开启空闲中断  
使用DMA后不用在使能接收中断

没有命名能接收中断,后来的代码改了。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-7 19:53:13 | 显示全部楼层
我还一度找了STM32H743的官司勘误手册对照了发现DMA_SxCR_TRBUFF要使能,我看了STM32Cube FW_H7 V1.9.0中的stm32h7xx_hal_dma.c,已经在HAL_DMA_Init函数中使能了。 registerValue |= DMA_SxCR_TRBUFF; 同时我可以确定的是我的STM32H743VIH6与STM32H743VIT6都是V版的。芯片上有印。
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
发表于 2021-9-8 11:11:06 | 显示全部楼层
在你接收数据后处理前,加个这个试试 SCB_CleanInvalidateDCache();
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2021-9-8 15:04:14 | 显示全部楼层
px601 发表于 2021-9-7 19:53
我还一度找了STM32H743的官司勘误手册对照了发现DMA_SxCR_TRBUFF要使能,我看了STM32Cube FW_H7 V1.9.0中的 ...

我就奇怪了,为啥ST提供了 DMA 空闲中断接收的API 你不用,非要自己写呢?
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-8 15:21:07 来自手机 | 显示全部楼层
497356044 发表于 2021-9-8 11:11
在你接收数据后处理前,加个这个试试 SCB_CleanInvalidateDCache();

我没有用cache.数据存在0x240000范围,dma,cpu可以直接访问。
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2021-9-8 17:03:20 | 显示全部楼层
本帖最后由 旮旯旭 于 2021-9-8 17:40 编辑
px601 发表于 2021-9-8 15:21
我没有用cache.数据存在0x240000范围,dma,cpu可以直接访问。

既然用HAL库 ST提供了API,最好不要自己写了,即使自己写,你那个也太乱了

这个是我写的STM32V6 STM32F429 自己写的 DMA 空闲中断, 那个时候ST还没出API
STM32V6之串口HAL库串口空闲中断接收不定长字节代码实现 - STM32F429 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)

这个是我在STM32V7  STM32F743 用的ST出的API函数, 在callback回调里面获取标志位
STM32V7基于STM32CubeMX的串口空闲中断接收不定长数据实现(HAL库1.9.0自带函数实现) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)

建议你看明白ST相关的API,这样可以少走弯路,以后移植也简单。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-8 20:02:05 | 显示全部楼层
旮旯旭 发表于 2021-9-8 15:04
我就奇怪了,为啥ST提供了 DMA 空闲中断接收的API 你不用,非要自己写呢?

我就是用的HAL中的函数来接收数据  registerValue |= DMA_SxCR_TRBUFF;是HAL_DMA_Init函数中的。
回复

使用道具 举报

4

主题

19

回帖

31

积分

新手上路

积分
31
发表于 2021-9-9 10:25:48 | 显示全部楼层
px601 发表于 2021-9-8 15:21
我没有用cache.数据存在0x240000范围,dma,cpu可以直接访问。

...我知道  你加上试试
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-9 10:46:10 来自手机 | 显示全部楼层
旮旯旭 发表于 2021-9-8 17:03
既然用HAL库 ST提供了API,最好不要自己写了,即使自己写,你那个也太乱了

这个是我写的STM32V6 STM32 ...

你这个我有看过,之所以代码那么乱是我按网上别人的代码做的各种尝试,上面说过,这个代码在vit6是正常的,在vih6的板上就不正常了。你这个是用的事件回调,我那个是接收完成回调。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-9 14:15:15 来自手机 | 显示全部楼层
497356044 发表于 2021-9-9 10:25
...我知道  你加上试试

加上后,一样,反而连中断都进不了。
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-9-19 21:25:06 | 显示全部楼层
有人知道这个晶振频率一定是27MHZ?我怀疑晶振频率不对造成的
微信图片_20210919211914.jpg
回复

使用道具 举报

1

主题

26

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2021-10-1 15:50:40 | 显示全部楼层
问题解决就是晶振频率搞错了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 12:33 , Processed in 0.304193 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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