共2条
1/1 1 跳转至页
UART0,UART1 UART0和UART1同时全双工工作(已经调通)!!!欢迎改进!!!
问
#include "config.h"
/* 定义串口0模式设置数据结构 */
typedef struct UartModeA
{ uint8 databA; // 字长度,5/6/7/8
uint8 stopbA; // 停止位,1/2
uint8 parityA; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
} UARTMODEA;
/* 定义串口1模式设置数据结构 */
typedef struct UartModeB
{ uint8 databB; // 字长度,5/6/7/8
uint8 stopbB; // 停止位,1/2
uint8 parityB; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
} UARTMODEB;
uint8 rcv_bufA[8]; // UART0数据接收缓冲区
uint8 rcv_bufB[8]; // UART1数据接收缓冲区
volatile uint8 rcv_newA; // 接收新数据标志
volatile uint8 rcv_newB; // 接收新数据标志
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_UART0(void)
{
uint8 i;
if( 0x04==(U0IIR&0x0F) ) rcv_newA = 1;// 设置接收到新的数据标志
for(i=0; i<8; i++)
{ rcv_bufA[i] = U0RBR; // 读取FIFO的数据,并清除中断标志
}
VICVectAddr = 0x00; // 中断处理结束
}
/****************************************************************************
* 名称:IRQ_UART1()
* 功能:串口UART1接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_UART1(void)
{
uint8 i;
if( 0x04==(U1IIR&0x0F) ) rcv_newB = 1;// 设置接收到新的数据标志
for(i=0; i<8; i++)
{ rcv_bufB[i] = U1RBR; // 读取FIFO的数据,并清除中断标志
}
VICVectAddr = 0x00; // 中断处理结束
}
/****************************************************************************
* 名称:SendByte()
* 功能:向串口UART0发送字节数据。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void SendByteA(uint8 dataA)
{
U0THR = dataA; // 发送数据
}
/****************************************************************************
* 名称:SendByte()
* 功能:向串口UART0发送字节数据。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void SendByteB(uint8 dataB)
{
U1THR = dataB; // 发送数据
}
/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void ISendBufA(void)
{ uint8 i;
for(i=0; i<8; i++) SendByteA(rcv_bufA[i]);
while( (U0LSR&0x20)==0 ); // 等待数据发送
}
/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void ISendBufB(void)
{ uint8 i;
for(i=0; i<8; i++) SendByteB(rcv_bufB[i]);
while( (U1LSR&0x20)==0 ); // 等待数据发送
}
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud 波特率
* set 模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8 UART0_Ini(uint32 baudA, UARTMODEA set)
{ uint32 bakA;
/* 参数过滤 */
if( (0==baudA)||(baudA>115200) ) return(0);
if( (set.databA<5)||(set.databA>8) ) return(0);
if( (0==set.stopbA)||(set.stopbA>2) ) return(0);
if( set.parityA>4 ) return(0);
/* 设置串口波特率 */
U0LCR = 0x80; // DLAB位置1
bakA = (Fpclk>>4)/baudA;
U0DLM = bakA>>8;
U0DLL = bakA&0xff;
/* 设置串口模式 */
bakA = set.databA-5; // 设置字长度
if(2==set.stopbA) bakA |= 0x04; // 判断是否为2位停止位
if(0!=set.parityA) {set.parityA = set.parityA-1; bakA |= 0x08;}
bakA |= set.parityA<<4; // 设置奇偶校验
U0LCR = bakA;
return(1);
}
/****************************************************************************
* 名称:UART1_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud 波特率
* set 模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8 UART1_Ini(uint32 baudB, UARTMODEB set)
{ uint32 bakB;
/* 参数过滤 */
if( (0==baudB)||(baudB>115200) ) return(0);
if( (set.databB<5)||(set.databB>8) ) return(0);
if( (0==set.stopbB)||(set.stopbB>2) ) return(0);
if( set.parityB>4 ) return(0);
/* 设置串口波特率 */
U1LCR = 0x80; // DLAB位置1
bakB = (Fpclk>>4)/baudB;
U1DLM = bakB>>8;
U1DLL = bakB&0xff;
/* 设置串口模式 */
bakB = set.databB-5; // 设置字长度
if(2==set.stopbB) bakB |= 0x04; // 判断是否为2位停止位
if(0!=set.parityB) {set.parityB = set.parityB-1; bakB |= 0x08;}
bakB |= set.parityB<<4; // 设置奇偶校验
U1LCR = bakB;
return(1);
}
/****************************************************************************
* 名称:main()
* 功能:初始化串口,并等待接收到串口数据。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int main(void)
{
uint8 rcv_counterA;
uint8 rcv_counterB;
UARTMODEA uart0_set;
UARTMODEB uart1_set;
PINSEL0 = 0x00050005; // 设置I/O连接到UART0
//*******************************************************************
rcv_newA = 0;
uart0_set.databA = 8; // 8位数据位
uart0_set.stopbA = 1; // 1位停止位
uart0_set.parityA = 0; // 无奇偶校验
UART0_Ini(115200, uart0_set); // 初始化串口模式
U0FCR = 0x81; // 使能FIFO,并设置触发点为8字节
U0IER = 0x01; // 允许RBR中断,即接收中断
//*******************************************************************
rcv_newB = 0;
uart1_set.databB = 8; // 8位数据位
uart1_set.stopbB = 1; // 1位停止位
uart1_set.parityB = 0; // 无奇偶校验
UART1_Ini(115200, uart1_set); // 初始化串口模式
U1FCR = 0x81; // 使能FIFO,并设置触发点为8字节
U1IER = 0x01; // 允许RBR中断,即接收中断
//*******************************************************************
/* 设置中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_UART0; // 设置UART0向量地址
VICIntEnable = 0x000006C0; // 使能UART0中断
//*******************************************************************
/* 设置中断允许 */
// VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl1 = 0x27; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr1 = (int)IRQ_UART1; // 设置UART1向量地址
// VICIntEnable = 0x00000040; // 使能UART1中断
while(1) // 等待中断
{
if(1==rcv_newA)
{
rcv_newA = 0;
ISendBufA(); // 将接收到的数据发送回主机
}
if(1==rcv_newB)
{
rcv_newB = 0;
ISendBufB(); // 将接收到的数据发送回主机
}
}
return(0);
}
答 1: 注意用SMARTARM开发板,将UART0直接与计算机连接(R/T/G),将UART1短接R/T(其余悬空,当普通UART口使用)后与计算机连接!!! 答 2: 共同进步>>>>>>>>>>前几天完成了TCP--UART0全双工通信;现在可以着手做TCP---UART0.UART1的全双工通信了!!到时候再发出来共享!!!程序虽然成功了,但难免有"不先进"的地方,希望大家"修正"!!!!共同进步>>>>>>>>>> 答 3: 不错!资源丰富呀 答 4: 其实程序可以减一半! 答 5: 好.支持... 答 6: 还要努力呵呵! 还要努力 答 7: 这里注释??//*******************************************************************
/* 设置中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_UART0; // 设置UART0向量地址
VICIntEnable = 0x000006C0; // 使能UART0中断
//*******************************************************************
/* 设置中断允许 */
// VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl1 = 0x27; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr1 = (int)IRQ_UART1; // 设置UART1向量地址
// VICIntEnable = 0x00000040; // 使能UART1中断
答 8: 改进 /* 设置中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_UART0; // 设置UART0向量地址
VICIntEnable = 0x000000C0; // 使能UART0和UART1中断
VICVectCntl1 = 0x27; // UART0中断通道分配到IRQ slot 1,即优先级次高
VICVectAddr1 = (int)IRQ_UART1; // 设置UART1向量地址
答 9: 你发送采用查询而非中断方式,程序效率上不来接收中断里简单的收8个字符,也没有考虑其他中断发生的情况。
可以参考我的blog中的例子 答 10: 什么例子!!在那?你没贴地址!!怎么看? 答 11: FIFO楼主的程序是不是必须有8个字符才能传输阿?
当FIFO的触发点为8时,怎样才能让他传送任意个字符?
当触发点为1时,中断方式发送大量字符会漏字符。
当触发点为8时,查询方式是100%。
还有中断使能寄存器的第2位Rx线状态在实际中怎么应用?
答 12: 关于查询和中断,我的看法。一般情况下,发送用查询方式好过中断方式。
除非1)有DMA2)cpu疯狂的快。
否则最好用查询方式发送。 答 13: 问题还不少 答 14: 基于UCOS的双串口工作程序能贴出来吗?基于UCOS的双串口工作程序能贴出来吗?全双工\中断接收\>>>>>>>>> 答 15: dd 答 16: to high你说的用查询发送比中断发送好,是基于进入和退出中断需要更多的时间对吧。
如果波特率太高并且每次中断只发送一个字节,当然查询发送好些。
实际上,如果有FIFO用中断效果也非常好。作为一个实时系统,象串口通信这样的设备一般都是低速,总的来说用中断更合适些,因为你的系统可能有更重要的事务需要处理。虽然:如果单纯只看串口通信的话,在一些条件下查询效率可能更高。 答 17: DD 答 18: RE:取决于对‘一般情况’怎么界定ms级别的发送时间,都会造成实时性差,那么任何数据,调试信息也不能发送了。恐怕不是一般情况。
用中断还有几个问题,一般情况,系统总有几个更重要的中断,比如,接收就比发送重要,还有定时器中断更重要。多了一个发送中断,就多一份中断仲裁和调度。而且一般情况,单片机任务很多是时序严格任务,比如读iic总线。这些都不希望中断很频繁。
您说的都很对。取决于‘一般情况’我们如何界定了。用哪种就根据需要吧。 答 19: DDDD
/* 定义串口0模式设置数据结构 */
typedef struct UartModeA
{ uint8 databA; // 字长度,5/6/7/8
uint8 stopbA; // 停止位,1/2
uint8 parityA; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
} UARTMODEA;
/* 定义串口1模式设置数据结构 */
typedef struct UartModeB
{ uint8 databB; // 字长度,5/6/7/8
uint8 stopbB; // 停止位,1/2
uint8 parityB; // 奇偶校验位,0为无校验,1奇数校验,2为偶数校验
} UARTMODEB;
uint8 rcv_bufA[8]; // UART0数据接收缓冲区
uint8 rcv_bufB[8]; // UART1数据接收缓冲区
volatile uint8 rcv_newA; // 接收新数据标志
volatile uint8 rcv_newB; // 接收新数据标志
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_UART0(void)
{
uint8 i;
if( 0x04==(U0IIR&0x0F) ) rcv_newA = 1;// 设置接收到新的数据标志
for(i=0; i<8; i++)
{ rcv_bufA[i] = U0RBR; // 读取FIFO的数据,并清除中断标志
}
VICVectAddr = 0x00; // 中断处理结束
}
/****************************************************************************
* 名称:IRQ_UART1()
* 功能:串口UART1接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void __irq IRQ_UART1(void)
{
uint8 i;
if( 0x04==(U1IIR&0x0F) ) rcv_newB = 1;// 设置接收到新的数据标志
for(i=0; i<8; i++)
{ rcv_bufB[i] = U1RBR; // 读取FIFO的数据,并清除中断标志
}
VICVectAddr = 0x00; // 中断处理结束
}
/****************************************************************************
* 名称:SendByte()
* 功能:向串口UART0发送字节数据。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void SendByteA(uint8 dataA)
{
U0THR = dataA; // 发送数据
}
/****************************************************************************
* 名称:SendByte()
* 功能:向串口UART0发送字节数据。
* 入口参数:data 要发送的数据
* 出口参数:无
****************************************************************************/
void SendByteB(uint8 dataB)
{
U1THR = dataB; // 发送数据
}
/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void ISendBufA(void)
{ uint8 i;
for(i=0; i<8; i++) SendByteA(rcv_bufA[i]);
while( (U0LSR&0x20)==0 ); // 等待数据发送
}
/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void ISendBufB(void)
{ uint8 i;
for(i=0; i<8; i++) SendByteB(rcv_bufB[i]);
while( (U1LSR&0x20)==0 ); // 等待数据发送
}
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud 波特率
* set 模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8 UART0_Ini(uint32 baudA, UARTMODEA set)
{ uint32 bakA;
/* 参数过滤 */
if( (0==baudA)||(baudA>115200) ) return(0);
if( (set.databA<5)||(set.databA>8) ) return(0);
if( (0==set.stopbA)||(set.stopbA>2) ) return(0);
if( set.parityA>4 ) return(0);
/* 设置串口波特率 */
U0LCR = 0x80; // DLAB位置1
bakA = (Fpclk>>4)/baudA;
U0DLM = bakA>>8;
U0DLL = bakA&0xff;
/* 设置串口模式 */
bakA = set.databA-5; // 设置字长度
if(2==set.stopbA) bakA |= 0x04; // 判断是否为2位停止位
if(0!=set.parityA) {set.parityA = set.parityA-1; bakA |= 0x08;}
bakA |= set.parityA<<4; // 设置奇偶校验
U0LCR = bakA;
return(1);
}
/****************************************************************************
* 名称:UART1_Ini()
* 功能:初始化串口0。设置其工作模式及波特率。
* 入口参数:baud 波特率
* set 模式设置(UARTMODE数据结构)
* 出口参数:返回值为1时表示初化成功,为0表除参数出错
****************************************************************************/
uint8 UART1_Ini(uint32 baudB, UARTMODEB set)
{ uint32 bakB;
/* 参数过滤 */
if( (0==baudB)||(baudB>115200) ) return(0);
if( (set.databB<5)||(set.databB>8) ) return(0);
if( (0==set.stopbB)||(set.stopbB>2) ) return(0);
if( set.parityB>4 ) return(0);
/* 设置串口波特率 */
U1LCR = 0x80; // DLAB位置1
bakB = (Fpclk>>4)/baudB;
U1DLM = bakB>>8;
U1DLL = bakB&0xff;
/* 设置串口模式 */
bakB = set.databB-5; // 设置字长度
if(2==set.stopbB) bakB |= 0x04; // 判断是否为2位停止位
if(0!=set.parityB) {set.parityB = set.parityB-1; bakB |= 0x08;}
bakB |= set.parityB<<4; // 设置奇偶校验
U1LCR = bakB;
return(1);
}
/****************************************************************************
* 名称:main()
* 功能:初始化串口,并等待接收到串口数据。
* 说明:在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
int main(void)
{
uint8 rcv_counterA;
uint8 rcv_counterB;
UARTMODEA uart0_set;
UARTMODEB uart1_set;
PINSEL0 = 0x00050005; // 设置I/O连接到UART0
//*******************************************************************
rcv_newA = 0;
uart0_set.databA = 8; // 8位数据位
uart0_set.stopbA = 1; // 1位停止位
uart0_set.parityA = 0; // 无奇偶校验
UART0_Ini(115200, uart0_set); // 初始化串口模式
U0FCR = 0x81; // 使能FIFO,并设置触发点为8字节
U0IER = 0x01; // 允许RBR中断,即接收中断
//*******************************************************************
rcv_newB = 0;
uart1_set.databB = 8; // 8位数据位
uart1_set.stopbB = 1; // 1位停止位
uart1_set.parityB = 0; // 无奇偶校验
UART1_Ini(115200, uart1_set); // 初始化串口模式
U1FCR = 0x81; // 使能FIFO,并设置触发点为8字节
U1IER = 0x01; // 允许RBR中断,即接收中断
//*******************************************************************
/* 设置中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_UART0; // 设置UART0向量地址
VICIntEnable = 0x000006C0; // 使能UART0中断
//*******************************************************************
/* 设置中断允许 */
// VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl1 = 0x27; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr1 = (int)IRQ_UART1; // 设置UART1向量地址
// VICIntEnable = 0x00000040; // 使能UART1中断
while(1) // 等待中断
{
if(1==rcv_newA)
{
rcv_newA = 0;
ISendBufA(); // 将接收到的数据发送回主机
}
if(1==rcv_newB)
{
rcv_newB = 0;
ISendBufB(); // 将接收到的数据发送回主机
}
}
return(0);
}
答 1: 注意用SMARTARM开发板,将UART0直接与计算机连接(R/T/G),将UART1短接R/T(其余悬空,当普通UART口使用)后与计算机连接!!! 答 2: 共同进步>>>>>>>>>>前几天完成了TCP--UART0全双工通信;现在可以着手做TCP---UART0.UART1的全双工通信了!!到时候再发出来共享!!!程序虽然成功了,但难免有"不先进"的地方,希望大家"修正"!!!!共同进步>>>>>>>>>> 答 3: 不错!资源丰富呀 答 4: 其实程序可以减一半! 答 5: 好.支持... 答 6: 还要努力呵呵! 还要努力 答 7: 这里注释??//*******************************************************************
/* 设置中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_UART0; // 设置UART0向量地址
VICIntEnable = 0x000006C0; // 使能UART0中断
//*******************************************************************
/* 设置中断允许 */
// VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl1 = 0x27; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr1 = (int)IRQ_UART1; // 设置UART1向量地址
// VICIntEnable = 0x00000040; // 使能UART1中断
答 8: 改进 /* 设置中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_UART0; // 设置UART0向量地址
VICIntEnable = 0x000000C0; // 使能UART0和UART1中断
VICVectCntl1 = 0x27; // UART0中断通道分配到IRQ slot 1,即优先级次高
VICVectAddr1 = (int)IRQ_UART1; // 设置UART1向量地址
答 9: 你发送采用查询而非中断方式,程序效率上不来接收中断里简单的收8个字符,也没有考虑其他中断发生的情况。
可以参考我的blog中的例子 答 10: 什么例子!!在那?你没贴地址!!怎么看? 答 11: FIFO楼主的程序是不是必须有8个字符才能传输阿?
当FIFO的触发点为8时,怎样才能让他传送任意个字符?
当触发点为1时,中断方式发送大量字符会漏字符。
当触发点为8时,查询方式是100%。
还有中断使能寄存器的第2位Rx线状态在实际中怎么应用?
答 12: 关于查询和中断,我的看法。一般情况下,发送用查询方式好过中断方式。
除非1)有DMA2)cpu疯狂的快。
否则最好用查询方式发送。 答 13: 问题还不少 答 14: 基于UCOS的双串口工作程序能贴出来吗?基于UCOS的双串口工作程序能贴出来吗?全双工\中断接收\>>>>>>>>> 答 15: dd 答 16: to high你说的用查询发送比中断发送好,是基于进入和退出中断需要更多的时间对吧。
如果波特率太高并且每次中断只发送一个字节,当然查询发送好些。
实际上,如果有FIFO用中断效果也非常好。作为一个实时系统,象串口通信这样的设备一般都是低速,总的来说用中断更合适些,因为你的系统可能有更重要的事务需要处理。虽然:如果单纯只看串口通信的话,在一些条件下查询效率可能更高。 答 17: DD 答 18: RE:取决于对‘一般情况’怎么界定ms级别的发送时间,都会造成实时性差,那么任何数据,调试信息也不能发送了。恐怕不是一般情况。
用中断还有几个问题,一般情况,系统总有几个更重要的中断,比如,接收就比发送重要,还有定时器中断更重要。多了一个发送中断,就多一份中断仲裁和调度。而且一般情况,单片机任务很多是时序严格任务,比如读iic总线。这些都不希望中断很频繁。
您说的都很对。取决于‘一般情况’我们如何界定了。用哪种就根据需要吧。 答 19: DDDD
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |