<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[串口使用DMA接收不定长数据时，第一次接收的数据没有进入中断]]></title><description><![CDATA[<p>串口使用DMA接收不定长数据时，使用串口第一次发送数据后，若短时间内没收到回复数据，第一次的数据会跟着第二次的数据一起出来，通过日志打印，发现是第一次接收的数据未进入中断处理函数，以下是我的串口部分相关代码，麻烦帮忙看下是哪里的问题<br />
void Uart1Init(void)<br />
{<br />
	__SYSTEM_UART1_CLK_ENABLE();</p>
<pre><code>GPIO_InitTypeDef 	GPIO_Handle = {0}; 
/* init GPIO Alternate Function */
GPIO_Handle.Pin       = GPIO_PIN_6|GPIO_PIN_7;
GPIO_Handle.Mode      = GPIO_MODE_AF_PP;
GPIO_Handle.Pull      = GPIO_PULLUP;
GPIO_Handle.Alternate = GPIO_FUNCTION_5;
gpio_init(GPIO_A, &amp;GPIO_Handle);

/* init uart1 */   
Uart1_handle.UARTx = Uart1;
Uart1_handle.Init.BaudRate   = 115200;
Uart1_handle.Init.DataLength = UART_DATA_LENGTH_8BIT;
Uart1_handle.Init.StopBits   = UART_STOPBITS_1;
Uart1_handle.Init.Parity     = UART_PARITY_NONE;
Uart1_handle.Init.FIFO_Mode  = UART_FIFO_ENABLE;
uart_init_ex(&amp;Uart1_handle);

__UART_INT_RX_ENABLE(Uart1_handle.UARTx);
NVIC_EnableIRQ(UART1_IRQn);

/* init uart1 rx DMA */ 

DMA_Chan2.Channel               = DMA_Channel2;
DMA_Chan2.Init.Data_Flow        = DMA_P2M_DMAC;
DMA_Chan2.Init.Request_ID       = 3;
DMA_Chan2.Init.Source_Inc       = DMA_ADDR_INC_NO_CHANGE;
DMA_Chan2.Init.Desination_Inc   = DMA_ADDR_INC_INC;
DMA_Chan2.Init.Source_Width     = DMA_TRANSFER_WIDTH_8;
DMA_Chan2.Init.Desination_Width = DMA_TRANSFER_WIDTH_8;
dma_init(&amp;DMA_Chan2);

__SYSTEM_DMA_CLK_ENABLE();
NVIC_EnableIRQ(DMA_IRQn);
uart_receive_DMA(&amp;Uart1_handle);
__UART_RxFIFO_THRESHOLD((&amp;Uart1_handle), 1);//Set RxFIFO 1/4 full  

dma_start(&amp;DMA_Chan2, (uint32_t)&amp;Uart1_handle.UARTx-&gt;DATA_DLL.DATA,(uint32_t)Checkbuf, 200, DMA_BURST_LEN_4, DMA_BURST_LEN_1);
</code></pre>
<p>}<br />
void DMA_disable(DMA_HandleTypeDef <em>hdma)<br />
{<br />
	/</em> Disable the channel <em>/<br />
	DMA-&gt;Misc_Reg.ChEnReg = (DMA-&gt;Misc_Reg.ChEnReg&amp;(~(1 &lt;&lt; hdma-&gt;Channel))) | (1 &lt;&lt; (hdma-&gt;Channel + 8));<br />
	/</em> Clear Transfer complete status <em>/<br />
	dma_clear_tfr_Status(hdma-&gt;Channel);<br />
	/</em> channel Transfer complete interrupt disable */<br />
	dma_tfr_interrupt_disable(hdma-&gt;Channel);<br />
}<br />
<strong>attribute</strong>((section(&quot;ram_code&quot;))) void uart1_isr(void)<br />
{<br />
	uint32_t isr_id;</p>
<pre><code>volatile struct_UART_t * const uart_reg_ram = (volatile struct_UART_t *)UART1_BASE;

isr_id = __UART_INT_GET_ID(Uart1_handle.UARTx);
if((isr_id &amp; 0x0f) == 0x0c)
{
	if(dma_recv_idx == 0)
	{
		dma_recv_idx = DMA-&gt;Channels[DMA_Chan2.Channel].CTL2.BLOCK_TS;
		co_printf(&quot;dma_recv_idx:%d\r\n&quot;,dma_recv_idx);
	}
	while(uart_reg_ram-&gt;LSR.LSR_BIT.DR)
	{
		Checkbuf[dma_recv_idx++] = (uint8_t)uart_reg_ram-&gt;DATA_DLL.DATA;
	}
	recv_done= 1;
}
</code></pre>
<p>}<br />
主循环中<br />
while(1)<br />
{<br />
	if(recv_done)<br />
	{<br />
		recv_done = 0;<br />
		DMA_disable(&amp;DMA_Chan2);<br />
		dma_start(&amp;DMA_Chan2, (uint32_t)&amp;Uart1_handle.UARTx-&gt;DATA_DLL.DATA,(uint32_t)Checkbuf, 200, DMA_BURST_LEN_4, DMA_BURST_LEN_1);<br />
		co_printf(&quot;recv done:%d\r\n&quot;,dma_recv_idx);<br />
		show_reg(Checkbuf,dma_recv_idx,1);<br />
		dma_recv_idx = 0;<br />
	}<br />
}</p>
]]></description><link>http://www.freqchip.net:4567/topic/1756/串口使用dma接收不定长数据时-第一次接收的数据没有进入中断</link><generator>RSS for Node</generator><lastBuildDate>Mon, 06 Apr 2026 08:31:12 GMT</lastBuildDate><atom:link href="http://www.freqchip.net:4567/topic/1756.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 Mar 2026 10:36:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 串口使用DMA接收不定长数据时，第一次接收的数据没有进入中断 on Invalid Date]]></title><description><![CDATA[<p>串口使用DMA接收不定长数据时，使用串口第一次发送数据后，若短时间内没收到回复数据，第一次的数据会跟着第二次的数据一起出来，通过日志打印，发现是第一次接收的数据未进入中断处理函数，以下是我的串口部分相关代码，麻烦帮忙看下是哪里的问题<br />
void Uart1Init(void)<br />
{<br />
	__SYSTEM_UART1_CLK_ENABLE();</p>
<pre><code>GPIO_InitTypeDef 	GPIO_Handle = {0}; 
/* init GPIO Alternate Function */
GPIO_Handle.Pin       = GPIO_PIN_6|GPIO_PIN_7;
GPIO_Handle.Mode      = GPIO_MODE_AF_PP;
GPIO_Handle.Pull      = GPIO_PULLUP;
GPIO_Handle.Alternate = GPIO_FUNCTION_5;
gpio_init(GPIO_A, &amp;GPIO_Handle);

/* init uart1 */   
Uart1_handle.UARTx = Uart1;
Uart1_handle.Init.BaudRate   = 115200;
Uart1_handle.Init.DataLength = UART_DATA_LENGTH_8BIT;
Uart1_handle.Init.StopBits   = UART_STOPBITS_1;
Uart1_handle.Init.Parity     = UART_PARITY_NONE;
Uart1_handle.Init.FIFO_Mode  = UART_FIFO_ENABLE;
uart_init_ex(&amp;Uart1_handle);

__UART_INT_RX_ENABLE(Uart1_handle.UARTx);
NVIC_EnableIRQ(UART1_IRQn);

/* init uart1 rx DMA */ 

DMA_Chan2.Channel               = DMA_Channel2;
DMA_Chan2.Init.Data_Flow        = DMA_P2M_DMAC;
DMA_Chan2.Init.Request_ID       = 3;
DMA_Chan2.Init.Source_Inc       = DMA_ADDR_INC_NO_CHANGE;
DMA_Chan2.Init.Desination_Inc   = DMA_ADDR_INC_INC;
DMA_Chan2.Init.Source_Width     = DMA_TRANSFER_WIDTH_8;
DMA_Chan2.Init.Desination_Width = DMA_TRANSFER_WIDTH_8;
dma_init(&amp;DMA_Chan2);

__SYSTEM_DMA_CLK_ENABLE();
NVIC_EnableIRQ(DMA_IRQn);
uart_receive_DMA(&amp;Uart1_handle);
__UART_RxFIFO_THRESHOLD((&amp;Uart1_handle), 1);//Set RxFIFO 1/4 full  

dma_start(&amp;DMA_Chan2, (uint32_t)&amp;Uart1_handle.UARTx-&gt;DATA_DLL.DATA,(uint32_t)Checkbuf, 200, DMA_BURST_LEN_4, DMA_BURST_LEN_1);
</code></pre>
<p>}<br />
void DMA_disable(DMA_HandleTypeDef <em>hdma)<br />
{<br />
	/</em> Disable the channel <em>/<br />
	DMA-&gt;Misc_Reg.ChEnReg = (DMA-&gt;Misc_Reg.ChEnReg&amp;(~(1 &lt;&lt; hdma-&gt;Channel))) | (1 &lt;&lt; (hdma-&gt;Channel + 8));<br />
	/</em> Clear Transfer complete status <em>/<br />
	dma_clear_tfr_Status(hdma-&gt;Channel);<br />
	/</em> channel Transfer complete interrupt disable */<br />
	dma_tfr_interrupt_disable(hdma-&gt;Channel);<br />
}<br />
<strong>attribute</strong>((section(&quot;ram_code&quot;))) void uart1_isr(void)<br />
{<br />
	uint32_t isr_id;</p>
<pre><code>volatile struct_UART_t * const uart_reg_ram = (volatile struct_UART_t *)UART1_BASE;

isr_id = __UART_INT_GET_ID(Uart1_handle.UARTx);
if((isr_id &amp; 0x0f) == 0x0c)
{
	if(dma_recv_idx == 0)
	{
		dma_recv_idx = DMA-&gt;Channels[DMA_Chan2.Channel].CTL2.BLOCK_TS;
		co_printf(&quot;dma_recv_idx:%d\r\n&quot;,dma_recv_idx);
	}
	while(uart_reg_ram-&gt;LSR.LSR_BIT.DR)
	{
		Checkbuf[dma_recv_idx++] = (uint8_t)uart_reg_ram-&gt;DATA_DLL.DATA;
	}
	recv_done= 1;
}
</code></pre>
<p>}<br />
主循环中<br />
while(1)<br />
{<br />
	if(recv_done)<br />
	{<br />
		recv_done = 0;<br />
		DMA_disable(&amp;DMA_Chan2);<br />
		dma_start(&amp;DMA_Chan2, (uint32_t)&amp;Uart1_handle.UARTx-&gt;DATA_DLL.DATA,(uint32_t)Checkbuf, 200, DMA_BURST_LEN_4, DMA_BURST_LEN_1);<br />
		co_printf(&quot;recv done:%d\r\n&quot;,dma_recv_idx);<br />
		show_reg(Checkbuf,dma_recv_idx,1);<br />
		dma_recv_idx = 0;<br />
	}<br />
}</p>
]]></description><link>http://www.freqchip.net:4567/post/4244</link><guid isPermaLink="true">http://www.freqchip.net:4567/post/4244</guid><dc:creator><![CDATA[DSG]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Reply to 串口使用DMA接收不定长数据时，第一次接收的数据没有进入中断 on Invalid Date]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="http://www.freqchip.net:4567/uid/1844">@dsg</a><br />
【有道云笔记】800x串口DMA接收不定长度数据<br />
<a href="https://share.note.youdao.com/s/P3cOOAnQ" rel="nofollow">https://share.note.youdao.com/s/P3cOOAnQ</a><br />
参考下这个文件</p>
]]></description><link>http://www.freqchip.net:4567/post/4255</link><guid isPermaLink="true">http://www.freqchip.net:4567/post/4255</guid><dc:creator><![CDATA[ZR]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Reply to 串口使用DMA接收不定长数据时，第一次接收的数据没有进入中断 on Invalid Date]]></title><description><![CDATA[<p>你好，就是参考这个文档来配置的，发现还有一个问题，将fifo设置为1/4触发时，串口接收到的数据长度是4的倍数时，就无法触发超时中断，这个该怎么解决。</p>
]]></description><link>http://www.freqchip.net:4567/post/4259</link><guid isPermaLink="true">http://www.freqchip.net:4567/post/4259</guid><dc:creator><![CDATA[DSG]]></dc:creator><pubDate>Invalid Date</pubDate></item></channel></rss>