OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2745|回复: 6

谁有ucosii串口2的程序,发我一份,谢谢!

[复制链接]

43

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2014-8-17
在线时间
87 小时
发表于 2016-4-12 12:58:01 | 显示全部楼层 |阅读模式
1金钱
谁有ucosii串口2的程序,发我一份,谢谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3308
金钱
3308
注册时间
2013-4-10
在线时间
328 小时
发表于 2016-4-12 19:58:30 | 显示全部楼层
本帖最后由 likunxue 于 2016-4-12 20:02 编辑

串口2的程序好像跟有没有用UCOS是一样的啊, 有UCOS的最多在中断函数里加上 中断调度指令就行了吧!
我倒是有一个485通信的,你自已看看,我用在设备上2年了,没有出现过问题

/**************************************************************************************                 
模块名称: RS485驱动代码(第七代自动机)
文件名称: RS485.C
版    本: V1.0
说    明:
日    期: 2013年5月17日  
作    者: likunxue
C  P  U : STM32F103ZE 主频: 72MHz
Copyright (C), 2013-2020, 贵州惠水昶达数控有限公司
修改记录: 2013年9月2号修改为新主板 支持UCOS操作系统
**************************************************************************************/
#include "sys.h"                    
#include "rs485.h"         
#include "delay.h"
#include "MOTOR.H"                     //步进电机配置头文件
#include "CanShuSheZhi.H"              //机台参设置函数部份
#include "malloc.h"                       //内存管理

#if SYSTEM_SUPPORT_UCOS                       //如果使用ucos,则包括下面的头文件即可
#include "includes.h"                       //ucos 使用
#include "APP_CFG.H"                   //工程项目文件
#endif

vu32 RX_Lang;                          //串口接收的32位参数
vu16 RX_BYTE;                          //串口收到的16位参数
vu8 RX_DAT;                            //串口接收中的低7位数据寄存器
vu8 RX_QianZhiLing;                       //串口接收中的低位接收标志位
vu8 RX_STR;                            //串口接收缓存区指针
vu8 RX_OK;                             //串口接收完成标志寄存器
vu8 RX_Buf[SUA_SIZE];                  //串口接收缓存数据区
vu8 TX_Buf[SUA_SIZE];                  //串口2发送缓存区
/***************************************************************************************
函 数 名: DMA1的各通道配置
          这里的传输形式是固定的,这点要根据不同的情况来修改
          从存储器->外设模式/8位数据宽度/存储器增量模式
调    用: UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
参    数: DMA_CHxMA通道CHx
          cpar:外设地址
          cmar:存储器地址   
返 回 值: 无
***************************************************************************************/   
void UART_DMA_Config(u32 cpar,u32 cmar)
     {
     RCC->AHBENR |= 1<<0;                     //开启DMA1时钟
     delay_us(5);
     DMA1_Channel7->CPAR = cpar;              //DMA1 外设地址
     DMA1_Channel7->CMAR = cmar;             //DMA1,存储器地址         
     DMA1_Channel7->CCR = 0x00000000;             //复位     
     BIT_ADM(DMA1_Channel7->CCR, 4) = 1;     //从存储器读     
     BIT_ADM(DMA1_Channel7->CCR, 5) = 0;     //普通模式     
     BIT_ADM(DMA1_Channel7->CCR, 6) = 0;     //外设地址非增量模式     
     BIT_ADM(DMA1_Channel7->CCR, 7) = 1;     //存储器增量模式
     BIT_ADM(DMA1_Channel7->CCR, 8) = 0;     //外设数据宽度为8位
     BIT_ADM(DMA1_Channel7->CCR,10) = 0;     //存储器数据宽度8位
     BIT_ADM(DMA1_Channel7->CCR,12) = 1;     //中等优先级
     BIT_ADM(DMA1_Channel7->CCR,14) = 0;     //非存储器到存储器模式               
     }     
/*************************************************************************************
函 数 名: 初始化IO 串口2
调    用: 无
参    数: pclk1CLK1时钟频率(Mhz)
          bound:波特率
反 回 值: 无
**************************************************************************************/            
void RS485_Init(u32 pclk1,u32 bound)
     {           
     float temp;
     u16 i,mantissa,fraction;  
     for(i =0; i< SUA_SIZE; i++){RX_Buf = 0; TX_Buf = 0;}//接收缓存区
     RX_BYTE = 0;                     //串口收到的16位参数            
     RX_DAT = 0;                      //串口接收中的低7位数据寄存器
     RX_QianZhiLing = 0;              //串口接收中的低位接收标志位
     RX_STR = 0;                      //串口接收缓存区指针
     RX_OK = 0;                       //串口接收完成标志寄存器
     temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
     mantissa=temp;                      //得到整数部分
     fraction=(temp-mantissa)*16;     //得到小数部分         
     mantissa<<=4;
     mantissa+=fraction;
     RCC->APB2ENR |= 1<<2;                 //使能PORTA口时钟  
     GPIOA->CRL &= 0xFFFF00FF;              //IO状态设置
     GPIOA->CRL |= 0x00008B00;              //IO状态设置
     GPIOA->ODR |= 1<<3;              //置上拉
     RCC->APB2ENR |= 1<<4;            //使能外设PORTC时钟
     GPIOC->CRL &= 0xffffff00;        //PC0,PC1设为输出
     GPIOC->CRL |= 0x00000033;   
     GPIOC->ODR |= 1<<0;              //置上拉,初始化高电平
     GPIOC->ODR |= 1<<1;              //置上拉,初始化高电平
     RCC->APB1ENR |= 1<<17;                //使能串口时钟
     RCC->APB1RSTR |= 1<<17;          //复位串口2
     RCC->APB1RSTR &= ~(1<<17);       //停止复位                     
     //波特率设置
     USART2->BRR=mantissa;               //波特率设置
     USART2->CR1 |= 1<<13;            //串口2使能(UE,USATR)
     USART2->CR1 |= 1<<2;             //接收使能(RE)
     USART2->CR1 |= 1<<3;             //发送使能(TE)
     USART2->CR1 |= 1<<8;             //PE中断使能
     USART2->CR1 |= 1<<5;             //接收缓冲区非空中断使能         
     USART2->CR3 = 1<<7;                 //使能串口2的DMA发送
     //DMA1通道7,外设为串口2,存储器为USART2_TX_BUF
     UART_DMA_Config((u32)&USART2->DR,(u32)TX_Buf); //初始化DMA
     MY_NVIC_Init(0,0,USART2_IRQn,4); //抢占5,子优先级0,组4  
     }
