|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
这个问题论坛里很多问的,我也看了看,网上也搜了搜,感觉还是需要讨论下
& u+ e5 e: \8 o& S0 z$ B! r( x. n1 y1 @4 H& Y9 N) b
根据以往的撸代码经验,裸机或者使用RT-Thread nano时候,串口handler函数里代码大概是这个样子的。
$ D7 ^ L3 J1 e# Y( E) \0 Q% H1 H- m. h/ _( A
//伪代码; Y6 P+ Q, |7 |% J5 L7 J4 P1 z- v
void USART3_IRQHandler(void)
4 S K: B' w; l, k' w2 `{1 B" f- {/ S+ h/ U
if(1 == 接收标志位)" w9 K/ o$ j- m- l i8 ?! l: K
{; x, k% r: a2 Q1 |' e' J3 |
把数据存到buf里面;/ p7 Q0 @, V [/ u; O4 B; h
}2 s4 X T, Y, u7 J3 ]
if(1 == 空闲标志位)
& [! V {! }8 c! X* q; [; G{
) S) W! T: D2 l5 V3 S4 q- [发送个信号量,或者置一个标志位,给串口处理线程或main;9 ^* Z( {7 ]. v+ R3 D2 k+ O2 R2 f Z
}" t9 | R1 V" k4 {" L$ d; Y6 c
}0 U2 M3 Q2 |; N8 R: J0 d
现在开始用RT-Thread 标准版,驱动框架还没仔细研究,但是想按照以前的方式写一个串口接收不定长数据的代码都不好写出来了。看了下rt_hw_serial_isr,里面好像没有关于空闲中断的使用。: U2 i# J7 l& p5 d8 F
4 l" y; P5 L3 C请教下各位,在RT-Thread 标准版里,如何实现,像上面伪代码那样的空闲中断?使用DMA和不使用DMA,实现起来是否一样?
9 c1 t# |& a( T+ D7 q! B- _) R6 ]! I( `7 F9 G- L
我看了文档里《串口设备使用示例》,没有用到空闲中断。在serial_thread_entry里面添加一个空闲标志位判断,会影响RTT驱动框架吗?如下更改:
) T$ z8 c( z& g: t7 _/ | U
7 Y7 M) h- v2 b7 y/ j' @/* invoke callback /
7 r; Z9 i! k% ^+ Sif (serial->parent.rx_indicate != RT_NULL && USART_GetIntStatus(USART1, USART_INT_IDLEF) != RESET)
1 w( h y J8 l4 F& @& w{
& C$ `2 h0 `% a% _8 }% Mrt_size_t rx_length;
# E; @+ O- l7 j+ s' U/ get rx length */
7 O2 O0 L% V" Vlevel = rt_hw_interrupt_disable();3 o5 V3 q* }' i, ]4 N" l, E+ Q, d7 R
rx_length = (rx_fifo->put_index >= rx_fifo->get_index)? (rx_fifo->put_index - rx_fifo->get_index):* U# J- v' F0 I, e/ A9 ]+ a1 t
(serial->config.bufsz - (rx_fifo->get_index - rx_fifo->put_index));' N2 s5 l' r* d7 C2 i
rt_hw_interrupt_enable(level);
. y5 o( d: a/ g' V' ^4 Nif (rx_length)
1 i/ Z9 \' R: C+ W4 [" C{1 R0 B1 s. U' e) m
serial->parent.rx_indicate(&serial->parent, rx_length);. P9 f! T1 H, E& p% C0 d
}- h4 W; H( u$ a
}
. T" Z0 f- _1 m1 L不使用空闲中断,是不是因为,有些mcu没有空闲中断?为了保证兼容性?
% g: q+ |* Z! W( l9 T+ O! \( i |
|