[CW32F030系列] 【CW32F030FxPx StartKit开发板】+挂载新的电流传感模块并进行实测

[复制链接]
 楼主| suncat0504 发表于 2024-6-21 10:48 | 显示全部楼层 |阅读模式
本帖最后由 suncat0504 于 2024-6-21 10:51 编辑

#申请原创#
前次使用的电流传感器由于量程太大,找不到合适的被测试对象。在使用它测量普通的电池充电中,由于电流太小,对充电电流的采集结果,无法进行有效的判断,所以最终不得不放弃,转而采用另外一款电流传感器。
这款电流传感器为EVCS1802-S-05-00A。它的最大量程为5A。我的被测试对象,在正常工作时,充电电流在100mA以下,能否适用,需要通过实验确定。
图片1.png
接口很简单,只需要提供工作电压即可。测量输出结果由Vout输出。IP+和IP-接入被测量电路。
为了验证这块板子是否适用于电池充电,简单搭建了一个测试电路,测量Vout在充电过程中的变化。实测在被测试端电流在100mA时,Vout有1.7V的输出,而且数据很稳定。在充满电后,电压为V。
基于上述测试结果,确定使用CW32F030FxPx开发板的ADC功能,通过不断检测ADC的检测通道,监测来自电流传感器的电压,实现充满自动断电的功能。整个处理逻辑为:
1、检测到板载的用户按钮被按下,向特定GPIO口输出信号,启动继电器,使充电电路导通。
2、充电电路导通后,在一定时间内,检测充电电路的反馈信号(来自电流传感器)。如果信号有效,保持充电电路导通。否则关断充电电路。
3、在充电过程中,不断检测反馈信号,如果反馈信号电压降到一定程度,且保持一定时间,视为充电完成,关断充电电路。
按照上面这个逻辑,CW32F030FxPx开发板需要使用两个GPIO口,其中一个用于检测用户按钮,另一个用于控制继电器导通、关断。同时使用CW32F030FxPx开发板的PA01口作为ADC的检测通道,检测来自电流传感器板子的Vout。
目前,使用万用变的检测,发现我的充电装置在空载状态下,Vout输出为1.690V,在充电状态下为1.702V,差距很小,但好在比较稳定,因此用来作为判断依据应该是可行的。
主程序代码如下:
  1. /******************************************************************************
  2. * Include files
  3. ******************************************************************************/
  4. #include "main.h"
  5. #include "cw32f030_systick.h"
  6. #include "cw32f030_rcc.h"
  7. #include "cw32f030_gpio.h"
  8. #include "cw32f030_adc.h"

  9. /******************************************************************************
  10. * Local pre-processor symbols/macros ('#define')
  11. ******************************************************************************/
  12. //UARTx
  13. #define  DEBUG_USARTx                   CW_UART1
  14. #define  DEBUG_USART_CLK                RCC_APB2_PERIPH_UART1
  15. #define  DEBUG_USART_APBClkENx          RCC_APBPeriphClk_Enable2
  16. #define  DEBUG_USART_BaudRate           9600
  17. #define  DEBUG_USART_UclkFreq           8000000

  18. //UARTx GPIO
  19. #define  DEBUG_USART_GPIO_CLK           RCC_AHB_PERIPH_GPIOA
  20. #define  DEBUG_USART_TX_GPIO_PORT       CW_GPIOA   
  21. #define  DEBUG_USART_TX_GPIO_PIN        GPIO_PIN_8
  22. #define  DEBUG_USART_RX_GPIO_PORT       CW_GPIOA
  23. #define  DEBUG_USART_RX_GPIO_PIN        GPIO_PIN_9

  24. //GPIO AF
  25. #define  DEBUG_USART_AFTX               PA08_AFx_UART1TXD()
  26. #define  DEBUG_USART_AFRX               PA09_AFx_UART1RXD()

  27. //中断
  28. #define  DEBUG_USART_IRQ                UART1_IRQn

  29. #define  max_adc_cnt                        50  

  30. // 按键接口 PA5和PA6
  31. #define KEY_GPIO_PINS GPIO_PIN_5 | GPIO_PIN_6

  32. /******************************************************************************
  33. * Global variable definitions (declared in header file with 'extern')
  34. ******************************************************************************/
  35. uint16_t valueAdc;
  36. uint32_t valueAdcAcc;
  37. volatile uint8_t gFlagIrq;
  38. uint16_t gCntEoc = 0;                     // ADC转换次数
  39. uint16_t gCntAcc = 0;                     // ADC转换数据累加次数
  40. uint8_t cntSample;
  41. volatile uint8_t gKeyFlagIrq=0;

  42. uint16_t valueAllAdc[max_adc_cnt];        // 50组数据
  43. uint8_t  pos=0;                           // 保存数据的数组下表
  44. float maxval=0;                           // 未充电时最大值
  45. float stdval=0;                           // 未充电时最大值作为比较标准
  46. uint8_t chgflag=0;                        // 充电标志


  47. /******************************************************************************
  48. * Local type definitions ('typedef')
  49. ******************************************************************************/

  50. /******************************************************************************
  51. * Local function prototypes ('static')
  52. ******************************************************************************/
  53. void RCC_Configuration(void);
  54. void GPIO_Configuration(void);
  55. void UART_Configuration(void);
  56. void NVIC_Configuration(void);
  57. void USART_SendString(UART_TypeDef* USARTx, char *String);
  58. void adc_Init(void);
  59. void LED_Init(void);
  60. void init(void);

  61. /******************************************************************************
  62. * Local variable definitions ('static')                                      *
  63. ******************************************************************************/


  64. /******************************************************************************
  65. * Local pre-processor symbols/macros ('#define')
  66. ******************************************************************************/

  67. /*****************************************************************************
  68. * Function implementation - global ('extern') and local ('static')
  69. ******************************************************************************/
  70. /**
  71. * [url=home.php?mod=space&uid=247401]@brief[/url] 循环延时
  72. *
  73. * @param nCount
  74. */
  75. void Delay(__IO uint16_t nCount) {
  76.     /* Decrement nCount value */
  77.     while (nCount != 0) {
  78.         nCount--;
  79.     }
  80. }



  81. /**
  82. * [url=home.php?mod=space&uid=247401]@brief[/url] 配置RCC
  83. *
  84. */
  85. void RCC_Configuration(void) {
  86.   //SYSCLK = HSI = 8MHz = HCLK = PCLK
  87.   RCC_HSI_Enable(RCC_HSIOSC_DIV6);

  88.   //外设时钟使能
  89.   RCC_AHBPeriphClk_Enable(DEBUG_USART_GPIO_CLK, ENABLE);
  90.   DEBUG_USART_APBClkENx(DEBUG_USART_CLK, ENABLE);
  91. }
  92. /**
  93. * @brief 配置GPIO
  94. *
  95. */
  96. void GPIO_Configuration(void) {
  97.     GPIO_InitTypeDef GPIO_InitStructure;

  98.     //UART TX RX 复用
  99.     DEBUG_USART_AFTX;                     
  100.     DEBUG_USART_AFRX;                     

  101.     GPIO_InitStructure.Pins = DEBUG_USART_TX_GPIO_PIN;
  102.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
  103.     GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  104.     GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  105.     GPIO_InitStructure.Pins = DEBUG_USART_RX_GPIO_PIN;
  106.     GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
  107.     GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
  108.    
  109.    
  110.     __RCC_GPIOA_CLK_ENABLE();    // 使能GPIO的配置时钟
  111.     __RCC_GPIOB_CLK_ENABLE();

  112.     GPIO_InitStructure.IT = GPIO_IT_FALLING; //GPIO_IT_RISING | GPIO_IT_FALLING;  // 释放中断和按下中断
  113.     GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
  114.     GPIO_InitStructure.Pins = KEY_GPIO_PINS;
  115.     GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
  116.     GPIO_Init(CW_GPIOA, &GPIO_InitStructure);

  117.     //清除PA00中断标志并使能NVIC
  118.     GPIOA_INTFLAG_CLR(bv5| bv6);
  119.     NVIC_EnableIRQ(GPIOA_IRQn);
  120. }

  121. /**
  122. * @brief 配置UART
  123. *
  124. */
  125. void UART_Configuration(void) {
  126.   USART_InitTypeDef USART_InitStructure;

  127.   USART_InitStructure.USART_BaudRate = DEBUG_USART_BaudRate;
  128.   USART_InitStructure.USART_Over = USART_Over_16;
  129.   USART_InitStructure.USART_Source = USART_Source_PCLK;
  130.   USART_InitStructure.USART_UclkFreq = DEBUG_USART_UclkFreq;
  131.   USART_InitStructure.USART_StartBit = USART_StartBit_FE;
  132.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  133.   USART_InitStructure.USART_Parity = USART_Parity_No ;
  134.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  135.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  136.   USART_Init(DEBUG_USARTx, &USART_InitStructure);         
  137. }

  138. /**
  139. * @brief ADC I/O初始化
  140. *
  141. */
  142. void ADC_PortInit(void) {
  143.     //打开GPIO时钟
  144.     REGBITS_SET(CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOA_Msk);
  145.     //打开ADC时钟
  146.     REGBITS_SET(CW_SYSCTRL->APBEN2, SYSCTRL_APBEN2_ADC_Msk);
  147.     //set PA05 as AIN5 INPUT
  148.     PA01_ANALOG_ENABLE();
  149. }

  150. /**
  151. * @brief 配置NVIC
  152. *
  153. */
  154. void NVIC_Configuration(void) {
  155.   //优先级,无优先级分组
  156.   NVIC_SetPriority(DEBUG_USART_IRQ, 0);
  157.   //UARTx中断使能
  158.   NVIC_EnableIRQ(DEBUG_USART_IRQ);
  159. }

  160. /**
  161. * @brief 发送字符串
  162. *
  163. * @param USARTx :USARTx外设
  164. *        参数可以是:
  165. *           CW_UART1、CW_UART2、CW_UART3
  166. * @param String :待发送的字符串
  167. */
  168. void USART_SendString(UART_TypeDef* USARTx, char *String) {
  169.   while(*String != '\0') {
  170.     USART_SendData_8bit(USARTx, *String);
  171.     while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
  172.     String++;
  173.   }
  174.   while(USART_GetFlagStatus(USARTx, USART_FLAG_TXBUSY) == SET);
  175. }

  176. /******************************************************************************
  177. * EOF (not truncated)
  178. ******************************************************************************/
  179. #ifdef  USE_FULL_ASSERT
  180. /**
  181.   * @brief  Reports the name of the source file and the source line number
  182.   *         where the assert_param error has occurred.
  183.   * @param  file: pointer to the source file name
  184.   * @param  line: assert_param error line source number
  185.   * @retval None
  186.   */
  187. void assert_failed(uint8_t *file, uint32_t line)
  188. {
  189.   /* USER CODE BEGIN 6 */
  190.   /* User can add his own implementation to report the file name and line number,
  191.      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  192.   /* USER CODE END 6 */
  193. }
  194. #endif /* USE_FULL_ASSERT */

  195. void adc_Init(void) {
  196.     ADC_InitTypeDef ADC_InitStructure;
  197.     ADC_WdtTypeDef ADC_WdtStructure;
  198.     ADC_SingleChTypeDef ADC_SingleChStructure;
  199.     //配置ADC测试IO口
  200.     ADC_PortInit();

  201.     //ADC默认值初始化
  202.     ADC_StructInit(&ADC_InitStructure);
  203.     //ADC工作时钟配置
  204.     ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div1;
  205.     //ADC模拟看门狗通道初始化
  206.     ADC_WdtInit(&ADC_WdtStructure);
  207.     //配置单通道转换模式
  208.     ADC_SingleChStructure.ADC_DiscardEn = ADC_DiscardNull;
  209.     ADC_SingleChStructure.ADC_Chmux = ADC_ExInputCH1;    //选择ADC转换通道,AIN1:PA01
  210.     ADC_SingleChStructure.ADC_InitStruct = ADC_InitStructure;
  211.     ADC_SingleChStructure.ADC_WdtStruct = ADC_WdtStructure;
  212.     ADC_SingleChOneModeCfg(&ADC_SingleChStructure);
  213.     ADC_ITConfig(ADC_IT_EOC, ENABLE);
  214.    
  215.     ADC_EnableIrq(ADC_INT_PRIORITY);
  216.     ADC_ClearITPendingAll();
  217.    
  218.     // 设置参考电压
  219.     ADC_SetVref(ADC_Vref_BGR2p5);
  220. //ADC_SetVref(ADC_Vref_VDDA);
  221.    
  222.     //ADC使能
  223.     ADC_Enable();
  224.    
  225.     ADC_SoftwareStartConvCmd(ENABLE);
  226. }

  227. /**
  228. * @brief LED I/O初始化
  229. *
  230. */
  231. void LED_Init(void) {
  232.     GPIO_InitTypeDef  GPIO_InitStruct;
  233.     //打开GPIO时钟
  234.     REGBITS_SET(CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOB_Msk);
  235.     /* Configure the GPIO_LED pin */
  236.     GPIO_InitStruct.Pins = GPIO_PIN_1;
  237.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  238.     GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  239.     GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
  240.     //LEDs are off.
  241.     PB01_SETLOW();
  242. }


  243. // 初始化处理
  244. void init(void) {
  245.     //配置RCC
  246.     RCC_Configuration();

  247.     //配置GPIO
  248.     GPIO_Configuration();

  249.     //配置UART
  250.     UART_Configuration();

  251.     //配置NVIC
  252.     NVIC_Configuration();

  253.     //使能UARTx RC中断
  254.     USART_ITConfig(DEBUG_USARTx, USART_IT_RC, ENABLE);
  255.     //USART_SendString(DEBUG_USARTx, "\r\nCW32F030 UART Interrupt\r\n");

  256.     // LED初始化
  257.     LED_Init();
  258.    
  259.     // 配置ADC
  260.     adc_Init();
  261.    
  262.     OLED_Init();
  263. }

  264. /**
  265. * @brief Main function of project
  266. *
  267. * [url=home.php?mod=space&uid=266161]@return[/url] int
  268. */
  269. uint8_t test_pos=0;
  270. int main(void) {
  271.     float avg = 0;
  272.     uint8_t avgstr[8] = {'\0'};
  273.     float test[10];
  274.     uint8_t i=0;
  275.     uint8_t stopflag=0;              // 检查是否停止充电的标志
  276.    
  277.     init();
  278.    
  279.     // 清屏
  280.     OLED_Clear(0);
  281.     //GUI_ShowString(0, 0, (uint8_t*)"Start test...", 8, 1);

  282.     valueAdcAcc=0;
  283.     gCntAcc=0;
  284.     for (pos=0; pos<max_adc_cnt; pos++) {
  285.         valueAllAdc[pos]=0;
  286.     }
  287.     pos=0;
  288.     chgflag=0;
  289.     // 灭指示灯
  290.     PB01_SETLOW();
  291.     // 复位标准比较值
  292.     maxval = 0;
  293.     // 复位充电标志
  294.     chgflag = 0;   
  295.     while (1) {
  296.         // 等待转换完成
  297.         if (gFlagIrq & ADC_ISR_EOC_Msk) {
  298.             gFlagIrq = 0u;
  299.             valueAdc = ADC_GetConversionValue();
  300.             valueAllAdc[pos] = valueAdc;
  301.             pos++;

  302.             //if (flag>0 || pos == max_adc_cnt) {
  303.             if (pos == max_adc_cnt) {
  304.                 pos=0;
  305.                 valueAdcAcc=0;
  306.                 // 计算平均值
  307.                 for (i=0; i<max_adc_cnt; i++) {
  308.                     valueAdcAcc += valueAllAdc[i];
  309.                 }
  310.                 valueAdcAcc=valueAdcAcc;
  311.                
  312.                 // 换算为电压值
  313.                 avg = 2.5*valueAdcAcc/max_adc_cnt/4096;
  314.                 //GUI_ShowNum(0, 0, valueAdcAcc/max_adc_cnt, 8, 8, 1);
  315.                 sprintf((char *)avgstr, "%1.2f   ", avg);
  316.                 //GUI_ShowString(64, 0, avgstr, 8, 1);
  317.                 GUI_ShowString(0, 0, avgstr, 8, 1);
  318.                
  319.                 //
  320.                 if (chgflag == 0) {
  321.                     // 未充电状态下,取得最大值作为比较标准
  322.                     if (avg > maxval && (gKeyFlagIrq & 32) > 0) {
  323.                         gKeyFlagIrq = gKeyFlagIrq ^ 32;
  324.                         maxval = avg;
  325.                         sprintf((char *)avgstr, "%1.2f   ", maxval);
  326.                         GUI_ShowString(64, 0, avgstr, 8, 1);                        
  327.                     }
  328.                 } else {
  329.                     // 在充电状态下,通过和标准值进行比较,判断充电是否完成
  330.                     // 连续10组数据,都低于非充电标准数据,视为充电结束
  331.                     test[test_pos]=avg;
  332.                     test_pos++;
  333.                     if (test_pos==10) {
  334.                         stopflag=0;
  335.                         for (i=0; i<10; i++) {
  336.                             if (test[i]<=maxval) {
  337.                                 stopflag++;
  338.                             }
  339.                         }
  340.                         if (stopflag>=10) {
  341.                             // 充电完成
  342.                             GUI_ShowString(0, 8, (uint8_t *)"End      ", 8, 1);
  343.                            
  344.                             // 复位充电标志
  345.                             chgflag = 0;
  346.                         } else {
  347.                             GUI_ShowString(0, 8, (uint8_t *)"...      ", 8, 1);
  348.                         }
  349.                     }
  350.                     
  351.                 }
  352.             }

  353.             //PB01_TOG();
  354.             ADC_SoftwareStartConvCmd(ENABLE);    //启动下一次ADC转换
  355.         }
  356.         
  357.         // 检查按钮1是否按下
  358.         if ((gKeyFlagIrq & 64) > 0) {
  359.             //GUI_ShowString(0, 8, (uint8_t *)"Key1", 8, 1);
  360.             gKeyFlagIrq = gKeyFlagIrq ^ 64;
  361.             // 启动充电,用LED作为指示
  362.             GUI_ShowString(0, 8, (uint8_t *)"Start    ", 8, 1);
  363.             
  364.             sprintf((char *)avgstr, "%1.2f   ", maxval);
  365.             GUI_ShowString(64, 0, avgstr, 8, 1);
  366.             
  367.             // 初始化测试用数据数组下标
  368.             test_pos=0;
  369.             PB01_SETHIGH();
  370.             // 设置充电标志
  371.             chgflag = 1;
  372.         }
  373.     }
  374. }


  375. /**
  376. * @brief GPIOA中断函数
  377. *
  378. */
  379. void GPIOA_IRQHandlerCallback(void) {
  380.     if (CW_GPIOA->ISR_f.PIN5) {
  381.         // 设置标志位
  382.         gKeyFlagIrq = gKeyFlagIrq | 32;
  383.         GPIOA_INTFLAG_CLR(bv5);
  384.     }

  385.     if (CW_GPIOA->ISR_f.PIN6) {
  386.         // 设置标志位
  387.         gKeyFlagIrq = gKeyFlagIrq | 64;
  388.         GPIOA_INTFLAG_CLR(bv6);
  389.     }
  390. }


  391. /******************************************************************************
  392. * EOF (not truncated)
  393. ******************************************************************************/


