由于新项目使用了新唐的M451,由于对款MCU不熟悉,今天碰到一个串口接收的问题,弄了很久没有搞定,可否麻烦大家说下串口接收的用法,就以串口0为例,我不是很明白这个串口中断函数里会有一个UART_INTSTS_RDAINT_Msk和一个UART_INTSTS_RXTOINT_Msk,一个数据接收中断和一个接收超时中断,怎么样区分,为什么两个一起用?还有个问题,我老是一次只能收到16个字节的数据,反复测试了都不行,麻烦大家帮忙详细说明M451串口的使用方法和配置代码,比如,我现在要接收长度大于16字节的数据,该如何配置,总这对个串口实在头大,之前使用
STM32的串口简单明了,在此先谢谢大家了!
我的串口0初始配置代码如下,也不是很懂:
void UART0_Init(void)//visual data process
{
memset(Uart0_rx_buf,0,sizeof(Uart0_rx_buf));
memset(Uart0_tx_buf,0,sizeof(Uart0_tx_buf));
Uart0_rx_Count = 0; //接收字节个数
Uart0_tx_Count = 0; //发送字节个数
Uart0_rx_P = 0; //接收指针
Uart0_tx_P = 0; //发送指针
Uart0_rx_Finish = 0; //接收完成标志
Uart0_tx_Finish = 0; //发送完成标志
SYS->GPD_MFPL = SYS_GPD_MFPL_PD1MFP_UART0_TXD | SYS_GPD_MFPL_PD0MFP_UART0_RXD;
SYS_ResetModule(UART0_RST);
UART_Open(UART0, 115200);
UART0->FIFO &= ~UART_FIFO_RFITL_Msk;
UART0->FIFO |= UART_FIFO_RFITL_14BYTES;
//UART0->FIFO|=UART_FIFO_RFITL_1BYTE;
UART_Set
timeoutCnt(UART0, 40);
UART_EnableInt(UART0, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk));
// NVIC_EnableIRQ(UART0_IRQn);
}
这个是中断处理函数,是之前的工程师做的
void UART0_TEST_HANDLE(void)//for visual data process
{
uint8_t u8InChar = 0xFF;
uint8_t i;
uint32_t u32IntSts = UART0->INTSTS;
//接收有效数据
if(u32IntSts & UART_INTSTS_RDAINT_Msk)
{
while(UART_GET_RX_EMPTY(UART0)==0)
{
//read data
u8InChar = UART_READ(UART0);
Uart0_rx_buf[Uart0_rx_P]=u8InChar;
Uart0_rx_P
}
//接收超时中断
if(u32IntSts & UART_INTSTS_RXTOINT_Msk)
{
//Uart0_tx_Finish = 0;
//Uart0_rx_P = 0;
/*i=0;
while(UART_GET_RX_EMPTY(UART0)==0)
{
u8InChar = UART_READ(UART0);
Uart0_rx_buf[Uart0_rx_P]=u8InChar;
Uart0_rx_P ++;
If (Uart0_rx_P==32)
{
Uart0_rx_Finish = 1;
Uart0_rx_Count = Uart0_rx_P;
Uart0_rx_P = 0;
}
//发送完成中断
if(u32IntSts & UART_INTSTS_THREINT_Msk)
{
if(Uart0_tx_P=Uart0_tx_Count)
{ UART_DISABLE_INT(UART0, UART_INTEN_THREIEN_Msk);
Uart0_tx_Finish = 0;
Uart0_tx_P = 0;
break;
}
if(i>=16)break;
}
}
else
{
UART_DISABLE_INT(UART0, UART_INTEN_THREIEN_Msk);
Uart0_tx_Finish = 0;
Uart0_tx_P = 0;
}
}
}