世纪电源网社区logo
社区
Datasheet
标题
返回顶部
推荐
原创

个人原创|关于MCU编程的一些总结,希望对初学者有所帮助

  [复制链接]
查看: 8390 |回复: 54
1
yzpc05d_x04
  • 积分:5965
  • |
  • 主题:82
  • |
  • 帖子:1030
积分:5965
版主
  • 2020-3-20 16:37:07
1、什么是8位,16位,32位单片机一般情况下看各个MCU的寄存器的位数,字的长度,总线的宽度,或者每个地址的存储位数。
例如
1)32位的单片机,在系统.s文件里定义了堆栈大小是1024,那么这个堆栈是多大呢,答案是4k;
2)8位MCU的寄存器看手册,只有8个bit,而32位的MCU一般是32个bit;
当然选用几位机,需要看系统的具体参数要求以及成本。

2、关于结构体的定义在32位机中
如果一个结构体内部包含了8位数据,16位数据,32位数据,那么定义的时候尽量按照每32个字节打一个包开始定义;
据说在分配RAM时可以做到一整个Struct地址的完整性
例如
Struct test{
       INT8U   A;
       INT8U   B;
       INT8U   C;
       INT8U   D;

       INT32U   E;
       INT16U   F;
       INT16U   G;
};

3、对于一些特殊的变量或者标志位,请用宏定义,另外局部变量,全局变量,命名简单易懂的,这样程序交接维护起来方便;

4、位数据的解码,技巧;
例如:某个数据是通过uart口传送过来的,但是需要对其中的某些位进行解码,可以定义如下:
typedef union
{
       INT8U a;
       struct{
                 INT8U    ON:1;             //开关机状态;
                 INT8U    Status:5;        //状态位;
                 INT8U    NoUse:3;        //预留未用;
       }Bits;
}ComData;
如上可以对数据中的位进行很好的解码;

5、中断接收数据的数组最好定义为Volatile,这样这个数据就不会被优化,以保证数据的实时更新性;

6、对于一些重要的局部变量或者函数最好使用Staic进行修饰,这样这些数据就具有保存特性,同时限定了其使用范围,只在本函数或者C文件中;

7、关于全局变量extern的用法,建议在需要用的c文件处进行extern,这样可以一定程度的避免该全局变量过度曝光,导致数据莫名错误。
以下内容来源网络:
1)能不用全局变量尽量不用,我想除了系统状态和控制参数、通信处理和一些需要效率的模块,其他的基本可以靠合理的软件分层和编程技巧来解决。
2)如果不可避免需要用到,那能藏多深就藏多深。
(1)如果只有某.c文件用,就static到该文件中,顺便把结构体定义也收进来;
(2)如果只有一个函数用,那就static到函数里面去;
(3)如果非要开放出去让人读取,那就用函数return出去,这样就是只读属性了;
(4)如果非要遭人蹂躏赋值,好吧,我开放函数接口让你传参赋值;5)实在非要extern**我,我还可以严格控制包含我.h档的对象,而不是放到公共的includes.h中被人围观,丢人现眼。
3)全局变量是不可避免要用到的,每一个设备底层几乎都需要它来记录当前状态,控制时序,起承转合。但是尽量不要用来传递参数,这个很忌讳的。
4)尽量把变量的作用范围控制在使用它的模块里面,如果其他模块要访问,就开个读或写函数接口出来,严格控制访问范围。这一点,C++的private属性就是这么干的。这对将来程序的调试也很有好处。C语言之所以有++版本,很大原因就是为了控制它的灵活性,要说面向对象的思想,C语言早已有之,亦可实现。
5)当一个模块里面的全局变量超过3个(含)时,就用结构体包起来吧。要归0便一起归0,省得丢三落四的。
6)在函数里面开个静态的全局变量,全局数组,是不占用栈空间的。只是有些编译器对于大块的全局数组,会放到和一般变量不同的地址区。若是在keilC51,因为是静态编译,栈爆掉了会报警,所以大可以尽情驰骋,注意交通规则就是了。

8、数据的强制转换
两个低位数据合并强制转换为高位数据,例如两个16位数据合并成一个32位数据,需要将准备放到高位的数据先进行强制转换,后进行移位;
如果是将32位数据拆成16位,则高位转换需要先移位,再进行数据强制转换;


9、sizeof陷阱,如果sizeof一个字符串,其返回值一定会比真实的字符串数大一个,“\n”;

10、STM32以及在MDK里面段的划分。MDK下Code,RO-data,RW-data,ZI-data这几个段:
1) 内存不只分为堆和栈,还有静态存储区(全局变量,静态变量都是从这里分配的)
其中堆是用来分配动态内存的(也就是c中的malloc,free才需要的),如果没用到,堆设置为0也没问题
栈则是局部变量,函数形参所在的位置,当然栈中也可能保存运算的中间值
无论是局部常量,全局常量(包含宏定义,const变量)都保存在ROM中,内存管理虽然在CPrimer Plus中有,但讲的最细的还是<高质量 C++/C 编程指南> 第七章,你可以了解下
2)内存栈指向那里理解倒是没问题,不过你因为代码里面没用到malloc/free,所以编译器并没有分配堆空间,你可以自己在MAP文件看下。
3)code代码区,这就其实就是汇编指令的二进制代码
  RO-data只读数据,就是定义的const变量, 可能还包含一些全局宏,字符串等
  RW-data已初始化的全局变量,静态变量
  ZI-data包含栈、堆空间,未初始化的全局变量,静态变量

局部变量都是在栈里面的,注释不注释当然不会有变化,只要栈分配了,占据的空间就是固定的了我看了下,你代码里面是相互作用了,有些全局变量如果没有被使用到,编译器会直接给优化掉(这个volatile也是阻止不了的,你也可以全局在定义个变量,会发现编译结果没有变化),所以你这测试本身就存在问题。另外初始化为0的全局变量/静态变量,也会算到ZI区域,因此把ZI称为零初始化区域比未初始化区域更准确(可参考下面来自MDK手册的图片)

11、程序若出现变量偶然溢出或者出现错误值,可以打开map文件,找到对应的变量,将上下文中的变量空间进行拓展。
分析map,你会发现是堆和栈占用的,在startup_stm32f10x_md.s文件中,它的前面几行就有以上定义,这下该明白了吧。
Stack_Size   EQU   0x00000400
Heap_Size   EQU   0x00000200
对于一个C语言程序而言,内存空间主要由五个部分组成:代码段(.text)、数据段(.data)、静态区(.BSS)、堆和栈组成。
    BSS段:BSS段(bsssegment)通常是指用来存放程序中未初始化的全局变量和静态变量 (这里注意一个问题:一般的书上都会说全局变量和静态变量是会自动初始化的,那么哪来的未初始化的变量呢?变量的初始化可以分为显示初始化和隐式初始化,全局变量和静态变量如果程序员自己不初始化的话的确也会被初始化,那就是不管什么类型都初始化为0,这种没有显示初始化的就是我们这里所说的未初始化。既然都是0那么就没必要把每个0都存储起来,从而节省磁盘空间,这是BSS的主要作用)的一块内存区域。BSS是英文BlockStarted by Symbol的简称。BSS段属于静态内存分配。BSS节不包含任何数据,只是简单的维护开始和结束的地址,即总大小,以便内存区能在运行时分配并被有效地清零。BSS节在应用程序的二进制映象文件中并不存在,即不占用磁盘空间 而只在运行的时候占用内存空间 ,所以如果全局变量和静态变量未初始化那么其可执行文件要小很多。
    数据段:数据段(datasegment)通常是指用来存放程序中已初始化的全局变量和静态变量的一块内存区域。数据段属于静态内存分配,可以分为只读数据段和读写数据段。 字符串常量等,但一般都是放在只读数据段中 。
    代码段:代码段(code segment/textsegment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等,但一般都是放在只读数据段中 。
    栈区:由系统自动分配,栈区的分配运算内置于处理器的指令集,当函数执行结束时由系统自动释放。存放局部变量。栈的缺点是:容量有限,当相应的区间被释放时,局部变量不可再使用。查询栈容量的命令:ulimits-s。栈是一块连续的区域,向高地址扩展,栈顶和容量是事先约定好的。
    堆区:在程序的执行过程中才能分配,由程序员决定,编译器在编译时无法为他们分配空间,只有在程序运行时分配,所以被称为动态分配。堆是不连续的区域,向高地址扩展。由于系统用链表来描述空闲的地址空间,链表的遍历是由地地址向高地址的,故堆区是不连续的动态的存储空间。

12、RAM存放空间分部图:即先存放全局变量等,然后再开辟空间给栈stack存放局部变量,最后是堆heap空间;
64fc9639db4467489b9a4392e741b311.gif

yzpc05d_x04
  • 积分:5965
  • |
  • 主题:82
  • |
  • 帖子:1030
积分:5965
版主
  • 2020-3-20 17:36:43
 
附送一点经典书籍
C陷阱与缺陷.pdf (4.73 MB, 下载次数: 130)
admin
  • 积分:29457
  • |
  • 主题:2334
  • |
  • 帖子:8910
积分:29457
管理员
  • 2020-3-20 17:37:35
 
感谢版主分享。
bake_ql
  • 积分:3496
  • |
  • 主题:5
  • |
  • 帖子:531
积分:3496
LV8
副总工程师
  • 2020-3-20 21:22:02
 
写的很好的,实用
来时徘徊
  • 积分:1095
  • |
  • 主题:11
  • |
  • 帖子:117
积分:1095
LV6
高级工程师
  • 2020-3-23 23:41:12
 
感谢版主的分享,感谢!
admin
  • 积分:29457
  • |
  • 主题:2334
  • |
  • 帖子:8910
积分:29457
管理员
  • 2020-3-24 15:10:44
 
欢迎多多交流,分享
幕夏景年
  • 积分:127
  • |
  • 主题:0
  • |
  • 帖子:1
积分:127
LV2
本网技师
  • 2020-3-26 14:06:32
 
谢谢分享
myship02
  • 积分:8262
  • |
  • 主题:88
  • |
  • 帖子:3551
积分:8262
版主
  • 2020-4-8 15:59:57
 
感谢分享
cjzjm100
  • 积分:1394
  • |
  • 主题:0
  • |
  • 帖子:178
积分:1394
LV6
高级工程师
  • 2020-4-9 10:55:49
 
谢谢分享
木木很-shy
  • 积分:3599
  • |
  • 主题:1
  • |
  • 帖子:274
积分:3599
LV8
副总工程师
  • 2020-4-10 15:04:58
 
意犹未尽,待您继续更新
XIAOTU80
  • 积分:17020
  • |
  • 主题:364
  • |
  • 帖子:5452
积分:17020
版主
  • 2020-4-11 21:57:21
 
总结的不错,楼主目前常用哪种单片机,有没有对比总结一下,可以给我们讲讲
yzpc05d_x04
  • 积分:5965
  • |
  • 主题:82
  • |
  • 帖子:1030
积分:5965
版主
  • 2020-4-13 07:09:39
 
项目中涉及的单片机较少,基本是ST,NXP,Microchip;常用的是ST。
李诚建
  • 积分:271
  • |
  • 主题:8
  • |
  • 帖子:33
积分:271
LV3
助理工程师
  • 2020-4-20 13:53:42
 
曾经的我也是搞C语言的,现在转行了,C语言很有趣,我很喜欢
liyibiao
  • 积分:443
  • |
  • 主题:1
  • |
  • 帖子:25
积分:443
LV6
高级工程师
  • 2020-4-21 09:34:16
 
转成什么行业了!!

XIAOTU80
  • 积分:17020
  • |
  • 主题:364
  • |
  • 帖子:5452
积分:17020
版主
  • 2020-5-3 14:47:27
 
用STM那种单片机,优点成本低,基本功能都能实现,基本如何入手呢能否分享下经验
yzpc05d_x04
  • 积分:5965
  • |
  • 主题:82
  • |
  • 帖子:1030
积分:5965
版主
  • 2020-5-6 07:15:45
 
您好,感谢您的参与,个人觉得学习ST的MCU,刚开始,建议不要用库函数,但是可以看看,库函数的一些编码格式和封装方式还是值得学习的。
我建议刚开始先学习寄存器编程,这不仅仅对系统学习MCU有好处,而且锻炼了写驱动的能力。
因市面上其他单片机,有的不像ST那样把驱动全都封装成库函数,再者其他类外设驱动的编写也是通过指令直接操作寄存器的。
liaozhaocheng
  • 积分:7014
  • |
  • 主题:51
  • |
  • 帖子:1376
积分:7014
版主
  • 2020-5-28 19:13:01
 
多谢分享,我想要做一个充电器的输出控制,三段式,异常关断这些功能,有什么好推荐的吗?或者有什么案例可以分享一下程序
yzpc05d_x04
  • 积分:5965
  • |
  • 主题:82
  • |
  • 帖子:1030
积分:5965
版主
  • 2020-6-1 08:21:30
 
三段式:先恒流,再恒压,浮充/涓流;
以前的做法是结合硬件进行控制的,即一个电压控制环路,一个电流控制环路,然后是异常数字逻辑保护电路模式:
这种模式相对而言较为简单,易上手,具体实现办法是:
MCU+专用的PWM控制芯片+异常保护电路【此处异常是用于关断】;
MCU控制输出DA电压信号【恒压阶段的基准】,电流信号【恒流阶段的基准】,交给硬件电路去做哪个是第一阶段/恒流,哪个是第二阶段/恒压;MCU根据反馈电压电流,灵活调整控制基准,当采样到的电流值达到浮充门限时,MCU再给出浮充电压基准即可;
异常信号通过MOS将PWM芯片的控制基准拉低即可。

第二种控制方式就是纯软件控制了;
需要注意的是异常的输入响应速度,以及ADC的采样速率能否满足控制环路要求,调试可能会费点时间,不过省去了相关的PWM芯片成本相对较低。通过反馈电压电流值,判断当前所处阶段,根据各个阶段既定的额定值调频调宽即可。
liaozhaocheng
  • 积分:7014
  • |
  • 主题:51
  • |
  • 帖子:1376
积分:7014
版主
  • 2020-6-1 14:15:54
 
谢谢指导,如果是第一种方式,有没有MCU的实例分享一下,硬件那边还可以,主要是想学习一下编程以及看看适合做这个的MCU都有哪些?
yzpc05d_x04
  • 积分:5965
  • |
  • 主题:82
  • |
  • 帖子:1030
积分:5965
版主
  • 2020-6-1 15:33:12
 
5,6年前的工作的事了,代码早丢了。
MCU的主频,建议一般选择20倍以上的开关电源工作频率即可,如果涉及到较为复杂的算法,主频的倍数可能就要按照100倍去选,甚至更高,这个需要看算法的执行时间与电源闭环所占用的时间,两者之间需要进行匹配。
MCU支持ADC,PWM,EXIT功能即可。
liaozhaocheng
  • 积分:7014
  • |
  • 主题:51
  • |
  • 帖子:1376
积分:7014
版主
  • 2020-6-2 07:50:10
 
谢谢指点
yzpc05d_x04
  • 积分:5965
  • |
  • 主题:82
  • |
  • 帖子:1030
积分:5965
版主
  • 2020-6-2 08:34:42
 
BingSun
  • 积分:5274
  • |
  • 主题:17
  • |
  • 帖子:1079
积分:5274
LV8
副总工程师
  • 2020-7-3 00:23:24
 
最近写STM32F103
串口设置好后可以正常收发,但我想在中断里接收信号,这样可以节省CPU资源。
但无论什么玩我都进不了中断,那个参考手册只是简单介绍一下中断一此寄存器,这些什么用的???看了半天不明白,网上搜一搜,太多资料看花眼!!!

为省时间用了别人的代码!!!
NVIC_Init(3,3,USART3_IRQn,2);
我觉得这事可恨的是,参考手册没有详细说明,把相关细节丢给了一个叫M3编程手册档,虽然有详细介绍,但一时半会是难看懂了。

BingSun
  • 积分:5274
  • |
  • 主题:17
  • |
  • 帖子:1079
积分:5274
LV8
副总工程师
  • 2020-7-3 00:31:05
 
这次玩ST裸奔还是吃了不少亏!!!!
如果是新手,更应该用库文件,否则程序能否正常跑起来都是问题。
yzpc05d_x04
  • 积分:5965
  • |
  • 主题:82
  • |
  • 帖子:1030
积分:5965
版主
  • 2020-7-5 10:38:12
 
吃亏是福,能解决最好。看来资料没有找对。附件给你资料:链接:https://pan.baidu.com/s/1H6DYfz0uqtgE0l4PIo6rZA
提取码:5s8i
BingSun
  • 积分:5274
  • |
  • 主题:17
  • |
  • 帖子:1079
积分:5274
LV8
副总工程师
  • 2020-7-5 15:50:42
 
谢谢!!!
从两个角度出发:
1、没有很好的硬件功底,一时半会也难理解各寄存器详细说明。
2、编程思想中的车轮概念(用别人做好的轮子造自己的车)。

BingSun
  • 积分:5274
  • |
  • 主题:17
  • |
  • 帖子:1079
积分:5274
LV8
副总工程师
  • 2020-7-6 19:00:59
 
举个简单的例子
我最近用STM32F103 FLASH模拟EEPROM
封装完后主要有3个函数在调用:
1、void Flash_eep_inital(void);//这是一个初始化操作,里面需要指定操作的是哪页FLASH。//首次上电运行一次,后面就不再运行了。
2、void Write_Flash_data(u8 addr,u16 data);//将一个数存入到EEPROM中
3、u16 Read_Flash_data(u8 addr); //读出存于EEPROM中的数据。

自己花了大半天时间去写,如果用别人写好的,或者用库那就省很多时间了,特别是很难搞清内部是什么操作时,那就不要去搞清它,只管用就可以了。
BingSun
  • 积分:5274
  • |
  • 主题:17
  • |
  • 帖子:1079
积分:5274
LV8
副总工程师
  • 2020-7-3 00:42:36
 
回32楼!!!
这种三段充早期大多都是模拟芯片实现,现在虽然大多用单片机,其实还是模拟控制。
现在单片机不但便宜而且还内置运放与比较器等,就算取代以往358与393等,成本也不会增加太多,而且利用单片机PWM控制输出也方便很多。
countmoney
  • 积分:134
  • |
  • 主题:0
  • |
  • 帖子:2
积分:134
LV2
本网技师
  • 2020-4-23 14:38:02
 
多谢版主
top041376
  • 积分:3912
  • |
  • 主题:21
  • |
  • 帖子:101
积分:3912
LV8
副总工程师
  • 2020-4-29 16:34:24
 
这些都是经典的 谢谢分享           
ruoshui136
  • 积分:10938
  • |
  • 主题:288
  • |
  • 帖子:3544
积分:10938
LV10
总工程师
  • 2020-4-29 17:30:03
 
LZ有学习资料吗?能否帮忙共享下?
ruoshui136
  • 积分:10938
  • |
  • 主题:288
  • |
  • 帖子:3544
积分:10938
LV10
总工程师
  • 2020-5-4 08:53:54
 
yzpc05d_x04
  • 积分:5965
  • |
  • 主题:82
  • |
  • 帖子:1030
积分:5965
版主
  • 2020-5-6 07:11:55
 
您指哪方面的学习资料?
ruoshui136
  • 积分:10938
  • |
  • 主题:288
  • |
  • 帖子:3544
积分:10938
LV10
总工程师
  • 2020-5-29 15:57:19
 
就是单片机的编程的学习资料。
yzpc05d_x04
  • 积分:5965
  • |
  • 主题:82
  • |
  • 帖子:1030
积分:5965
版主
  • 2020-6-1 08:02:20
 
链接:https://pan.baidu.com/s/18_uIc_6dxxpWGhfea70Fsg
提取码:gx6c

基础级的
linhainpu
  • 积分:428
  • |
  • 主题:4
  • |
  • 帖子:84
积分:428
LV6
高级工程师
  • 2020-5-8 22:59:20
 
感谢版主分享。
sphinz
  • 积分:36
  • |
  • 主题:0
  • |
  • 帖子:3
积分:36
LV1
本网技工
  • 2020-7-13 12:15:35
 
这些都是经典的 谢谢分享           





skylinyk
  • 积分:135
  • |
  • 主题:0
  • |
  • 帖子:9
积分:135
LV2
本网技师
  • 2020-5-11 17:58:46
 
好贴,顶一下,谢谢分享
hpq916
  • hpq916
  • 离线
  • LV8
  • 副总工程师
  • 积分:5163
  • |
  • 主题:0
  • |
  • 帖子:97
积分:5163
LV8
副总工程师
  • 2020-5-13 11:04:18
 
单片机编程需要不断学习,不断实践,才能提高。
wspytu
  • 积分:172
  • |
  • 主题:0
  • |
  • 帖子:13
积分:172
LV2
本网技师
  • 2020-5-28 16:03:52
 
感谢分享,学习了
jisngfayang001
  • 积分:161
  • |
  • 主题:0
  • |
  • 帖子:13
积分:161
LV2
本网技师
  • 2020-5-29 20:05:23
 
很全面,谢谢楼主分享
jisngfayang001
  • 积分:161
  • |
  • 主题:0
  • |
  • 帖子:13
积分:161
LV2
本网技师
  • 2020-5-30 22:00:14
 
学习一下
luoliren206
  • 积分:644
  • |
  • 主题:15
  • |
  • 帖子:91
积分:644
LV6
高级工程师
  • 2020-7-6 17:37:41
 
不错的资料
scynliaogg
  • 积分:211
  • |
  • 主题:0
  • |
  • 帖子:11
积分:211
LV3
助理工程师
  • 2020-7-13 08:45:49
 
好资料,谢谢!
readlove1
  • 积分:180
  • |
  • 主题:0
  • |
  • 帖子:28
积分:180
LV2
本网技师
  • 2020-8-15 14:25:06
 
volatile的用法,应该几句话就能描述。一般在裸机程序中,一个变量在中断也用到,就要考虑到用volatile.跑系统,在任务之间用到的变量需要用到volatile.
朴华
  • 朴华
  • 离线
  • LV8
  • 副总工程师
  • 积分:3107
  • |
  • 主题:38
  • |
  • 帖子:1255
积分:3107
LV8
副总工程师
  • 2020-8-15 17:40:48
  • 倒数10
 
Thanks for your sharing.
BH4SQE
  • 积分:110
  • |
  • 主题:0
  • |
  • 帖子:2
积分:110
LV2
本网技师
  • 2020-9-4 10:34:16
  • 倒数9
 
好资料,谢谢!
XIAOTU80
  • 积分:17020
  • |
  • 主题:364
  • |
  • 帖子:5452
积分:17020
版主
  • 2020-9-5 15:49:53
  • 倒数8
 
好的经验可以继续分享总结一下
qq1227168228
  • 积分:163
  • |
  • 主题:0
  • |
  • 帖子:9
积分:163
LV2
本网技师
  • 2020-9-15 18:05:35
  • 倒数7
 
谢谢版主
liuxingyu365
  • 积分:146
  • |
  • 主题:1
  • |
  • 帖子:11
积分:146
LV2
本网技师
  • 2020-9-17 12:31:54
  • 倒数6
 
提示: 该帖被管理员或版主屏蔽
hhygz
  • hhygz
  • 离线
  • LV6
  • 高级工程师
  • 积分:1848
  • |
  • 主题:6
  • |
  • 帖子:114
积分:1848
LV6
高级工程师
  • 2020-9-21 13:20:54
  • 倒数5
 
使用STM32单片机编程,关于寄存器方面有什么记忆或使用窍门么?
yzpc05d_x04
  • 积分:5965
  • |
  • 主题:82
  • |
  • 帖子:1030
积分:5965
版主
最新回复
  • 2020-10-10 10:54:02
  • 倒数1
 
您好,这个关于寄存器的使用主要就是,查手册,或者找一本可靠的中文版寄存器应用手册。
其实寄存器方面的应用主要就是锻炼的底层驱动的能力。
lion9891
  • 积分:439
  • |
  • 主题:2
  • |
  • 帖子:35
积分:439
LV6
高级工程师
  • 2020-9-23 16:50:47
  • 倒数4
 
总结的很到位,值得学习!
sjw123360
  • 积分:329
  • |
  • 主题:1
  • |
  • 帖子:21
积分:329
LV4
初级工程师
  • 2020-9-24 10:43:34
  • 倒数3
 
没看明白是用的什么编程语言?汇编还是C语言
fanny20
  • 积分:111
  • |
  • 主题:0
  • |
  • 帖子:1
积分:111
LV2
本网技师
  • 2020-9-24 10:56:03
  • 倒数2
 
学习中
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦5层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)28285637 /(13823562357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报

Copyright 2008-2020 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348