/*************************************************************************************
函 数 名: RS485中断接收函数(双字节指令模式)
调    用: 无
参    数: 无      
反 回 值: 无
自定义数据接收格式
**************************************************************************************/  
void USART2_IRQHandler(void)
     {           
     #if SYSTEM_SUPPORT_UCOS     //如果使用ucos,
     OSIntEnter();                 //进入中断            
     #endif      

     if(USART2->SR&(1<<5))       //接收到数据
       {  
       u8 K = USART2->DR;        //读取串口数据                 
       USART2->SR &= ~(1<<5);    //清中断接收标志位     
       if(K < 0x80){RX_DAT = K;RX_QianZhiLing = 0xE5;}//数据低7位
       else{
           u8 Bul = K & 0xf8;  //得到指令码         
           if(RX_QianZhiLing == 0XE5)  
             {  //双字节指令解码部份
             switch(Bul)
                   {  
                   case 0x80:{//是数据字节(0x80)
                             if(RX_STR >SUA_SIZE)RX_STR = 0;
                             RX_Buf[RX_STR ++ ]= (K <<7)+RX_DAT;//RX_BYTE;
                             }break;
                   case 0x88:{RX_STR = 0; RX_Buf[RX_STR ++] = (K <<7)+RX_DAT;}break;//多字节参数初始化
                   case 0x90:{//接收双字节数据包,10位有效数据
                             RX_BYTE = (((u16)(K & 0x07))<<7)|RX_DAT; //得到有效数据(10位)      
                             RX_OK = 0xE5; //置接收完成标志   
                             }break;
                   case 0x98:{//收到电机坐标值或编码器的状态值(双字节,16位)
                             RX_BYTE = (((((u16)(K & 0x07))<<7)|RX_DAT)<<8)+ RX_Buf[0]; //得到参数         
                             RX_OK = 0xE5;//置接收完成标志                        
                             }break;
                   case 0xA0:{//接收4个字节 32位
                             RX_Lang = (K <<7)+RX_DAT;
                             RX_Lang <<= 8;
                             RX_Lang |= RX_Buf[2];
                             RX_Lang <<= 8;
                             RX_Lang |= RX_Buf[1];
                             RX_Lang <<= 8;
                             RX_Lang |= RX_Buf[0];
                             RX_OK = 0xE5;//置接收完成标志
                             }break;
                   }
             }            
           RX_QianZhiLing = 0x80; //清标志位         
           }
       }
     #if SYSTEM_SUPPORT_UCOS      //如果使用ucos,
     OSIntExit();                 //触发任务切换软中断            
     #endif   

     }
/**************************************************************************************
函 数 名: 申请485总线使用权等待函数
调    用: SUA_ShiYongQuan(u32 JiShuQi)
参    数: JiShuQi 等待计数器
返 回 值: 无
说    明: 如果总线在使用中,则按给定的时间等待总线工作完成 然后再置使用标志位
          如果定时器2在工作中,禁止申请  
***************************************************************************************/      
void SUA_ShiYongQuan(void)
     {
     u8 err;  
     while(TIM_TR2 == 1);                  //电机工作期间,禁止申请485总线     
     OSMutexPend(sem_SUA,100,&err);        //申请互斥信号量,会在址一直等待
     if(err == OS_ERR_NONE )
       {
       while(DMA1_Channel7->CNDTR != 0);   //等待通道7传输完成      
       BIT_ADM(DMA1_Channel7->CCR ,0) = 0; //关闭DMA传输
       return;
       }
     else{
         OSMutexPost(sem_SUA);            //释放485使用权      
         ERR_BPPK("485总线占用超时了 ");            
         }
     }         
回复

使用道具 举报

43

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2014-8-17
在线时间
87 小时
 楼主| 发表于 2016-4-12 20:51:54 | 显示全部楼层
本帖最后由 stm32f103andarm 于 2016-4-12 21:21 编辑
likunxue 发表于 2016-4-12 19:58
串口2的程序好像跟有没有用UCOS是一样的啊, 有UCOS的最多在中断函数里加上 中断调度指令就行了吧!
我倒 ...

我也像你一样加了蓝色部分程序,还是不行,我测过我移植的ucosii应该能用的,我把代码贴出来了你帮忙看下呗,第一次玩ucosii,请多多指教


回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3308
金钱
3308
注册时间
2013-4-10
在线时间
328 小时
发表于 2016-4-12 20:58:46 | 显示全部楼层
stm32f103andarm 发表于 2016-4-12 20:51
我也像你一样加了蓝色部分程序,还是不行,我测过我移植的ucosii应该能用的,我把代码贴出来了你帮忙看下 ...

OK
回复

使用道具 举报

43

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2014-8-17
在线时间
87 小时
 楼主| 发表于 2016-4-12 21:13:36 | 显示全部楼层
本帖最后由 stm32f103andarm 于 2016-4-12 21:20 编辑

#include "delay.h"
#include "sys.h"
#include "usart2.h"
#include "stdarg.h"         
#include "stdio.h"         
#include "string.h"
#include "common.h"

#if SYSTEM_SUPPORT_OS
#include "includes.h"                  
#endif


__align(8) u8 USART2_TX_BUF[USART2_MAX_SEND_LEN];   
#ifdef USART2_RX_EN                                   

