请问串口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");
}
}你可以先看下这个代码