共2条
1/1 1 跳转至页
ARM2214,I2C,24LC64 请教:ARM2214怎样用硬件I2C读取24LC64。因为多个从地址!
问
24LC64多了个从地址,好象用硬件I2C不支持好象只支持24LC16呢?
答 1:
如果是标准的I2C器件,应该可以支持。您说的从地址是指内部地址还是I2C规定的地址?如果是I2C规定的地址,您在访问前应当知道访问那个地址,自己设置从机地址即可。如果是内部地址,有写数据方式写地址即可。
答 2:
谢谢,是内部地址呀,可我看数据手册或者资料上面都是以下格式呀 从地址(器件地址)+子地址(内部地址)+数据
可是我需要的是 从地址(器件地址)+子地址H(内部地址)+子地址L
(内部地址)+数据。 答 3: 不其中一个子地址当作数据发送即可。其实对于I2c规范来说,所有子地址都是按照数据方式发送的。函数仅仅是包装了一下 答 4: 一点疑问按数据把从地址送出,在写过程可以,但读过程呢? 答 5: 对呀,我现在正在想办法读呀?读好象不成功啊? 答 6: 用仿真器调一下这个象周功说的,当数据发,但得在程序里改一下,我就是这么改的。 答 7: 先写地址再读(操作两次)。 答 8: to zlgARM你的建议我试了,不通。
写程序完了,会有一个结束字符,在启动读程序,不行 答 9: 谢谢继续关注,我试过,读出了一字节,其他的读不出? 答 10: 关注中…… 答 11: 顶 答 12: 给二个例子给你们一个例子吧.
第一个例子不是用I2C中断来做的.
void delayMS(uint32 i)
{ uint32 j,add;
for(j=0;j<i;j++)
for(add=0;add<500;add++) ;
}
/*************************************************
º¯ÊýÃû³Æ£º startE2PROM
¼òÒªÃèÊö£º E2PROM¿ªÊ¼
ÊäÈ룺 void
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void startE2PROM(void)
{
IOCLR=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
IOSET=E2PROMSCL;
delayMS(1);
IOCLR=E2PROMSDA;
delayMS(1);
IOCLR=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
}
/*************************************************
º¯ÊýÃû³Æ£º endE2PROM
¼òÒªÃèÊö£º E2PROMÖÕÖ¹
ÊäÈ룺 void
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void endE2PROM(void)
{
IOCLR=E2PROMSCL;
delayMS(1);
IOCLR=E2PROMSDA;
delayMS(1);
IOSET=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
IOCLR=E2PROMSCL;
delayMS(1);
}
/*************************************************
º¯ÊýÃû³Æ£º ackE2PROM
¼òÒªÃèÊö£º E2PROMÖÕÖ¹
ÊäÈ룺 void
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void ackE2PROM(void)
{
IOCLR=E2PROMSDA;
delayMS(1);
IOSET=E2PROMSCL;
delayMS(1);
IOCLR=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
}
/*************************************************
º¯ÊýÃû³Æ£º noackE2PROM
¼òÒªÃèÊö£º E2PROMÖÕÖ¹
ÊäÈ룺 void
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void noackE2PROM(void)
{
IOSET=E2PROMSDA;
delayMS(1);
IOSET=E2PROMSCL;
delayMS(1);
IOCLR=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
}
/*************************************************
º¯ÊýÃû³Æ£º send_byte_to_E2PROM
¼òÒªÃèÊö£º ËÍ1byte µ½E2PROM
ÊäÈ룺 (uchar)val:ËùҪдÈëµÄÖµ
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void send_byte_to_E2PROM(uint8 val)
{
uint8 i =0;
for (i = 0;i < 8;i++)
{
IOCLR=E2PROMSCL;
delayMS(1);
if ((val & 0x80) == 0x80)
{
IOSET=E2PROMSDA;
}
else
{
IOCLR=E2PROMSDA;
}
delayMS(1);
val = val << 1;
IOSET=E2PROMSCL;
delayMS(1);
}
IOCLR=E2PROMSCL;
delayMS(1);
noackE2PROM();
}
/*************************************************
º¯ÊýÃû³Æ£º get_byte_from_E2PROM
¼òÒªÃèÊö£º ´ÓE2PROM¶ÁÒ»byte
ÊäÈ룺 void
Êä³ö£º (uchar)val :Ëù¶Á³öµÄÖµ
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
uint8 get_byte_from_E2PROM(void)
{
uint8 val = 0;
uint8 i = 0;
IOCLR=E2PROMSCL;
delayMS(1);
IODIR &= 0xfffffff7;//!E2PROMSDA;//ÉèÖÃÊäÈë
delayMS(1);
for (i = 0;i < 8;i++)
{
val = val << 1;
IOSET=E2PROMSCL;
delayMS(1);
if ( (IOPIN&E2PROMSDA) == E2PROMSDA)
{
val = val | 0x01;
}
else
{
val = val & 0xfe;
}
delayMS(1);
IOCLR=E2PROMSCL;
delayMS(1);
}
IODIR |= E2PROMSDA;//ÉèÖÃÊä³ö
return val;
}
/*************************************************
º¯ÊýÃû³Æ£º resetE2PROM
¼òÒªÃèÊö£º ³õ´ÎÉϵ縴λE2PROM
ÊäÈ룺 void
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void resetE2PROM(void)
{
IOCLR=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
startE2PROM();
endE2PROM();
}
/*************************************************
º¯ÊýÃû³Æ£º readE2PROM
¼òÒªÃèÊö£º ¶ÁE2PROM
ÊäÈ룺 (uint) addr:ËùÒª¶ÁµÄµØÖ·
(uchar) len : ËùÒª¶ÁµÄ³¤¶È
(uchar)highlow : ËùÒª¶ÁµÄÊǸßÇø»¹ÊǵÍÇø
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void readDataI2C(uint16 addr,uint8 len,uint8 *DATA)
{
uint8 i = 0;
uint16 temp_addr;
temp_addr=addr;
startE2PROM();
send_byte_to_E2PROM(EEWRITE);
send_byte_to_E2PROM(addr>>8);
addr=temp_addr;
send_byte_to_E2PROM(addr);
startE2PROM();
send_byte_to_E2PROM(EEREAD);
*DATA = get_byte_from_E2PROM();
DATA++;
for (i = 1;i < len;i++)
{
ackE2PROM();
*DATA = get_byte_from_E2PROM();
DATA++;
}
endE2PROM();
}
/*************************************************
º¯ÊýÃû³Æ£º writeE2PROM
¼òÒªÃèÊö£º дE2PROM
ÊäÈ룺 (uint) addr:ËùҪдµÄµØÖ·
(uchar) len : ËùҪдµÄ³¤¶È
(uchar)highlow : ËùҪдµÄÊǸßÇø»¹ÊǵÍÇø
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void writeDataI2C(uint16 addr,uint8 len,uint8 *DATA)
{
uint8 i = 0;
uint16 temp_addr;
temp_addr=addr;
startE2PROM();
send_byte_to_E2PROM(EEWRITE);
send_byte_to_E2PROM(addr>>8);
addr=temp_addr;
send_byte_to_E2PROM(addr);
for (i = 0;i <len;i++)
{
send_byte_to_E2PROM(*DATA);
DATA++;
}
endE2PROM();
delayMS(100);
}
下面这个例子是用I2C中断来做的
void __irq IRQ_I2C(void)
{ unsigned char sta;
CLOSEINT();
sta = I2STAT; // 读出I2C状态字
switch(sta)
{ case 0x08: // 己发送起始条件
if(1==I2C_suba_en) I2DAT = I2C_sla&0xFE; // 指定子地址读时,先写入地址
else I2DAT = I2C_sla; // 否则直接发送从机地址
I2CONCLR = 0x28; // SI=0
break;
case 0x10:
I2DAT = I2C_sla; // 重启动总线后,发送从地址
I2CONCLR = 0x28; // SI=0
break;
case 0x18: // 已发送SLA+W,并已接收应答
if(0==I2C_suba_en) // 无子地址,则直接发送数据
{ if(I2C_num>0)
{ I2DAT = *I2C_buf++;
I2CONCLR = 0x28;
I2C_num--;
}
else
{ I2CONSET = 0x10; // 无数据发送,结束总线
I2CONCLR = 0x28;
I2C_end = 1; // 设置总线操作结束标志
}
break;
}
if(1==I2C_suba_en) // 发送子地址
{ I2DAT = I2C_suba>>8;
I2CONCLR = 0x28;
I2C_suba_en = 3; //041009
}
if(2==I2C_suba_en)
{ I2DAT = I2C_suba>>8;
I2CONCLR = 0x28;
I2C_suba_en = 4; // 子地址己处理
}
break;
case 0x28: // 已发送I2C数据,并接收到应答
if(3==I2C_suba_en) // 发送子地址
{ I2DAT = I2C_suba;
I2CONCLR = 0x28;
I2C_suba_en = 1; //041009
break;
}
if(4==I2C_suba_en)
{ I2DAT = I2C_suba;
I2CONCLR = 0x28;
I2C_suba_en = 0; // 子地址己处理
break;
} //041009
if(0==I2C_suba_en) // 无子地址,则直接发送数据
{ if(I2C_num>0)
{ I2DAT = *I2C_buf++;
I2CONCLR = 0x28;
I2C_num--;
}
else
{ I2CONSET = 0x10; // 无数据发送,结束总线
I2CONCLR = 0x28;
I2C_end = 1;
}
break;
}
if(1==I2C_suba_en) // 若是指定地址读,则重新启动总线
{ I2CONSET = 0x20;
I2CONCLR = 0x18;
I2C_suba_en = 0; // 子地址己处理
}
break;
case 0x20:
case 0x30:
case 0x38:
I2CONCLR = 0x28; // 总线进入不可寻址从模式
I2C_end = 0xFF; // 总线出错,设置标志
break;
case 0x40: // 己发送SLA+R,并已接收到应答
if(1==I2C_num) // 最后一字节,接收数据后发送非应答信号
{ I2CONCLR = 0x2C; // AA=0,接收到数据后产生非应答
}
else // 接收数据并发送应答信号
{ I2CONSET = 0x04; // AA=1,接收到数据后产生应答
I2CONCLR = 0x28;
}
break;
case 0x50:
*I2C_buf++ = I2DAT; // 读取数据
I2C_num--;
if(1==I2C_num)
{ I2CONCLR = 0x2C; // AA=0,接收到数据后产生非应答
}
else
{ I2CONSET = 0x04; // AA=1,接收到数据后产生应答
I2CONCLR = 0x28;
}
break;
case 0x58:
*I2C_buf++ = I2DAT; // 读取最后一字节数据
I2CONSET = 0x10; // 结束总线
I2CONCLR = 0x28;
I2C_end = 1;
break;
case 0x48:
I2CONCLR = 0x28; // 总线进入不可寻址从模式
I2C_end = 0xFF;
break;
}
VICVectAddr = 0x00; // 中断处理结束
OPENINT();
}
答 13: 谢谢,先下了看看! 答 14: 给周开发板上配套的例子做一个接口程序,就行了,同时读写at24c64和pf8563(时钟),没有任何总是呀
可是我需要的是 从地址(器件地址)+子地址H(内部地址)+子地址L
(内部地址)+数据。 答 3: 不其中一个子地址当作数据发送即可。其实对于I2c规范来说,所有子地址都是按照数据方式发送的。函数仅仅是包装了一下 答 4: 一点疑问按数据把从地址送出,在写过程可以,但读过程呢? 答 5: 对呀,我现在正在想办法读呀?读好象不成功啊? 答 6: 用仿真器调一下这个象周功说的,当数据发,但得在程序里改一下,我就是这么改的。 答 7: 先写地址再读(操作两次)。 答 8: to zlgARM你的建议我试了,不通。
写程序完了,会有一个结束字符,在启动读程序,不行 答 9: 谢谢继续关注,我试过,读出了一字节,其他的读不出? 答 10: 关注中…… 答 11: 顶 答 12: 给二个例子给你们一个例子吧.
第一个例子不是用I2C中断来做的.
void delayMS(uint32 i)
{ uint32 j,add;
for(j=0;j<i;j++)
for(add=0;add<500;add++) ;
}
/*************************************************
º¯ÊýÃû³Æ£º startE2PROM
¼òÒªÃèÊö£º E2PROM¿ªÊ¼
ÊäÈ룺 void
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void startE2PROM(void)
{
IOCLR=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
IOSET=E2PROMSCL;
delayMS(1);
IOCLR=E2PROMSDA;
delayMS(1);
IOCLR=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
}
/*************************************************
º¯ÊýÃû³Æ£º endE2PROM
¼òÒªÃèÊö£º E2PROMÖÕÖ¹
ÊäÈ룺 void
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void endE2PROM(void)
{
IOCLR=E2PROMSCL;
delayMS(1);
IOCLR=E2PROMSDA;
delayMS(1);
IOSET=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
IOCLR=E2PROMSCL;
delayMS(1);
}
/*************************************************
º¯ÊýÃû³Æ£º ackE2PROM
¼òÒªÃèÊö£º E2PROMÖÕÖ¹
ÊäÈ룺 void
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void ackE2PROM(void)
{
IOCLR=E2PROMSDA;
delayMS(1);
IOSET=E2PROMSCL;
delayMS(1);
IOCLR=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
}
/*************************************************
º¯ÊýÃû³Æ£º noackE2PROM
¼òÒªÃèÊö£º E2PROMÖÕÖ¹
ÊäÈ룺 void
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void noackE2PROM(void)
{
IOSET=E2PROMSDA;
delayMS(1);
IOSET=E2PROMSCL;
delayMS(1);
IOCLR=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
}
/*************************************************
º¯ÊýÃû³Æ£º send_byte_to_E2PROM
¼òÒªÃèÊö£º ËÍ1byte µ½E2PROM
ÊäÈ룺 (uchar)val:ËùҪдÈëµÄÖµ
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void send_byte_to_E2PROM(uint8 val)
{
uint8 i =0;
for (i = 0;i < 8;i++)
{
IOCLR=E2PROMSCL;
delayMS(1);
if ((val & 0x80) == 0x80)
{
IOSET=E2PROMSDA;
}
else
{
IOCLR=E2PROMSDA;
}
delayMS(1);
val = val << 1;
IOSET=E2PROMSCL;
delayMS(1);
}
IOCLR=E2PROMSCL;
delayMS(1);
noackE2PROM();
}
/*************************************************
º¯ÊýÃû³Æ£º get_byte_from_E2PROM
¼òÒªÃèÊö£º ´ÓE2PROM¶ÁÒ»byte
ÊäÈ룺 void
Êä³ö£º (uchar)val :Ëù¶Á³öµÄÖµ
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
uint8 get_byte_from_E2PROM(void)
{
uint8 val = 0;
uint8 i = 0;
IOCLR=E2PROMSCL;
delayMS(1);
IODIR &= 0xfffffff7;//!E2PROMSDA;//ÉèÖÃÊäÈë
delayMS(1);
for (i = 0;i < 8;i++)
{
val = val << 1;
IOSET=E2PROMSCL;
delayMS(1);
if ( (IOPIN&E2PROMSDA) == E2PROMSDA)
{
val = val | 0x01;
}
else
{
val = val & 0xfe;
}
delayMS(1);
IOCLR=E2PROMSCL;
delayMS(1);
}
IODIR |= E2PROMSDA;//ÉèÖÃÊä³ö
return val;
}
/*************************************************
º¯ÊýÃû³Æ£º resetE2PROM
¼òÒªÃèÊö£º ³õ´ÎÉϵ縴λE2PROM
ÊäÈ룺 void
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void resetE2PROM(void)
{
IOCLR=E2PROMSCL;
delayMS(1);
IOSET=E2PROMSDA;
delayMS(1);
startE2PROM();
endE2PROM();
}
/*************************************************
º¯ÊýÃû³Æ£º readE2PROM
¼òÒªÃèÊö£º ¶ÁE2PROM
ÊäÈ룺 (uint) addr:ËùÒª¶ÁµÄµØÖ·
(uchar) len : ËùÒª¶ÁµÄ³¤¶È
(uchar)highlow : ËùÒª¶ÁµÄÊǸßÇø»¹ÊǵÍÇø
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void readDataI2C(uint16 addr,uint8 len,uint8 *DATA)
{
uint8 i = 0;
uint16 temp_addr;
temp_addr=addr;
startE2PROM();
send_byte_to_E2PROM(EEWRITE);
send_byte_to_E2PROM(addr>>8);
addr=temp_addr;
send_byte_to_E2PROM(addr);
startE2PROM();
send_byte_to_E2PROM(EEREAD);
*DATA = get_byte_from_E2PROM();
DATA++;
for (i = 1;i < len;i++)
{
ackE2PROM();
*DATA = get_byte_from_E2PROM();
DATA++;
}
endE2PROM();
}
/*************************************************
º¯ÊýÃû³Æ£º writeE2PROM
¼òÒªÃèÊö£º дE2PROM
ÊäÈ룺 (uint) addr:ËùҪдµÄµØÖ·
(uchar) len : ËùҪдµÄ³¤¶È
(uchar)highlow : ËùҪдµÄÊǸßÇø»¹ÊǵÍÇø
Êä³ö£º void
ÐÞ¸ÄÈÕÖ¾£º
*************************************************/
void writeDataI2C(uint16 addr,uint8 len,uint8 *DATA)
{
uint8 i = 0;
uint16 temp_addr;
temp_addr=addr;
startE2PROM();
send_byte_to_E2PROM(EEWRITE);
send_byte_to_E2PROM(addr>>8);
addr=temp_addr;
send_byte_to_E2PROM(addr);
for (i = 0;i <len;i++)
{
send_byte_to_E2PROM(*DATA);
DATA++;
}
endE2PROM();
delayMS(100);
}
下面这个例子是用I2C中断来做的
void __irq IRQ_I2C(void)
{ unsigned char sta;
CLOSEINT();
sta = I2STAT; // 读出I2C状态字
switch(sta)
{ case 0x08: // 己发送起始条件
if(1==I2C_suba_en) I2DAT = I2C_sla&0xFE; // 指定子地址读时,先写入地址
else I2DAT = I2C_sla; // 否则直接发送从机地址
I2CONCLR = 0x28; // SI=0
break;
case 0x10:
I2DAT = I2C_sla; // 重启动总线后,发送从地址
I2CONCLR = 0x28; // SI=0
break;
case 0x18: // 已发送SLA+W,并已接收应答
if(0==I2C_suba_en) // 无子地址,则直接发送数据
{ if(I2C_num>0)
{ I2DAT = *I2C_buf++;
I2CONCLR = 0x28;
I2C_num--;
}
else
{ I2CONSET = 0x10; // 无数据发送,结束总线
I2CONCLR = 0x28;
I2C_end = 1; // 设置总线操作结束标志
}
break;
}
if(1==I2C_suba_en) // 发送子地址
{ I2DAT = I2C_suba>>8;
I2CONCLR = 0x28;
I2C_suba_en = 3; //041009
}
if(2==I2C_suba_en)
{ I2DAT = I2C_suba>>8;
I2CONCLR = 0x28;
I2C_suba_en = 4; // 子地址己处理
}
break;
case 0x28: // 已发送I2C数据,并接收到应答
if(3==I2C_suba_en) // 发送子地址
{ I2DAT = I2C_suba;
I2CONCLR = 0x28;
I2C_suba_en = 1; //041009
break;
}
if(4==I2C_suba_en)
{ I2DAT = I2C_suba;
I2CONCLR = 0x28;
I2C_suba_en = 0; // 子地址己处理
break;
} //041009
if(0==I2C_suba_en) // 无子地址,则直接发送数据
{ if(I2C_num>0)
{ I2DAT = *I2C_buf++;
I2CONCLR = 0x28;
I2C_num--;
}
else
{ I2CONSET = 0x10; // 无数据发送,结束总线
I2CONCLR = 0x28;
I2C_end = 1;
}
break;
}
if(1==I2C_suba_en) // 若是指定地址读,则重新启动总线
{ I2CONSET = 0x20;
I2CONCLR = 0x18;
I2C_suba_en = 0; // 子地址己处理
}
break;
case 0x20:
case 0x30:
case 0x38:
I2CONCLR = 0x28; // 总线进入不可寻址从模式
I2C_end = 0xFF; // 总线出错,设置标志
break;
case 0x40: // 己发送SLA+R,并已接收到应答
if(1==I2C_num) // 最后一字节,接收数据后发送非应答信号
{ I2CONCLR = 0x2C; // AA=0,接收到数据后产生非应答
}
else // 接收数据并发送应答信号
{ I2CONSET = 0x04; // AA=1,接收到数据后产生应答
I2CONCLR = 0x28;
}
break;
case 0x50:
*I2C_buf++ = I2DAT; // 读取数据
I2C_num--;
if(1==I2C_num)
{ I2CONCLR = 0x2C; // AA=0,接收到数据后产生非应答
}
else
{ I2CONSET = 0x04; // AA=1,接收到数据后产生应答
I2CONCLR = 0x28;
}
break;
case 0x58:
*I2C_buf++ = I2DAT; // 读取最后一字节数据
I2CONSET = 0x10; // 结束总线
I2CONCLR = 0x28;
I2C_end = 1;
break;
case 0x48:
I2CONCLR = 0x28; // 总线进入不可寻址从模式
I2C_end = 0xFF;
break;
}
VICVectAddr = 0x00; // 中断处理结束
OPENINT();
}
答 13: 谢谢,先下了看看! 答 14: 给周开发板上配套的例子做一个接口程序,就行了,同时读写at24c64和pf8563(时钟),没有任何总是呀
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |