请问串口DMA接收数据时,如何知道本次接收到多少字节数据?
-
手册和代码里没有找到对应的寄存器
-
串口接收波特率是多少
-
这个需要在串口超时中断中算,DMA搬运地址减去首地址+手动搬运的
-
@zr 不好意思没看懂,我这边接收到的数据是不定长,不定内容的。常规的MCU都会有接口返回当前DMA接收位置偏移量,咱们这个怎么定位?
-
@乒乒乓乒兵乓乒
void uart1_isr(void)
{
uint8_t uart_id = __UART_INT_GET_ID(Uart1_handle.UARTx);
printf("%02x\r\n",uart_id);
if(uart_id == INT_INDEX_RX_TOUT )
{
uint32_t BACK_uart_rec_len = DMA->Channels[DMA_Chan0_Handle.Channel].CTL2.BLOCK_TS;
printf("len = %d\r\n",BACK_uart_rec_len);
uint32_t cur_des = DMA->Channels[0].DAR;
uint8_t *write_des = (uint8_t *)cur_des;
uint32_t finish_size = cur_des - (uint32_t)&RxBuf[0];
while (Uart1_handle.UARTx->LSR.LSR_BIT.DR)
{
*write_des++ = Uart1_handle.UARTx->DATA_DLL.DATA;
finish_size++;
}
printf("finish_size is %d \r\n",finish_size);
dma_start_IT(&DMA_Chan0_Handle, (uint32_t)RxBuf, (uint32_t)&Uart1_handle.UARTx->DATA_DLL.DATA, sizeof(RxBuf), DMA_BURST_LEN_16);
printf("Received %d bytes:\n", finish_size);
for (int i = 0; i < finish_size; i++)
{
printf("%x ", RxBuf[i]);
if ((i + 1) % 16 == 0)
printf("\n");
}
printf("\r\n");
}
}你可以先看下这个代码
-
按照示例代码进行测试,获取到的接收长度一直是小于实际接收长度的,比如对端发了128字节,计算得到的长度有81字节,但实际接收buffer里确实变了128字节。
另外,中断号一直是1,请问这是什么意思呢?怎么样配置能得到正确的接收中断呢?上边的测试数据我是把中断判断条件注释掉才跑出来的,否则一直进不了。
以上两个问题,请大佬再指点一下,多谢啦
-
这个FIFO_MODE改成0试下
-
您好,经测试改成0也不对,测试时同步修改了UART的FIFO模式为disable;
另外FCR的值为什么不受控呢?最低位一直是1,FIFO一直处于enable状态;有没有完整的,经过测试的demo?我只测试串口就可以的
-