910|3

41

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

航芯ACM32G103开发板评测 08 ADC Timer外设测试 [复制链接]

 

本帖最后由 みずじ 于 2024-1-31 17:26 编辑

航芯ACM32G103开发板评测 08 ADC Timer外设测试

1. 软硬件平台

  1. ACM32G103 Board开发板
  2. MDK-ARM Keil

2. 定时器Timer

在一般的MCU芯片中,定时器这个外设资源是非常重要的,一般可以分为SysTick定时器(系统滴答定时器)、常规定时器(基本定时器,通用定时器,高级定时器)、专用定时器(看门狗定时器,RTC)

在ACM32G103中有着丰富的定时器资源,还包括低功耗定时器lptimer,具体资源如下

基础定时器最简单,就只是普通的计数、定时功能。通用定时器在基础定时器的功能上,增加了输入捕获和输出比较等功能。高级定时器在通用定时器的功能上,造假了包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM)的功能。
接下来进行基本的定时器定时功能测试。在官方给的SPL库里面只有两个例程,感觉有点少,与stm32相比较,许多的库函数没有完善。原本打算使用HC-SR04超声波模块进行定时器测试,但是发现有不少问题,而且定时精度比较高就放弃了,以后有时间再看看吧,或者看看其他人的东西。

基本定时器包含一个16 位自动装载计数器,由各自的可编程预分频器驱动。

  1. //嵌套向量中断控制器配置
  2. void NVIC_Configuration(void)
  3. {
  4. NVIC_ClearPendingIRQ(TIM6_IRQn);
  5. NVIC_EnableIRQ(TIM6_IRQn);
  6. }
  7. //时钟配置使能
  8. void Clock_Configuration(void)
  9. {
  10. __RCC_TIM6_CLK_ENABLE();
  11. }

定时器配置函数
定时器的定时时间主要取决于预分频系数和定时周期。重要的参数Prescaler,Period
如果需要修改定时器定时时间,只需要修改
TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)500 - 1;// 500ms
修改为
TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)
1000 - 1;// 1000ms=1s

  1. void TIM6_Init(void)
  2. {
  3. uint32_t timer_clock;
  4. timer_clock = RCC_GetPCLK1Freq();
  5. if (RCC_GetHCLKFreq() != timer_clock)// if hclk/pclk != 1, then timer clk = pclk * 2
  6. {
  7. timer_clock =timer_clock << 1;
  8. }
  9. TIM_TimeBaseStructure.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  10. TIM_TimeBaseStructure.CounterMode = TIM_COUNTERMODE_UP;
  11. TIM_TimeBaseStructure.RepetitionCounter = 0;
  12. TIM_TimeBaseStructure.Prescaler = (timer_clock/TIM_CLOCK_FREQ) - 1;
  13. TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)*500 - 1;// 500ms
  14. TIM_TimeBase_Init(TIM6, &TIM_TimeBaseStructure);
  15. /* TIM IT enable */
  16. TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
  17. /* TIM6 enable counter */
  18. TIM_Cmd(TIM6, ENABLE);
  19. }

3.模数转换器ADC

1. ADC简介

将模拟信号(连续信号)转换为数字信号(离散信号)的器件就叫模数转换器(ADC)。
按原理可分为:并行比较型A/D转换器(FLASH ADC)、逐次比较型A/D转换器(SAR ADC)和双积分式A/D转换器(Double Integral ADC)。
A/D转换过程通常为4步:采样、保持、量化和编码。如图所示。

ADC的主要有三个性能指标:分辨率、转换时间和转换精度。

1.1 分辨率

分辨率:又称为转换精度,指ADC能分辨的最小电压,通常使用二进制有效位表示,反应了ADC对输入模拟量微小变化的分辨能力。当最大输入电压一定时,位数越多,量化单位越小,误差越小,分辨率越高。比如一个12位的ADC,参考电压为3.3V,则其能分辨的最小电压为:

1.2 转换时间

转换时间:其倒数为转换速率,指ADC从控制信号到来开始,到输出端得到稳定的数字信号所经历的时间。转换时间通常与ADC类型有关,双积分型ADC的转换时间一般为几十毫秒,属于低速ADC;逐次逼近型ADC的转换时间一般为几十微妙,属于中速ADC;并联比较型ADC的转换时间一般为几十纳秒,属于高速ADC。

1.3 转换精度

转换精度:指ADC输出的数字量所表示的模拟值与实际输入的模拟量之间的偏差,通常为1个或半个最小数字量的模拟变化量,表示为1LSB或1/2LSB。

2.ACM32G103 ADC资源

ACM32G103芯片有2个12位逐次逼近型ADC。ADC1与ADC2紧密耦合,可在双重模式下运行(ADC1 为主器件,ADC2为从器件)。

  1. 12 位分辨率,可配置10 位、8 位或6 位分辨率
  2. 转换速率最高可达3Msps
  3. 20 个可用通道,包括外部信号源和内部信号源

3. ADC初始化配置

首先需要定义需要使用的ADC 通道数量,以及具体的ADC 通道号。确定需要使用到的工作模式(独立模式、双ADC 模式、单端、差分或者是否支持DMA 等),设置ADC CLK,根据需求进行初始化配置。
ADC采集方式有下面四种:轮询方式,中断方式,外部触发方式,DMA 方式。
以DMA为案例进行处理。
ADC_DMA驱动函数

  1. void ADC_DMA_Drive_Iint(void)
  2. {
  3. ADC_GPIO_Config();//ADC_GPIO端口引脚初始化配置
  4. ADC_Common_Register_Config();//ADC通用寄存器配置
  5. ADC_Config();//ADC工作模式配置
  6. ADC_DMA_Config();//ADC_DMA请求配置
  7. ADC_RegularStart();//使能ADC,开始常规通道的转换
  8. }

ADC_GPIO端口引脚初始化配置

  1. void ADC_GPIO_Config(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStruct;
  4. __RCC_GPIOC_CLK_ENABLE();
  5. /* Configure ADC Channel_13 pin as analog input */
  6. GPIO_InitStruct.Pin = GPIO_PIN_3;
  7. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  8. GPIO_InitStruct.Pull = GPIO_NOPULL;
  9. GPIO_Init(GPIOC, &GPIO_InitStruct);
  10. }

ADC通用寄存器配置

  1. void ADC_Common_Register_Config(void)
  2. {
  3. ADC_CommonInitTypeDef ADC_CommonInitStructure;
  4. ADC_CommonInitStructure.ADC_Mode = ADC_MODE_INDEPENDENT;//双ADC模式选择
  5. ADC_CommonInitStructure.ADC_Prescaler = ADC_CLOCK_DIV4;//ADC_CLK分频选择
  6. ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAACCESSMODE_DISABLED;//双ADC下DMA功能选择
  7. ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;//2个采样阶段之间的延迟
  8. ADC_CommonInit(&ADC_CommonInitStructure);
  9. }

ADC工作模式配置

  1. void ADC_Config(void)
  2. {
  3. ADC_InitTypeDef ADC_InitStructure;
  4. ADC_InitStructure.ADC_Resolution = ADC_RESOLUTION_12B;//分辨率
  5. ADC_InitStructure.ADC_ContinuousConvMode = ADC_CONT_DISABLE;//连续转换模式
  6. ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//外部触发边沿选择
  7. ADC_InitStructure.ADC_ExternalTrigConv = ADC_EXTERNAL_TIG0;//触发模式
  8. ADC_InitStructure.ADC_DataAlign = ADC_DATAALIGN_RIGHT;//数据对齐
  9. ADC_InitStructure.ADC_NbrOfConversion = ADC_NUM;//规则通道序列长度 传输的数据长度为:每个通道采集30次 * 1个通道
  10. ADC_Init(ADCX, &ADC_InitStructure);
  11. //规则通道设置
  12. ADC_RegularChannelConfig(ADCX, ADC_CHANNEL_13, ADC_SEQUENCE_SQ1, ADC_SMP_CLOCK_320);
  13. }

ADC_DMA请求配置

  1. void ADC_DMA_Config(void)
  2. {
  3. __RCC_DMA1_CLK_ENABLE();
  4. DMA_BigEndianConfig(DMA1, DISABLE);
  5. DMA_DeInit(DMA1_Channel3);
  6. DMA_InitStruct.Mode = DMA_MODE_CIRCULAR;
  7. DMA_InitStruct.DataFlow = DMA_DATAFLOW_P2M;
  8. DMA_InitStruct.ReqID = DMA1_REQ0_ADC1;
  9. DMA_InitStruct.RawInt = DMA_RAWINT_ENABLE;
  10. DMA_InitStruct.SrcInc = DMA_SRCINC_DISABLE;
  11. DMA_InitStruct.DestInc = DMA_DESTINC_ENABLE;
  12. DMA_InitStruct.SrcWidth = DMA_SRCWIDTH_WORD;
  13. DMA_InitStruct.DestWidth = DMA_DESTWIDTH_WORD;
  14. DMA_InitStruct.SrcBurst = DMA_SRCBURST_1;
  15. DMA_InitStruct.DestBurst = DMA_DESTBURST_1;
  16. DMA_InitStruct.SrcAddr = (uint32_t)&ADC1->DR;
  17. DMA_InitStruct.DestAddr = (uint32_t)gadcBuffer;
  18. DMA_InitStruct.Size = 1;
  19. DMA_Init(DMA1_Channel3, &DMA_InitStruct);
  20. // Enable interrupt
  21. DMA_ClearFlag(DMA1_Channel3, DMA_FLAG_RTC);
  22. DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);
  23. // Enable NVIC IRQ
  24. NVIC_ClearPendingIRQ(DMA1_IRQn);
  25. NVIC_SetPriority(DMA1_IRQn, 0x00);
  26. NVIC_EnableIRQ(DMA1_IRQn);
  27. DMA_Cmd(DMA1_Channel3, ENABLE);
  28. }

使能ADC,开始常规通道的转换

  1. void ADC_RegularStart(void)
  2. {
  3. /* Enable ADC DMA mode */
  4. ADC_DMACmd(ADCX, ENABLE);
  5. /* Enable the ADC peripheral */
  6. ADC_Cmd(ADCX, ENABLE);
  7. /* Clear the SR register */
  8. ADC_ClearFlag(ADCX, ADC_IT_FLAG_ALL);
  9. /* Start conversion */
  10. ADC_SoftwareStartConv(ADCX);
  11. }

中断服务函数

  1. void DMA1_IRQHandler(void)
  2. {
  3. ADC_DMA_ITC_Callback();
  4. }
  5. void ADC_DMA_ITC_Callback(void)
  6. {
  7. /* Transfer complete interrupt */
  8. if (SET == DMA_GetFlagStatus(DMA1_Channel3, DMA_FLAG_TC))
  9. {
  10. gadc1ItcConunt = 1;
  11. DMA_ClearFlag(DMA1_Channel3, DMA_FLAG_TC);
  12. }
  13. }

4.测试

  1. Timer测试函数
  1. #define TIM_CLOCK_FREQ (10000)
  2. TIM_Base_InitTypeDef TIM_TimeBaseStructure;
  3. volatile uint32_t Timer_Update_Flag;
  4. void Clock_Configuration(void);
  5. void GPIO_Configuration(void);
  6. void NVIC_Configuration(void);
  7. void NVIC_Configuration(void)
  8. {
  9. NVIC_ClearPendingIRQ(TIM6_IRQn);
  10. NVIC_EnableIRQ(TIM6_IRQn);
  11. }
  12. void Clock_Configuration(void)
  13. {
  14. __RCC_TIM6_CLK_ENABLE();
  15. }
  16. void GPIO_Configuration(void)
  17. {
  18. // do nothing here
  19. }
  20. /************************************************************************
  21. * function : TIM6_Update_IRQ
  22. * Description: TIM6 user Interrupt Handler
  23. ************************************************************************/
  24. void TIM6_Update_IRQ(void)
  25. {
  26. if (TIM6->SR & TIMER_SR_UIF)
  27. {
  28. Timer_Update_Flag = 1;
  29. }
  30. }
  31. void TIM6_Init(void)
  32. {
  33. uint32_t timer_clock;
  34. timer_clock = RCC_GetPCLK1Freq();
  35. if (RCC_GetHCLKFreq() != timer_clock)// if hclk/pclk != 1, then timer clk = pclk * 2
  36. {
  37. timer_clock =timer_clock << 1;
  38. }
  39. TIM_TimeBaseStructure.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  40. TIM_TimeBaseStructure.CounterMode = TIM_COUNTERMODE_UP;
  41. TIM_TimeBaseStructure.RepetitionCounter = 0;
  42. TIM_TimeBaseStructure.Prescaler = (timer_clock/TIM_CLOCK_FREQ) - 1;
  43. TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)*500 - 1;// 500ms
  44. TIM_TimeBase_Init(TIM6, &TIM_TimeBaseStructure);
  45. /* TIM IT enable */
  46. TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
  47. /* TIM6 enable counter */
  48. TIM_Cmd(TIM6, ENABLE);
  49. }
  50. void Timer_Update_Test(void)
  51. {
  52. /* Module Clocks Configuration */
  53. Clock_Configuration();
  54. /* NVIC Configuration */
  55. NVIC_Configuration();
  56. Timer_Update_Flag = 0;
  57. TIM6_Init();
  58. while(1)
  59. {
  60. if(Timer_Update_Flag)
  61. {
  62. printfS("Timer Update Occurs\n");
  63. Timer_Update_Flag = 0;
  64. }
  65. }
  66. }
  1. ADC_DMA测试函数
  1. //采样通道数
  2. #define ADC_NUM (1)
  3. uint32_t gadcBuffer[ADC_NUM];
  4. static volatile uint32_t gadc1ItcConunt = 0;
  5. #define ADCX (ADC1)
  6. DMA_InitTypeDef DMA_InitStruct;//需配置为全局变量,不然DMA只会触发一次
  7. /******************************************************************************
  8. * @brief : DMA adc to memory transfer complete interrupt Callback.
  9. * @param : None
  10. * @return: None
  11. ******************************************************************************/
  12. void ADC_DMA_ITC_Callback(void)
  13. {
  14. /* Transfer complete interrupt */
  15. if (SET == DMA_GetFlagStatus(DMA1_Channel3, DMA_FLAG_TC))
  16. {
  17. gadc1ItcConunt = 1;
  18. DMA_ClearFlag(DMA1_Channel3, DMA_FLAG_TC);
  19. }
  20. }
  21. /******************************************************************************
  22. * @brief : ADC GPIO config.
  23. * @param : None
  24. * @return: None
  25. ******************************************************************************/
  26. void ADC_GPIO_Config(void)
  27. {
  28. GPIO_InitTypeDef GPIO_InitStruct;
  29. __RCC_GPIOC_CLK_ENABLE();
  30. /* Configure ADC Channel_13 pin as analog input */
  31. GPIO_InitStruct.Pin = GPIO_PIN_3;
  32. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  33. GPIO_InitStruct.Pull = GPIO_NOPULL;
  34. GPIO_Init(GPIOC, &GPIO_InitStruct);
  35. }
  36. /******************************************************************************
  37. * @brief : ADC Common register config.
  38. * @param : None
  39. * @return: None
  40. ******************************************************************************/
  41. void ADC_Common_Register_Config(void)
  42. {
  43. ADC_CommonInitTypeDef ADC_CommonInitStructure;
  44. ADC_CommonInitStructure.ADC_Mode = ADC_MODE_INDEPENDENT;//双ADC模式选择
  45. ADC_CommonInitStructure.ADC_Prescaler = ADC_CLOCK_DIV4;//ADC_CLK分频选择
  46. ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAACCESSMODE_DISABLED;//双ADC下DMA功能选择
  47. ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;//2个采样阶段之间的延迟
  48. ADC_CommonInit(&ADC_CommonInitStructure);
  49. }
  50. /******************************************************************************
  51. * @brief : ADC config.
  52. * @param : None
  53. * @return: None
  54. ******************************************************************************/
  55. void ADC_Config(void)
  56. {
  57. ADC_InitTypeDef ADC_InitStructure;
  58. ADC_InitStructure.ADC_Resolution = ADC_RESOLUTION_12B;//分辨率
  59. ADC_InitStructure.ADC_ContinuousConvMode = ADC_CONT_DISABLE;//连续转换模式
  60. ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//外部触发边沿选择
  61. ADC_InitStructure.ADC_ExternalTrigConv = ADC_EXTERNAL_TIG0;//触发模式
  62. ADC_InitStructure.ADC_DataAlign = ADC_DATAALIGN_RIGHT;//数据对齐
  63. ADC_InitStructure.ADC_NbrOfConversion = ADC_NUM;//规则通道序列长度 传输的数据长度为:每个通道采集30次 * 1个通道
  64. ADC_Init(ADCX, &ADC_InitStructure);
  65. //规则通道设置
  66. ADC_RegularChannelConfig(ADCX, ADC_CHANNEL_13, ADC_SEQUENCE_SQ1, ADC_SMP_CLOCK_320);
  67. }
  68. /******************************************************************************
  69. * @brief : ADC DMA config.
  70. * @param : None
  71. * @return: None
  72. ******************************************************************************/
  73. void ADC_DMA_Config(void)
  74. {
  75. __RCC_DMA1_CLK_ENABLE();
  76. DMA_BigEndianConfig(DMA1, DISABLE);
  77. DMA_DeInit(DMA1_Channel3);
  78. DMA_InitStruct.Mode = DMA_MODE_CIRCULAR;
  79. DMA_InitStruct.DataFlow = DMA_DATAFLOW_P2M;
  80. DMA_InitStruct.ReqID = DMA1_REQ0_ADC1;
  81. DMA_InitStruct.RawInt = DMA_RAWINT_ENABLE;
  82. DMA_InitStruct.SrcInc = DMA_SRCINC_DISABLE;
  83. DMA_InitStruct.DestInc = DMA_DESTINC_ENABLE;
  84. DMA_InitStruct.SrcWidth = DMA_SRCWIDTH_WORD;
  85. DMA_InitStruct.DestWidth = DMA_DESTWIDTH_WORD;
  86. DMA_InitStruct.SrcBurst = DMA_SRCBURST_1;
  87. DMA_InitStruct.DestBurst = DMA_DESTBURST_1;
  88. DMA_InitStruct.SrcAddr = (uint32_t)&ADC1->DR;
  89. DMA_InitStruct.DestAddr = (uint32_t)gadcBuffer;
  90. DMA_InitStruct.Size = 1;
  91. DMA_Init(DMA1_Channel3, &DMA_InitStruct);
  92. // Enable interrupt
  93. DMA_ClearFlag(DMA1_Channel3, DMA_FLAG_RTC);
  94. DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);
  95. // Enable NVIC IRQ
  96. NVIC_ClearPendingIRQ(DMA1_IRQn);
  97. NVIC_SetPriority(DMA1_IRQn, 0x00);
  98. NVIC_EnableIRQ(DMA1_IRQn);
  99. DMA_Cmd(DMA1_Channel3, ENABLE);
  100. }
  101. /******************************************************************************
  102. * @brief:Enable ADC, start conversion of regular channle
  103. * @param:None
  104. * @return: None
  105. ******************************************************************************/
  106. void ADC_RegularStart(void)
  107. {
  108. /* Enable ADC DMA mode */
  109. ADC_DMACmd(ADCX, ENABLE);
  110. /* Enable the ADC peripheral */
  111. ADC_Cmd(ADCX, ENABLE);
  112. /* Clear the SR register */
  113. ADC_ClearFlag(ADCX, ADC_IT_FLAG_ALL);
  114. /* Start conversion */
  115. ADC_SoftwareStartConv(ADCX);
  116. }
  117. void ADC_DMA_Drive_Iint(void)
  118. {
  119. ADC_GPIO_Config();
  120. ADC_Common_Register_Config();
  121. ADC_Config();
  122. ADC_DMA_Config();
  123. ADC_RegularStart();
  124. }
  125. /******************************************************************************
  126. * @brief : ADC function test.
  127. * @param : None
  128. * @return: None
  129. ******************************************************************************/
  130. void APP_ADC_Test(void)
  131. {
  132. uint32_t i;
  133. float vol=0.0;
  134. printfS("ADC DMA test \r\n");
  135. ADC_DMA_Drive_Iint();
  136. while(1)
  137. {
  138. ADC_SoftwareStartConv(ADCX);
  139. while(!gadc1ItcConunt);
  140. gadc1ItcConunt =0;
  141. for (i = 0; i < ADC_NUM; i++)
  142. {
  143. //printfS("Channel_%d = %d\r\n", ((gadcBuffer<i> >> 16) & 0xFF), (gadcBuffer<i> & 0xFFF));
  144. vol = (gadcBuffer<i>&0xFFF)*3.3/4095;
  145. printf("PA1 Voltage is: %0.1f V \r\n", vol);
  146. }
  147. DelayMs(1000);
  148. }
  149. }
  1. 测试结果