用杜邦线简单搭建起来测试电路,编程,下载,复位开发板。
图片2.png

数据差距很小,用万用表测试Vout的电压变化最大在0.2V左右。确实太小了,用来做判断有点困难。为此在程序中加入了特殊处理。在按下开发板Key2按钮时,采集无电池状态下的最大电压数据,作为充电时的比较标准保存下来。按Key1启动充电过程,然后在充电过程中,不断采集Vout,并与之前的最大值比较,如果出现连续10次都低于无电池状态下的最大值,视为充电结束。
在没有电池的状态下,测试验证通过。然后加上电池进行测试。记过整个测试装置工作了一夜,到第二天上午,充电竟然还没有结束。不过这是至少证明了控制充电过程还是比较稳定的。就等充电结束后,是否可以正常结束了。充电过程中,电压最大可达到0.4V的差距,最小的时候和比较标准的最大值一致。
图片3.png
充电结束了,充电器的充电状态结束后,主控板的处理也显示为结束了。
不过有个疑问,为啥加入测试装置以后,充电过程变得如此缓慢了呢?不知道是不是电流检测板影响了充电电流。







szt1993 发表于 2024-7-22 13:26 | 显示全部楼层
采集芯片还是对通讯的使用
jf101 发表于 2024-7-22 14:50 | 显示全部楼层
楼主是使用的IO确定的?电平触发以及模拟量转换有具体的应用嘛?
liu96jp 发表于 2024-8-6 14:00 | 显示全部楼层
其实低电流的测量可以考虑用库仑计,也是可以的
kaif2n9j 发表于 2024-8-6 15:03 | 显示全部楼层
这个MPS的传感器是不是很贵啊?
q1d0mnx 发表于 2024-8-6 16:05 | 显示全部楼层
电流传感器和互感器有啥区别啊?是一个直流一个交流?
b5z1giu 发表于 2024-8-6 17:12 | 显示全部楼层
这种其实用ADC采集也是可以的,都不用非要用电流传感器测量吧
 楼主| suncat0504 发表于 2024-8-6 17:26 | 显示全部楼层
kaif2n9j 发表于 2024-8-6 15:03
这个MPS的传感器是不是很贵啊?

确实挺贵的
 楼主| suncat0504 发表于 2024-8-6 17:26 | 显示全部楼层
b5z1giu 发表于 2024-8-6 17:12
这种其实用ADC采集也是可以的,都不用非要用电流传感器测量吧

ADC采集的未必能准确探知充电状态
 楼主| suncat0504 发表于 2024-8-6 17:28 | 显示全部楼层
q1d0mnx 发表于 2024-8-6 16:05
电流传感器和互感器有啥区别啊?是一个直流一个交流?

互感器只能探测变化得电流。电流传感器,可交流,可直流。
 楼主| suncat0504 发表于 2024-8-6 17:28 | 显示全部楼层
liu96jp 发表于 2024-8-6 14:00
其实低电流的测量可以考虑用库仑计,也是可以的

准确度怎么样?库仑计能精确到什么级别的电流?
 楼主| suncat0504 发表于 2024-8-6 17:29 | 显示全部楼层
jf101 发表于 2024-7-22 14:50
楼主是使用的IO确定的?电平触发以及模拟量转换有具体的应用嘛?

就是爱好者,喜欢玩。
suw12q 发表于 2024-8-6 18:23 | 显示全部楼层
充电的话我觉得可以考虑用专用充电芯片就好了
tax2r6c 发表于 2024-8-6 19:28 | 显示全部楼层
这个Vout就是输出信号啊?然后用算法计算出电流?
zhizia4f 发表于 2024-8-7 08:10 | 显示全部楼层
还是用ADC吧,这个芯片感觉不便宜
ex7s4 发表于 2024-8-7 09:16 | 显示全部楼层
有点像电池保护芯片啊,哈哈
d1ng2x 发表于 2024-8-7 11:00 | 显示全部楼层
你这种电流传感器是串联进来的?
t1ngus4 发表于 2024-8-7 12:30 | 显示全部楼层
还是用个采样电阻,直接ADC采集,我觉得也和你这个操作一样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:大连伊飞特信息技术有限公司软件工程师
简介:本人于1993年毕业于大连理工大学。毕业后从事单片机开发工作5年,之后转入软件开发工作至今。

158

主题

4504

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:大连伊飞特信息技术有限公司软件工程师
简介:本人于1993年毕业于大连理工大学。毕业后从事单片机开发工作5年,之后转入软件开发工作至今。

158

主题

4504

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部