<?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[FR801xH串口接收方式-硬件定时器超时判断断帧]]></title><description><![CDATA[<p>为了判断串口接收的数据的断帧，最佳方式就是硬件定时器，刚好串口接收的时候也是要运行CPU，硬件定时器也需要运行CPU，我们就适应硬件定时器超时5ms没有数据来表示这报数据接收完成</p>
<p>#include 	&quot;driver_timer.h&quot;<br />
#include 	&quot;driver_gpio.h&quot;<br />
#define 	UART_LEN_MAX 		512  // 接收最大buf<br />
#define     TIMEOUT_RX_MS		5 // 接收超时5M</p>
<p>volatile uint8_t uart_recving_buffer[UART_LEN_MAX] = {0};<br />
volatile uint16_t  timer_rx_flag = 0,index_uart0 = 0;</p>
<p>volatile uint32_t add_up=0;</p>
<p>void timer_demo(void)<br />
{<br />
	co_printf(&quot;%s\r\n&quot;,<strong>func</strong>);</p>
<pre><code>system_set_port_mux(GPIO_PORT_A, 	GPIO_BIT_7, PORTA7_FUNC_A7);
gpio_set_dir(GPIO_PORT_A, GPIO_BIT_7, GPIO_DIR_OUT);
gpio_set_pin_value(GPIO_PORT_A,GPIO_BIT_7,0);

system_set_port_mux(GPIO_PORT_A, 	GPIO_BIT_6, PORTA7_FUNC_A7);
gpio_set_dir(GPIO_PORT_A, GPIO_BIT_6, GPIO_DIR_OUT);
gpio_set_pin_value(GPIO_PORT_A,GPIO_BIT_6,0);


timer_init(TIMER0,1000,TIMER_PERIODIC);
timer_run(TIMER0);


NVIC_SetPriority(TIMER0_IRQn, 2);
NVIC_EnableIRQ(TIMER0_IRQn);
</code></pre>
<p>}</p>
<p>static uint8_t timer_flag=0, timer_flag1=0;<br />
/************************************************************************************</p>
<ul>
<li>
<p>@fn      timer0_handler</p>
</li>
<li></li>
<li>
<p>@brief   timer0 interrupt handler<br />
*/<br />
<strong>attribute</strong>((section(&quot;ram_code&quot;))) void timer0_isr_ram(void)<br />
{<br />
timer_clear_interrupt(TIMER0);<br />
#if 0	<br />
if(timer_rx_flag==1)<br />
{<br />
	add_up++;</p>
<pre><code>if(add_up &gt;= TIMEOUT_RX_MS)
{
	
	at_spss_send_data(gAT_ctrl_env.transparent_conidx, uart_recving_buffer, index_uart0);
	timer_rx_flag = 0;
	index_uart0 = 0;
	add_up = 0;
}
</code></pre>
<p>}<br />
#endif<br />
#if 1<br />
	timer_flag1=!timer_flag1;<br />
	gpio_set_pin_value(GPIO_PORT_A,GPIO_BIT_6, timer_flag);<br />
if(timer_rx_flag &gt;= 1)<br />
{<br />
		timer_rx_flag++;</p>
<pre><code>	if(timer_rx_flag &gt;= TIMEOUT_RX_MS)
	{
</code></pre>
</li>
</ul>
<p>//				pmu_set_gpio_value(GPIO_PORT_A, BIT(6),0);<br />
				at_spss_send_data(0, (uint8_t*)uart_recving_buffer, index_uart0);<br />
//				 co_printf(&quot;index_uart0:%d \r\n&quot;,index_uart0);<br />
				timer_rx_flag = 0;<br />
				index_uart0 = 0;<br />
			}</p>
<pre><code>	}
</code></pre>
<p>#endif<br />
//    co_printf(&quot;timer0 count:%d \r\n&quot;, lu32_Count++);<br />
//	pmu_set_gpio_value(GPIO_PORT_D, BIT(6),0);</p>
<p>}</p>
<p>/*********************************************************************</p>
<ul>
<li>
<p>@fn      uart0_isr_ram</p>
</li>
<li></li>
<li>
<p>@brief   UART0 interruption, when uart0 FIFO received charaters, this ISR will be called</p>
</li>
<li></li>
<li></li>
<li>
<p>@param   None</p>
</li>
<li></li>
<li></li>
<li>
<p>@return  None<br />
*/<br />
<strong>attribute</strong>((section(&quot;ram_code&quot;))) void uart0_isr_ram(void)<br />
{<br />
uint8_t int_id;<br />
volatile struct uart_reg_t * const uart_reg_ram = (volatile struct uart_reg_t *)UART0_BASE;<br />
int_id = uart_reg_ram-&gt;u3.iir.int_id;</p>
<p>if(int_id == 0x04 || int_id == 0x0c )   /* Receiver data available or Character time-out indication */<br />
{<br />
while(uart_reg_ram-&gt;lsr &amp; 0x01)<br />
{<br />
		uart_recving_buffer[index_uart0] = uart_reg_ram-&gt;u1.data;<br />
//			co_printf(&quot;%x &quot;,uart_recving_buffer[index_uart0]);<br />
		timer_flag=!timer_flag;<br />
		index_uart0++;<br />
		timer_rx_flag=1;<br />
		add_up = 1;<br />
		gpio_set_pin_value(GPIO_PORT_A,GPIO_BIT_7, timer_flag);<br />
//            app_at_recv_c(uart_reg_ram-&gt;u1.data);<br />
}<br />
}<br />
else if(int_id == 0x06)<br />
{<br />
uart_reg_ram-&gt;lsr = uart_reg_ram-&gt;lsr;<br />
uart_reg_ram-&gt;u3.iir.int_id = int_id;<br />
uart_reg_ram-&gt;u2.ier.erlsi = 0;<br />
}<br />
}</p>
</li>
</ul>
<p>void uart0_init(void)<br />
{<br />
system_set_port_pull(GPIO_PD4, true);<br />
system_set_port_mux(GPIO_PORT_D, GPIO_BIT_4, PORTD4_FUNC_UART0_RXD);<br />
system_set_port_mux(GPIO_PORT_D, GPIO_BIT_5, PORTD5_FUNC_UART0_TXD);<br />
//uart_init(UART0, find_uart_idx_from_baudrate(gAT_buff_env.uart_param.baud_rate));<br />
uart_param_t param =<br />
{<br />
.baud_rate = 921600,<br />
.data_bit_num = 8,<br />
.pari = 0,<br />
.stop_bit = 1,<br />
};<br />
uart_init1(UART0,param);<br />
NVIC_EnableIRQ(UART0_IRQn);<br />
	NVIC_SetPriority(UART0_IRQn, 3);<br />
	timer_demo();<br />
}</p>
]]></description><link>http://www.freqchip.net:4567/topic/706/fr801xh串口接收方式-硬件定时器超时判断断帧</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 05:40:21 GMT</lastBuildDate><atom:link href="http://www.freqchip.net:4567/topic/706.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Apr 2023 08:58:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to FR801xH串口接收方式-硬件定时器超时判断断帧 on Tue, 04 Apr 2023 09:05:11 GMT]]></title><description><![CDATA[<p>为了判断串口接收的数据的断帧，最佳方式就是硬件定时器，刚好串口接收的时候也是要运行CPU，硬件定时器也需要运行CPU，我们就适应硬件定时器超时5ms没有数据来表示这报数据接收完成</p>
<p>#include 	&quot;driver_timer.h&quot;<br />
#include 	&quot;driver_gpio.h&quot;<br />
#define 	UART_LEN_MAX 		512  // 接收最大buf<br />
#define     TIMEOUT_RX_MS		5 // 接收超时5M</p>
<p>volatile uint8_t uart_recving_buffer[UART_LEN_MAX] = {0};<br />
volatile uint16_t  timer_rx_flag = 0,index_uart0 = 0;</p>
<p>volatile uint32_t add_up=0;</p>
<p>void timer_demo(void)<br />
{<br />
	co_printf(&quot;%s\r\n&quot;,<strong>func</strong>);</p>
<pre><code>system_set_port_mux(GPIO_PORT_A, 	GPIO_BIT_7, PORTA7_FUNC_A7);
gpio_set_dir(GPIO_PORT_A, GPIO_BIT_7, GPIO_DIR_OUT);
gpio_set_pin_value(GPIO_PORT_A,GPIO_BIT_7,0);

system_set_port_mux(GPIO_PORT_A, 	GPIO_BIT_6, PORTA7_FUNC_A7);
gpio_set_dir(GPIO_PORT_A, GPIO_BIT_6, GPIO_DIR_OUT);
gpio_set_pin_value(GPIO_PORT_A,GPIO_BIT_6,0);


timer_init(TIMER0,1000,TIMER_PERIODIC);
timer_run(TIMER0);


NVIC_SetPriority(TIMER0_IRQn, 2);
NVIC_EnableIRQ(TIMER0_IRQn);
</code></pre>
<p>}</p>
<p>static uint8_t timer_flag=0, timer_flag1=0;<br />
/************************************************************************************</p>
<ul>
<li>
<p>@fn      timer0_handler</p>
</li>
<li></li>
<li>
<p>@brief   timer0 interrupt handler<br />
*/<br />
<strong>attribute</strong>((section(&quot;ram_code&quot;))) void timer0_isr_ram(void)<br />
{<br />
timer_clear_interrupt(TIMER0);<br />
#if 0	<br />
if(timer_rx_flag==1)<br />
{<br />
	add_up++;</p>
<pre><code>if(add_up &gt;= TIMEOUT_RX_MS)
{
	
	at_spss_send_data(gAT_ctrl_env.transparent_conidx, uart_recving_buffer, index_uart0);
	timer_rx_flag = 0;
	index_uart0 = 0;
	add_up = 0;
}
</code></pre>
<p>}<br />
#endif<br />
#if 1<br />
	timer_flag1=!timer_flag1;<br />
	gpio_set_pin_value(GPIO_PORT_A,GPIO_BIT_6, timer_flag);<br />
if(timer_rx_flag &gt;= 1)<br />
{<br />
		timer_rx_flag++;</p>
<pre><code>	if(timer_rx_flag &gt;= TIMEOUT_RX_MS)
	{
</code></pre>
</li>
</ul>
<p>//				pmu_set_gpio_value(GPIO_PORT_A, BIT(6),0);<br />
				at_spss_send_data(0, (uint8_t*)uart_recving_buffer, index_uart0);<br />
//				 co_printf(&quot;index_uart0:%d \r\n&quot;,index_uart0);<br />
				timer_rx_flag = 0;<br />
				index_uart0 = 0;<br />
			}</p>
<pre><code>	}
</code></pre>
<p>#endif<br />
//    co_printf(&quot;timer0 count:%d \r\n&quot;, lu32_Count++);<br />
//	pmu_set_gpio_value(GPIO_PORT_D, BIT(6),0);</p>
<p>}</p>
<p>/*********************************************************************</p>
<ul>
<li>
<p>@fn      uart0_isr_ram</p>
</li>
<li></li>
<li>
<p>@brief   UART0 interruption, when uart0 FIFO received charaters, this ISR will be called</p>
</li>
<li></li>
<li></li>
<li>
<p>@param   None</p>
</li>
<li></li>
<li></li>
<li>
<p>@return  None<br />
*/<br />
<strong>attribute</strong>((section(&quot;ram_code&quot;))) void uart0_isr_ram(void)<br />
{<br />
uint8_t int_id;<br />
volatile struct uart_reg_t * const uart_reg_ram = (volatile struct uart_reg_t *)UART0_BASE;<br />
int_id = uart_reg_ram-&gt;u3.iir.int_id;</p>
<p>if(int_id == 0x04 || int_id == 0x0c )   /* Receiver data available or Character time-out indication */<br />
{<br />
while(uart_reg_ram-&gt;lsr &amp; 0x01)<br />
{<br />
		uart_recving_buffer[index_uart0] = uart_reg_ram-&gt;u1.data;<br />
//			co_printf(&quot;%x &quot;,uart_recving_buffer[index_uart0]);<br />
		timer_flag=!timer_flag;<br />
		index_uart0++;<br />
		timer_rx_flag=1;<br />
		add_up = 1;<br />
		gpio_set_pin_value(GPIO_PORT_A,GPIO_BIT_7, timer_flag);<br />
//            app_at_recv_c(uart_reg_ram-&gt;u1.data);<br />
}<br />
}<br />
else if(int_id == 0x06)<br />
{<br />
uart_reg_ram-&gt;lsr = uart_reg_ram-&gt;lsr;<br />
uart_reg_ram-&gt;u3.iir.int_id = int_id;<br />
uart_reg_ram-&gt;u2.ier.erlsi = 0;<br />
}<br />
}</p>
</li>
</ul>
<p>void uart0_init(void)<br />
{<br />
system_set_port_pull(GPIO_PD4, true);<br />
system_set_port_mux(GPIO_PORT_D, GPIO_BIT_4, PORTD4_FUNC_UART0_RXD);<br />
system_set_port_mux(GPIO_PORT_D, GPIO_BIT_5, PORTD5_FUNC_UART0_TXD);<br />
//uart_init(UART0, find_uart_idx_from_baudrate(gAT_buff_env.uart_param.baud_rate));<br />
uart_param_t param =<br />
{<br />
.baud_rate = 921600,<br />
.data_bit_num = 8,<br />
.pari = 0,<br />
.stop_bit = 1,<br />
};<br />
uart_init1(UART0,param);<br />
NVIC_EnableIRQ(UART0_IRQn);<br />
	NVIC_SetPriority(UART0_IRQn, 3);<br />
	timer_demo();<br />
}</p>
]]></description><link>http://www.freqchip.net:4567/post/1516</link><guid isPermaLink="true">http://www.freqchip.net:4567/post/1516</guid><dc:creator><![CDATA[Mars]]></dc:creator><pubDate>Tue, 04 Apr 2023 09:05:11 GMT</pubDate></item><item><title><![CDATA[Reply to FR801xH串口接收方式-硬件定时器超时判断断帧 on Invalid Date]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="http://www.freqchip.net:4567/uid/941">@mars</a> 有疑问的同学，我知道的可以向你解答</p>
]]></description><link>http://www.freqchip.net:4567/post/1517</link><guid isPermaLink="true">http://www.freqchip.net:4567/post/1517</guid><dc:creator><![CDATA[Mars]]></dc:creator><pubDate>Invalid Date</pubDate></item></channel></rss>