u8 USART2_RX_BUF[USART2_MAX_RECV_LEN];            


u16 USART2_RX_STA=0;        
void USART2_IRQHandler(void)
{
    u8 res;
#if SYSTEM_SUPPORT_OS      
    OSIntEnter();
#endif   
//   LED1=~LED1;        
    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
    {     

    res =USART_ReceiveData(USART2);        
        if(USART2_RX_STA<USART2_MAX_RECV_LEN)      
        {
            TIM_SetCounter(TIM4,0);                     
            if(USART2_RX_STA==0)TIM4_Set(1);        
            USART2_RX_BUF[USART2_RX_STA++]=res;      
        }else
        {
            USART2_RX_STA|=1<<15;                  
        }
    }   
#if SYSTEM_SUPPORT_OS  
    OSIntExit();                                               
#endif
}   
     
void USART2_Init(u32 bound)
{  
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

     USART_DeInit(USART2);  
         //USART2_TX   PA.2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    //USART2_RX      PA.3
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);  
   
    USART_InitStructure.USART_BaudRate = bound;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  
    USART_Init(USART2, &USART_InitStructure);
  

//    USART2->BRR=(pclk1*1000000)/(bound);   
    //USART2->CR1|=0X200C;      
    USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);     
    UART_DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)USART2_TX_BUF);
    USART_Cmd(USART2, ENABLE);                  
   
#ifdef USART2_RX_EN            

  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         
    NVIC_Init(&NVIC_InitStructure);   
    TIM4_Init(999,7199);      
    USART2_RX_STA=0;      
    TIM4_Set(0);           
#endif         

}

void u2_printf(char* fmt,...)  
{  
    va_list ap;
    va_start(ap,fmt);
    vsprintf((char*)USART2_TX_BUF,fmt,ap);
    va_end(ap);
    while(DMA_GetCurrDataCounter(DMA1_Channel7)!=0);   
    UART_DMA_Enable(DMA1_Channel7,strlen((const char*)USART2_TX_BUF));   
}
         
void TIM4_IRQHandler(void)
{     
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
    {                    
        USART2_RX_STA|=1<<15;  
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );
        TIM4_Set(0);      
    }        
}

void TIM4_Set(u8 sta)
{
    if(sta)
    {
      
        TIM_SetCounter(TIM4,0);
        TIM_Cmd(TIM4, ENABLE);   
    }else TIM_Cmd(TIM4, DISABLE);
}
      
void TIM4_Init(u16 arr,u16 psc)
{   
    NVIC_InitTypeDef NVIC_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
   
    //&#182;¨&#202;±&#198;÷TIM3&#179;&#245;&#202;&#188;&#187;&#175;
    TIM_TimeBaseStructure.TIM_Period = arr;
    TIM_TimeBaseStructure.TIM_Prescaler =psc;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );
           
    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;      
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         
    NVIC_Init(&NVIC_InitStructure);   
   
}
#endif         
  
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
{
    DMA_InitTypeDef DMA_InitStructure;
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);   
  DMA_DeInit(DMA_CHx);  
    DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;
    DMA_InitStructure.DMA_MemoryBaseAddr = cmar;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  
    DMA_InitStructure.DMA_BufferSize = 0;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA_CHx, &DMA_InitStructure);   
}

void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len)
{
    DMA_Cmd(DMA_CHx, DISABLE );     
    DMA_SetCurrDataCounter(DMA_CHx,len);
    DMA_Cmd(DMA_CHx, ENABLE);         
}      
                                   

回复

使用道具 举报

43

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2014-8-17
在线时间
87 小时
 楼主| 发表于 2016-4-12 21:23:38 | 显示全部楼层
本帖最后由 stm32f103andarm 于 2016-4-12 21:27 编辑

[mw_shl_code=applescript,true]#include "common.h"
#include "24l01.h"
#include "spi.h"
#include "string.h"
#include "includes.h"

OS_TMR   * tmr1;                        
u8 *p;
u8 constate=0;        
u8 Tx_Buf[32];

void main_task(void *pdata)
{        
        u8 i;
        u8 err;
  OS_CPU_SR cpu_sr=0;        
        u8 Rx_Buf[32];
        u8 tmp_buf[32]={"1234"};
        u8 tmp_buf1[10];
        u8 tmp_buf2[10];        

  while(1)
                {   
                        OS_ENTER_CRITICAL();
      u2_printf("%s",tmp_buf);
                        OS_EXIT_CRITICAL();
                        delay_ms(200);               
//                         atk_rm04_at_response(1);                        
                }
//                 myfree(p);               
}

void usart2_task(void *pdata)
{
        u16 rlen=0;
        char s1[5]="off";
        char s2[5]="open";
        while(1)
        {
          if(USART2_RX_STA&0X8000)               
                {  
                                rlen=USART2_RX_STA&0X7FFF;        
                                USART2_RX_BUF[rlen]=0;               
                                POINT_COLOR=BLUE;
                                LCD_Fill(30,145,239,319,WHITE);
                                Show_Str(30,145,180,190,USART2_RX_BUF,12,0);               
                                USART2_RX_STA=0;
                }
                delay_ms(10);
        }
}

void lianjie_task(void *pdata)
{
        static u8 t=24;
          u8 flag,flag1;
                OS_CPU_SR cpu_sr=0;
        while(1)
        {
         delay_ms(3000);
  }        
}[/mw_shl_code]



#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"
#include "usmart.h"
#include "malloc.h"
#include "24l01.h"
#include "fontupd.h"
#include "text.h"        
#include "common.h"
#include "usart2.h"        
#include "includes.h"



#define START_TASK_PRIO                              10

#define START_STK_SIZE                                  128

OS_STK START_TASK_STK[START_STK_SIZE];

void start_task(void *pdata);



#define USART2_TASK_PRIO        4

#define USART2_STK_SIZE         128

OS_STK USART2_TASK_STK[USART2_STK_SIZE];

void usart2_task(void *pdata);


#define MAIN_TASK_PRIO                               3

#define MAIN_STK_SIZE                                          128

OS_STK MAIN_TASK_STK[MAIN_STK_SIZE];

void main_task(void *pdata);



#define LIANJIE_TASK_PRIO                               2

#define LIANJIE_STK_SIZE                                          64

OS_STK LIANJIE_TASK_STK[LIANJIE_STK_SIZE];

void lianjie_task(void *pdata);      


// OS_EVENT * msg_key;                        

int main(void)
{           
        delay_init();                    
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   
        uart_init(115200);                                 
        LCD_Init();                                
        LED_Init();                 
        KEY_Init();                                
  NRF24L01_Init();            
         mem_init();                                    
  font_init();               
  atk_rm04_init();               
        atk_rm04_test();               
        OSInit();                                   
        OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );
        OSStart();
}

void start_task(void *pdata)
{
        OS_CPU_SR cpu_sr=0;
//         msg_key=OSMboxCreate((void*)0);               
//         OSStatInit();                                       
//         LED1=0;
        OS_ENTER_CRITICAL();               
        OSTaskCreate(main_task,(void *)0,(OS_STK*)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO);
        OSTaskCreate(usart2_task,(void *)0,(OS_STK*)&USART2_TASK_STK[USART2_STK_SIZE-1],USART2_TASK_PRIO);
        OSTaskCreate(lianjie_task,(void *)0,(OS_STK*)&LIANJIE_TASK_STK[LIANJIE_STK_SIZE-1],LIANJIE_TASK_PRIO);
        OSTaskSuspend(START_TASK_PRIO);        
        OS_EXIT_CRITICAL();                                
}

回复

使用道具 举报

43

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2014-8-17
在线时间
87 小时
 楼主| 发表于 2016-4-12 21:29:00 | 显示全部楼层
@likunxue 代码在上面了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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