历史上的今天
今天是:2025年02月06日(星期四)
2021年02月06日 | MSP430单片机系列通用串行模块的I²C模式
2021-02-06 来源:eefocus
1、I²C概述
I²C总线是一种用于内部IC控制的具有多端控制能力的双线双向串行数据总线系统。能够用于替代标准的并行总线,连接各种集成电路和功能模块。I²C器件的应用能够减少电路间连线,减少电路板尺寸,降低硬件成本,并提高了系统可靠性。
虽然I²C总线始终与先进技术保持同步,但仍具有向下兼容性,高速模式下速度可达3.4Mbps,例如EEPROM和FLASH存储器。
I²C传输模块存在于MSP430F15/16X中,能够为MSP430和I²C兼容的设备互连提供接口。
I²C中关于设备的基本概念如下:
发送设备:发送数据到总线上的设备。
接收设备:从总线上接收数据的设备。
主设备:启动数据传送并产生时钟信号的设备。
从设备:被主器件寻址的设备。
I²C是一个多主总线,即它可以由多个互连的器件控制。所以任何一个设备都能像主控器一样工作,并控制总线。支持I²C的设备有微控制器,,A/D、D/A转换器,储存器,LCD控制器,LED驱动器,I/O端口扩展器以及实时时钟。在互连的系统中,每个设备都有自己的唯一地址,可以作为发送设备(LCD驱动器)、接收设备,或同时具有发送和接收功能(存储器)。根据设备是否必须启动数据传输还是仅仅被寻址的情况,发送设备或接收设备可以工作于主模式或从模式。
MSP430和有关设备互连如图1所示。
通常的I²C总线包括:
SCL:双向串行时钟线。
SDA:双向传输的串行数据线。
图1:I²C总线连接
由于SDA与SCL为双向 I/O 线,都是开漏极端(输出1时,为高阻状态),因此I²C总线上的所有设备的SDA和SCL引脚都要外接上拉电阻。
MSP430-I²C模块结构如图2所示。
图2:I²C模块结构
当SYNC和I²C都置位的情况下,串行通信模块USART0工作于I²C模式。由图2可见,MSP430-I²C模块包括时钟产生、数据发送和数据接收部件,它们通过大量的控制寄存器来实现灵活的I²C操作。
MSP430系列I²C模块的主要特征如下:
1)符合I²C规范。
字/字节格式传输;
7位或者10位设备寻址模式;
群呼;
开始/重新开始/停止;
多主传送/从接收模式;
多主接收/从发送模式;
主发送,从发送,主接收,从接收;
标准模式速度为100Kbps,快速模式速度可以达到400Kbps。
2)读写采用先进先出缓冲结构。
3)可编程时钟发生器。
4)16位数据访问可达到总线的最大吞吐率。
5)自动数据字节计算。
6)支持低功耗模式。
7)从接收根据检测到开始信号自动将MSP430从LPMx模式唤醒。
8)两个DMA触发源。
9)中断功能丰富。
10)只能用USART0实现I²C操作。
2、I²C模式
2.1 I²C的寻址模式
早期的I²C总线数据传输速率最高为I00Kbits/s,采用7位寻址。但是由于数据传输速率和应用功能的迅速增加,I²C总线也增强为快速模式(400Kb1ts/s)和10位寻址以满足更高速度和更大寻址空间的需求。
MSP430-I²C模块支持7位和10位两种寻址模式,7位寻址模式最多寻址128个设备,10位寻址格式最多寻址1024个设备。12C总线理论上可以允许的最大设备数,是以总线上所有器件的电容总和不超过400pF为限(其中包括连线本身的电容和其连接端的引出电容),总线上所有器件要依靠SDA发送的地址信号寻址,不需要片选信号。
(1)7位寻址模式
图3所示为7位地址方式下I²C数据传输格式。第一个字节由7位从地址和R/W区(读/写位)组成,不论总线上传送地址信息还是数据信息,每个字节传输完毕接收设备都会发送响应位(ACK)。地址类信息传输之后是数据信息,直到接收到停止信号。
图3:7位寻址模式数据格式
(2)10位寻址模式
图4所示为10位地址方式下I²C数据传输格式。第一个字节由二进制位11110和从地址的最高两位以及读写控制位R/W组成,第一个字节传输完毕依然还是响应位,第二个字节就是10位从地址的低8位,后面是响应位和数据。
图4:10位寻址模式数据格式
(3)二次发送从地址模式(重复产生起始信号)
主设备可以在不停止传输的情况下改变SDA上传输的数据流方向,方法就是主设备再次发送开始信号,并重新发送从地址和读写控制位R/W。图5所示为重新产生起始信号数据传输格式。
图5:二次发送从地址模式数据格式
2.2 I²C模块传输特性
I²C模块能在两个设备之间传输信息,采用的方法是总线的电气特征、总线仲裁和时钟同步。
(1)电气特性
口起始位:SCL=1时,SDA上有下降沿。
口停止位:SCL=1时,SDA上有上升沿。
起始位之后总线被认为忙:有数据在传输。SCL为高电平的时候,SDA的数据必须保持稳定,否则由于起始位和停止位的电气边沿特性,SDA上数据发生改变将被识别成起始位或者停止位。所以只有当SCL为低电平的时候才允许SDA上的数据改变。停止位之后总线被认为空闲,空闲状态时SDA和SCL都是高电平。当一个字节发送或接收完毕需要CPU干预的时候,SCL一直保持为低。
起始位、停止位和数据位在SDA和SCL总线上的关系如图6所示。
图6:I²C模块数据传输
起始位和停止位都是主设备产生的,主设备为数据传输产生时钟信号:主设备在传输每个数据位时都会产生一个时钟脉冲,如图7所示。
图7:I²C总线上的位传输
(2)总线仲裁
当两个或多个主发送设备在总线上同时开始发送数据时,总线仲裁过程能够避免总线冲突,如图8所示。
当两个设备同时发出起始位进行数据传输时,相互竞争的设备使它们的时钟保持同步,正常发送数据。没有检测到冲突之前,每个设备都认为只有自己在使用总线。
图8:两个设备之间的仲裁过程
仲裁过程中使用的数据就是相互竞争的设备发送到SDA线上的数据。第一个检测到自己发送的数据和总线上数据不匹配的设备就失去仲裁能力。如果两个或更多的设备发送的第一个字节的内容相同,那么仲裁就发生在随后传输中。也许直到相互竞争的设备已经传输了许多字节后,仲裁才会完成。产生竞争的时候,如果某个设备当前发送位的二进制数值和前一个时钟节拍发送的内容相同,那么它在仲裁过程中就获得较高的优先级。图4中,第一个主发送设备产生的逻辑高电平被第二个主发送设备产生的逻辑低电平否决,因为前一个节拍总线上是低电平。失去仲裁的第一个主发送设备转变成从接收模式,并且设置仲裁失效中断标志ALIFG。
如果系统中有多个主设备,就必须用仲裁来避免总线冲突和数据丢失。
注童:仲裁不能发生在以下场合:
重复起始位和数据位之间。
停止位和数据位之间。
重复起始位和停止位之间。
(3)时钟同步
仲裁过程中,要对来自不同主设备的时钟进行同步处理。在SCL上第一个产生低电平的主设备强制其他主设备也发送低电平,SCL保持为低,如果某些主设备已经结束低电平状态,就开始等待,直到所有的主设备都结束低电平时钟,如图9所示。
同步过程某个快速设备的速度可能被其他设备降低。
图9:I²C上模块时钟同步
2.3 I²C上模块的传送模式
I²C模块的传送模式为主从式,对系统中的某一器件来说有4种可能的工作方式:主发送方式,从发送方式,主接收方式,从接收方式。
(1)主模式
在主模式,位I²CRM、I²CSTT和I²CSTP控制数据的发送和接收,如图10所示。
图10:I²C模块主模式操作
主模式用I²CNDAT支持自动数据字节计数。在I²C=0情况下,I²CNDAT被写入的值是将要发送或者接收的数据字节数。当相关的所有字节传输完毕之后,停止位能够自动产生。
注意:当I²CBB=1并且I²CRM=0时,不能改变I²CNDAT的值。
(2)从模式
在从模式,发送和接收操作都是由I²C模块自动控制的。
从接收模式:主设备每产生一个时钟脉冲,SDA总线上就能接收到串行数据位。
从发送模式:从设备接收到主机发送的匹配地址和主设备的数据接收请求后,主设备每产生一个时钟脉冲,从设备就向SDA总线上发送串行数据位。
虽然从设备不产生时钟信号,当一个字节接收或者发送完毕需要CPU干预时可以将SCL信号拉低。
注意:为了能够进行正确从模式操作,控制位I²CTRX必须被清除。
(3)I²C模块的中断
I²C模块的8个中断源共用一个中断向量,每个中断源有单独的中断使能控制位,当某个中断被允许,而且GIF置位,对应的中断标志会产生中断请求。I²C的中断事件如图11所示。
图11:I²C的中断事件
(4)I²C模块的DMA与中断操作
I²C模块提供了两个DMA触发源,准备接收和发送新数据时都可以触发DMA操作。TXDMAEN和RXDMAEN是I²C模块的DMA传输使能控制位。当RXDMAEN置位时,RXRDYIE被忽略,RXRDYIFG标志不能引发中断。当TXDMAEN置位时,TXRDYIE被忽略,TXRDYIFG标志不能引发中断。
3、I²C模块寄存器及相关操作
I²C模块有丰富的寄存器资源供用户使用,如图12所示。
图12:I²C模块的寄存器
下面分别介绍:
3.1 U0CTL,I²C模式下USART0控制寄存器
I²C模式只能由USART0实现,所以在MSP430F15/16X系列中,USART0控制寄存器的定义和其他系列定义之间有一些差别,各位定义如下:

RXDMAEN 接收DMA使能,当RXDMAEN置位时,允许I²C模块数据传送给DAM控制器,同时RXRDYIE位被自动清除。
0 禁止DMA操作;
1 使能DMA操作。
TXDMAEN 传送DMA使能,当TXDMAEN置位时,允许数据从DMA控制器传送到I²C模块,同时TXRDYIE位被自动清除。
0 禁止DMA操作;
1 使能DMA操作。
I²C I²C模式控制位,当SYNC=1时,选择I²C或者SPI模式。
0 SPI模式;
1 I²C模式。
XA 地址扩展位。
0 7位寻址方式;
1 10位寻址方式。
LISTEN 选择反馈模式,该位有效的条件:MST=1同时 I²CTRX=1(主机发送)。
0 正常模式(无反馈);
1 反馈模式(SDA数据由内部反馈给接收器)。
MST 主机、从机模式选择,当仲裁失效时,该位自动被清除。
0 从机模式;
1 主机模式。
I²CEN I²C模块使能控制,该位初始状态为置位,另外SWRST只对SPI或UART有效。当I²C和SYNC位在PUC后首次置位时,该位是I²CEN功能,并能被自动清除。
0 I²C操作被禁止;
1 I²C操作使能。
注意:在I²C模式下,设置I²CEN=0会产生如下影响:
I²C通信停止。
SDA和SCL都是高阻状态。
I²CTCTL的位3~0被清除,位4~7不变。
奇存器I²CDTCL、I²CDR被清除。
发送和接收数据寄存器被清除。
等存器U0CTL、I²CNDAT、I²CSCLL、I²CSCLH、I²COA、I²CSA、I²CIE、I²CIFG和I²CIV内容不变。
U0CTL在I²C模式的一些常见初始化操作如下:
(1)配置USART为I²C操作
USART可进行的传输模式有UART、SPI和I²C。所以在传输之前要正确选择模式,由U0CTL定义:SYNC=0选择UART模式,BIT5为SPB;SYNC=1选择SPI或I²C模式,BIT5为I²C。另外由I²C位来选择两种模式之一:复位为SPI模式,置位为I²C模式。具体设置如图13所示。
图13:USART模式选择控制
初始化之后,I²C模块为接收和发送数据做准备。如果清除I²CEN,I²C模块不能进行I²C操作。
(2)重新配置12c模块进行UART或者SPI操作
重新配置顺序:
清除I²C、I²CEN和SYNC位(CLR.B &U0CTL)。
设置SWRST位(MOV.B #SWRST,&U0CTL)。
进行UART或者SPI模式的初始化。
》》》在SWART=1情况下初始化所有USART寄存器(包括UxCTL):
通过特殊功能寄存器MEx使能USART模块(URXEx,UTXEx之一或全部);
软件清除SWRST位(BIC.B #SWRST,&UxCTL);
通过特殊功能寄存器IEx中断使能(URXIEx,UTXIEx之一或全部)(可选)。
(3)复位条件下配置I²C模式
配置顺序:
在SWRST=1情况下选择I²C模式(BIS.B #SYNC+I²C,&U0CTL)。
清除I²CEN位(BIC.B #I²CEN,&U0CTL)。
在I²C=0情况下重新配置I²C模块。
软件设置I²CEN(BIS.B #I²CEN,&U0CTL)。
注意:配置或者重新配置I²C模块,必须要在控制位I²C=0的条件下进行初始化。
3.2 I²CCTL,I²C传输控制寄存器
各位定义如下:

其中阴影部分只有在I²CEN=0时才能被修改。
I²CWORD 选择I²C数据寄存器是字节还是字模式。
0 字节模式;
1 字模式。
I²CCRM I²C重复模式控制位。
0 传输的字节数由寄存器I²CNDAT定义;
1 传输的字节数由软件设置。
I²CSSELx I²C时钟源选择位,当MST=1且仲裁失效时,外部的SCL信号自动被应用。
00 无时钟信号(I²C模块处于非活动状态);
01 ACLK;
10 SMCLK;
11 SMCLK。
I²CTRX 在MST=1(主机模式)时,该位选择I²C设备的操作类型是接收还是发送。当MST=0(从机模式)时,地址字节的R/W位用来定义数据传输方向,同时I²CTRX反映SDA引脚上的数据方向。
0 接收模式,SDA引脚接收数据;
1 发送模式,SDA引脚发送数据。
I²CSTB 当MST=1时,I²CSTB置位可以初始化一个开始字节。
0 无操作;
1 发送开始信号,开始字节(03H),没有结束信号。
I²CSTP 用来产生结束信号,结束信号发出后,I²CSTP自动被清除。
0 无信号;
1 发送结束信号。
I²CSTT 用来产生开始信号,开始信号产生后,I²CSTT仃自动被清除。
0 无信号;
1 发送开始信号。
3.3 I²CDCTL,I²C数据控制寄存器

Unused 没有定义,读出值为0。
I²CBUSY I²C模块是否空闲。
0 I²C模块空闲;
1 I²C模块忙。
I²CSCLLOW 当MSP430作为主机且没用作从机模式时,某个从设备将SCL线拉为低电平。
0 SCL没有被拉为低电平;
1 SCL被拉为低电平。
I²CSBD 该位选择接收寄存器的数据是字还是字节。当I²CWORD=1时,该位有效。
0 接收内容为一个字;
1 I²CDR的低字节数据有效(被接收)。
I²CTXUDF 标志I²C发送是否发生下溢。
0 没有发生下溢;
1 发生下溢。
I²CRXOVR 标志I²C接收是否发生上溢。
0 没有发生上溢;
1 发生上溢。
发送下溢:在主模式,当发送移位寄存器和发送缓冲器都空并且I²CNDAT>0时,会发生发送下溢。在从模式,当发送移位寄存器和发送缓冲器都为空并且另外的I²C主设备请求接收数据,会发生发送下溢,I²CTXUDF被置位。I²CTXUDF复位的方法:向I²CDR写入数据或者复位I²CEN。I²CTXUDF只能用在发送模式。
接收上溢:当接收移位寄存器和接收缓冲器满,接收上溢发生,I²CRXOVR被置位,SCL保持低电平,能够阻止总线的活动,因此发生上溢不会丢失数据。I²CRXOVR复位的方法:读取I²CDR的数据或者复位I²CEN。I²CRXOVR只能用在接收模式。
I²CBB 判断I²C总线是否忙。开始信号将该位置1,停止信号或I²CEN=0时,该位复位。
0 总线不忙;
1 总线忙。
3.4 I²CDR,I²C数据寄存器

通过位I²CWORD的控制柜,I²C数据寄存器可以被选择作为8位或者16位。图14就是I²C数据寄存器的功能。
图14:I²C数据寄存器的功能
3.5 I²CNDAT,I²C字节数寄存器
I²CNDAT 内容默认为字节数,当I²C模块工作于字模式时,该寄存器中的值必须为偶数。
当I²CBB=1时,该寄存器值为传输过程的字节数。
当I²CBB=0时,该寄存器值为将要传输的字节数。
注意:当I²CBB=1并且I²CRM=0时,不能修改I²CNDAT。
3.6 I²CPSC,I²C分频寄存器
I²C模块输入时钟分频后作为I²C模块的内部时钟。分频因子为I²CPSC的值加1。
000H 1分频
001H 2分频
......
0FFH 256分频
3.7 I²CSCLH,I²C时钟高电平调整寄存器
该寄存器为8位,当I²C模块工作于主模式,I²CSCLH和I²CPSC的值能够定义SCL上的高电平宽度。
高电平宽度=(I²CSCLH+2)×I²CPSC
000H SCL高电平宽度=5×I²CPSC
001H SCL高电平宽度=5×I²CPSC
002H SCL高电平宽度=5×I²CPSC
003H SCL高电平宽度=5×I²CPSC
004H SCL高电平宽度=6×I²CPSC
......
0FFH SCL高电平宽度=257×I²CPSC
I²CSCLH只有在I²CEN=0时候才能被修改。
3.8 I²CSCLL,I²C时钟低电平调整寄存器
该寄存器为8位,当I²C模块工作于主模式,I²CSCLL和I²CPSC的值能够定义SCL的低电平宽度。
低电平宽度=(I²CSCLL+2)×I²CPSC
000H SCL低电平宽度=5×I²CPSC
001H SCL低电平宽度=5×I²CPSC
002H SCL低电平宽度=5×I²CPSC
003H SCL低电平宽度=5×I²CPSC
004H SCL低电平宽度=6×I²CPSC
......
0FFH SCL低电平宽度=257×I²CPSC
I²CSCLL只有在I²CEN=0时候才能被修改。
I²C模块所用的时钟源由I²CSSELx控制位选择,寄存器I²CPSC、I²CSCLH和I²CSCLL决定主模式下SCL时钟频率,如图15所示。不论主模式还是从模式,I²C模块的时钟源频率至少为10倍的SCL频率。
图15:I²C模块SCL时钟产生
3.9 I²COA,I²C本地地址寄存器

I²COA内容为MSP430本地 I²C模块地址,有7位和10位两种地址格式, I²COA寄存器为右对齐,最高位分别为位6和位9。
3.10 I²CSA , I²C从设备地址寄存器

I²CSA内容为MSP430所寻址的外部设备地址, I²CSA只在主机模式才有效,格式同 I²COA。
3.11 I²CIE,I²C中断使能寄存器

STTIE 开始检测中断使能控制。
0 中断禁止;
1 中断使能。
GCIE 群呼中断使能控制。
0 中断禁止;
1 中断使能。
TXRDYIE 传送准备好中断使能控制,当TXDMANE=1时,该位自动被清除。
0 中断禁止;
1 中断使能。
RXRDYIE 接收准备好中断使能控制,当RXDMANE=1时,该位自动被清除。
0 中断禁止;
1 中断使能。
ARDYIE 访问准备好中断使能控制。
0 中断禁止;
1 中断使能。
OAIE 本地地址中断使能控制。
0 中断禁止;
1 中断使能。
NACKIE 没有响应中断使能控制。
0 中断禁止;
1 中断使能。
ALIE 仲裁失效中断控制。
0 中断禁止;
1 中断使能。
3.12 I²CIFG,I²C中断标志寄存器

STTIFG 开始检测中断请求标志。
0 没有中断请求;
1 有中断请求。
GCIFG 群呼中断请求标志。
0 没有中断请求;
1 有中断请求。
TXRDYIFG 传送准备好中断标志。
0 没有中断请求;
1 有中断请求。
RXRDYIFG 接收准备好中断请求标志。
0 没有中断请求;
1 有中断请求。
ARDYIFG 访问准备好中断标志,图16为ARDYIFG置位条件。
图16:ARDYIFG置位条件
OAIFG 本地地址中断标志。
0 没有中断请求;
1 有中断请求。
NACKIFG 没有响应中断标志。
0 没有中断请求;
1 有中断请求。
ALIFG 仲裁失效中断标志。
0 没有中断请求;
1 有中断请求。
3.13 I²CIV中断向量寄存器
MSP430的I²C模块有8个中断标志,但只有一个中断向量。8个中断标志共用一个中断向量,中断向量寄存器内容决定当前哪个中断标志可以引起中断事件。
MSP430的I²C模块可以工作在低功耗模式下,只要I²C模块所需的内部时钟源出现,I²C模块就进入活动模式。
当I²C模块工作于从模式,即使没有出现内部时钟源,只要STTIE和GIE中断允许位置位,当I²C模块检测到起始位时,置位STTIFG中断标志,所以CPU被唤醒。此时,SCL保持为低,暂停总线的进一步活动。中断服务程序必须重新使能I²C的内部时钟源,这样I²C才能释放SCL使总线活动恢复正常。
4、I²C应用举例
例:通过I²C总线互连的两片MSP430F169之间的通信。
互连的两片MSP430F169简称主169和从169。
(1)主169读从169。其中从169发送的数据从0开始,依次递增(所用的时钟为默认值)。
实现上述功能代码如下:
/********************main函数********************/
#include "msp430x16x.h"
char RXData=0;
char TestData=0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P3SEL |= 0X0A; //端口P3作为I²C引脚
P1DIR |= 0X01; //P1.0输出
P1OUT &= ~0X01; //清楚P1.0
U0CTL |= I2C + SYNC; //推荐的初始化顺序
U0CTL &= ~I2CEN;
I2CTCTL |= I2CSSEL1; //SMCLK
I2CNDAT = 0X01; //读一个字节
I2CSA = 0X0048; //从地址048h
I2CIE = RXRDYIE; //使能RXRDYIFG中断
U0CTL |= I2CEN; //使能I²C
_EINT(); //使能总中断
while(1)
{
U0CTL |= MST; //主模式
I2CTCTL |= I2CSTT + I2CSTP; //初始化传输
_BIS_SR(CPUOff); //进入LPM0
P1OUT |= 0X01; //置位P1.0
if (TestData++ != RXData) break; //测试接收的数据
P1OUT &= ~0X01; //数据正确清除P1.0
}
while(1); //接收数据不正确
}
/********************I²C模块中断处理子程序********************/
#pragma vector = USART0TX_VECTOR
__interrupt void I2C_ISR(void)
{
switch(I2CIV)
{
case 0: break; //没有中断
case 2: break; //仲裁失效
case 4: break; //没有响应
case 6: break; //本地地址
case 8: break; //寄存器访问准备好
case 10: //接收准备好
RXData = I2CDRB; //接收数据
_BIC_SR_IRQ(CPUOff); //退出 LPM0
break;
case 12: break; //发送准备好
case 14: break; //群呼
case 16: break; //起始检测
}
}
接收数据正确则P1.0由1变为0,否则P1.0一直保持置位。可利用P1.0外接示波器来观察结果。
(2)从169读主169(要求同上)
实现此功能的代码如下:
/********************main函数********************/
#include "msp430x16x.h"
char TXData=0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P3SEL |= 0X0A;
U0CTL |= I2C + SYNC;
U0CTL &= ~I2CEN;
I2CTCTL |= I2CSSEL1;
I2COA = 0X0048;
I2CIE = TXRDYIE; //使能TXRDYIE中断
U0CTL |= I2CEN;
_BIS_SR(LMP0_bits + GIE);
}
/********************I²C模块中断处理子程序********************/
#pragma vector = USART0TX_VECTOR
__interrupt void I2C_ISR(void)
{
switch(I2CIV)
{
case 2: break;
case 4: break;
史海拾趣
|
我只下到了第1章和第17章的pdf,其他章节找了很久没有找到,哪位高人有其他章节的电子版啊? 或者其他简单易懂的驱动入门教程,适合只有C/C++/Delphi基础的新手学习也行啊… 查看全部问答> |
|
关于mobile GPS地图导航 有做过mobile GPS地图导航的吗?有哪几种地图可用?地图要花钱买吗?地图提供什么接口?怎么样把地图和地球坐标连接起来?… 查看全部问答> |
|
我在制作一个遥控小车。负责无线通信的是24L01,MEGA16为主控芯片,PWM信号经过与非门驱动L298控制直流电机。24L01的程序应经调试成功。 现在的问题是接通启动电机,会对MEGA16的IO口产生影响,貌似有某种规律的杂波,并且对24L01的数据读写造成影 ...… 查看全部问答> |
|
就是官网这个:http://www.stmicroelectronics.com.cn/stonline/mcu/images/STM3210xReference.pdfpdf文件怎么没加 bookmark啊… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 04:01 编辑 各位还在为电赛而奋斗的战友们记得要保重身体~~~比赛已经过半,后面还有很多战斗要打。熬夜的哥们儿姐妹儿们千万要注意休息,祝大家思绪泉涌,各种人品爆发~~~~~~~最后把小宇宙也爆发了吧… 查看全部问答> |