总结

上海航芯ACM32G103开发板评测基本上就完成了差不多了,其实应该也有不少东西要写的,但是能力有限制,加上同时评测的人内容的东西还是不少的,有许多的重复性内容,就不想重复写了,写太多也没有意思,总体上还是完成了基本上的评测,整体体验还可以,但是与STM32想比较起来,整个软件生态还是太差了,这可能就是国产MCU的常态吧,虽然芯片的性能可能不一定比国外大厂的差,但是软件生态还是有很大的差距,虽然有数据手册,参考手册,但里面的东西可能有不完整的情况,而且库函数的完善性也一般,官方HAL库较于SPL库,功能丰富一些。
航芯ACM32G103开发板评测 01-开箱及环境搭建流程
航芯ACM32G103开发板评测 02-GPIO输入输出测试(LED KEY)
航芯ACM32G103开发板评测 03 RT-Thread Nano移植 线程管理测试
航芯ACM32G103开发板评测 04 GC9A01 SPI-LCD 1.28圆形屏幕测试
航芯ACM32G103开发板评测 05 0.96寸 IIC接口 OLED模块显示
航芯ACM32G103开发板评测 06 1.28圆形屏幕 LVGL移植
航芯ACM32G103开发板评测 07 LVGL 温湿度环境数据显示
航芯ACM32G103开发板评测 08 ADC Timer外设测试

最新回复

非常感谢分享   详情 回复 发表于 2024-2-24 18:15
点赞 关注
 
 

回复
举报

6834

帖子

9

TA的资源

版主

沙发
 

就两个例程啊,确实有点少,至少也得带个捕获呀等等

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

7183

帖子

11

TA的资源

版主

板凳
 

评测辛苦了,期待有机会再贡献精彩作品。

 
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

4
 

非常感谢分享

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
ADI 有奖直播报名中~
直播时间:3月27日(周四) 上午10:00-11:30
直播主题:易于驱动SAR型ADC的原理、优点及应用介绍
好礼等你拿~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 1

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表