|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
4 S' `, r( ~5 p// 发送缓存3 p/ p: I. x8 e+ \% N5 \
char Send[] = "UART1 test......\n\r";9 B' l& ?. d) h& s2 m% Q
/ H& |3 _" s1 o" N
extern void UARTconfig()9 @6 G. v" r$ r: u: u7 \
{
1 T( ]6 g6 u) q. a, W( _) B //使能Uart1
+ n5 a$ K' r: B0 y7 P$ t6 z' ?" M PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: L" n T# o x( M4 M! @
' _& G9 M9 }/ n( w K- D // 使能 UART1禁用流控
! {/ h+ e' f: L" V7 h9 p UARTPinMuxSetup(1, 0);( w; Z7 v# x: G: h, u
( X! _3 l+ M' B( e. H, V- `$ O // 波特率 115200 数据位 8 停止位 1 无校验位
0 p) a. v- s# O UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* N T8 H$ w7 i3 h7 R! a1 j% [
& P6 _- o; t; w0 [9 S% _ // 使能 UART1
! L8 X4 v- I- K! R UARTEnable(SOC_UART_1_REGS);- L0 L" y. e" n! e+ v
// 使能接收 / 发送 FIFO
8 [/ Y0 c/ o, }: B UARTFIFOEnable(SOC_UART_1_REGS);
2 G7 L3 I9 ^( F6 c$ x5 p // 设置 FIFO 级别
# b6 E; h' e. e UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);' D. n8 O7 g- F8 i. Q' |8 e
//Uart1中断使能/ P% a' n, ~# R/ O
unsigned int intFlags = 0;
Q9 X. i% J5 o intFlags |= (UART_INT_LINE_STAT | \9 |$ s- x# w; `, y
UART_INT_TX_EMPTY | \
( W% q0 A: s# k) V& \0 I UART_INT_RXDATA_CTI);6 p% @$ Z; g) ^3 @
8 p! N& [+ Z# D/ x# p8 t UARTIntEnable(SOC_UART_1_REGS, intFlags);
' x7 D6 I3 @; z. W1 w}9 {- ~1 \6 P; ?- \* [+ b9 E
//UART 中断服务函数/ T8 }8 a% ?+ E) l. w+ \
void UARTIsr(UArg arg)
. x- _ D4 j9 t" R0 [: }: ~2 B8 Z{
* O7 g. z% S- Q2 X9 b9 _ static unsigned int length = sizeof(Send);
* Y- n1 \% e7 q static unsigned int count = 0;- P9 ~( c; j, c: [1 E; U
unsigned char rxData = 0;
2 j$ R& I N; j) I! @; n0 s unsigned int int_id = 0;+ e1 a5 v$ R3 j/ B2 P% U
// 确定中断源4 c: u- R2 ?3 v5 t
int_id = UARTIntStatus(SOC_UART_1_REGS);
8 X1 |: y- c8 h9 }( w8 W; n4 C // 清除 UART1 系统中断, @3 i _% Q' b! b* d
IntEventClear(SYS_INT_UART1_INT);) n& T- o7 H9 u3 | ~
// 发送中断8 s: |# ?0 y" N5 X3 w
if(UART_INTID_TX_EMPTY == int_id)
8 ?0 t, E, H% Q3 s+ _4 Q5 V9 u {' S, t3 S" O) V/ j0 E, V
if(0 < length)& u: E7 @: Y2 s9 Y/ b' z+ i1 p
{
i# a6 M1 I7 y+ S // 写一个字节到 THR+ h+ b, j4 \3 L7 n
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
2 N( } ?- ?6 K- I: x" v. C8 o length--;9 f: Z$ F) Q |3 {" p# \
count++;
% q D0 Y1 i4 ?/ s! g+ Z9 j, E* } }
/ }3 x5 F8 r. C% _ if(0 == length), `6 T8 U& f. H, Z5 e
{$ H3 v( P/ n* J/ \" c
// 禁用发送中断
% l: i$ f# E5 B! _/ z' s( r UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
! s/ p# {( m8 h( \9 M9 D) C }
0 n) b8 }6 E ?, A$ ^: b }
! }2 J1 O6 ^* i$ Z. Q: b // 接收中断
) T3 f; V# v9 x- A& D if(UART_INTID_RX_DATA == int_id)' c7 V6 a; \2 L
{+ k1 W% m8 r" Z, P( f' C
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 w7 `$ w. k' e1 J UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);( e6 f1 q' [6 k# k( s# u) {
}
0 B3 Z/ K% R7 N // 接收错误
8 S, R1 y: R, S5 E if(UART_INTID_RX_LINE_STAT == int_id)
. V/ _2 k4 v' ^# N7 ]0 \ {8 q4 M) H" h7 A
while(UARTRxErrorGet(SOC_UART_1_REGS))
9 v. L& n0 {* W. l4 o# g {: ]8 X* Y# k$ g9 z* m2 K, M$ M
// 从 RBR 读一个字节" v7 a2 b) B$ l; g( @' J
UARTCharGetNonBlocking(SOC_UART_1_REGS);
: o7 J* y& q3 K# x: G }
' G4 l p3 Z; ?( l' x! F* N }
# T, c8 y2 l/ m( _6 y return;
6 x0 s( X) x2 _4 h: e5 @& a. f}
8 l" Y& ^) J; s, L% Y% GInt main()
' ^; y6 ~5 `9 u6 @) r" J/ q3 @% a{ ; s v% O7 S+ ~# }6 M& C' D i8 n
UARTconfig();//uart 配置
& a4 E. ~9 H6 l& ~4 d Error_Block eb;
8 c0 n6 w& @5 ^4 S8 T: D System_printf("enter main()\n");' y; r1 s/ v8 [( F- z
Error_init(&eb);0 u O3 f! r" e
// 动态创建硬件中断
& r- l3 E! k* x( T1 X8 o/ Y$ X Hwi_Handle hwi1;
0 `& F# d8 J) H) l& h% f m Hwi_Params hwiParams; j3 P$ ~; I6 N* z. M
// 使用默认值初始化参数
; e0 ?3 z! j! |7 ?1 }0 E Hwi_Params_init(&hwiParams);
$ d* V: x3 ]* q" j6 P4 z // 中断事件
1 z# N. u. m" z. \2 B# R hwiParams.eventId = SYS_INT_UART1_INT;) f# p3 J. k- L% X8 {
// 传递到中断服务函数的参数! }& n: X6 A+ P5 N3 T
hwiParams.arg = 0;: }" J0 Y4 n7 p+ Y5 T) |# p
// 不允许该中断自身嵌套8 K: v9 C7 m5 ?$ M5 w' a: |: v
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
9 l( H6 s0 G Y6 t8 [5 ^, J# i; G // 使能中断
% M" Q; `0 L2 x' I v hwiParams.enableInt = true;
. ?! U) b5 O d! ^& ? // 可屏蔽中断 4
# F) m" J |* U* g1 n // 中断服务函数 hwiMain
' w% J* C# W$ k' V( s0 B6 X- k* j hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
/ J6 \* ?# s* I: M$ A if (hwi1 == NULL)* T3 R7 k ]& U6 Q3 |
System_abort("Hwi1 create failed");7 B, O3 z7 R: w; V
BIOS_start(); /* does not return */
1 Q/ R# Z/ ?2 b2 G% S2 e return(0);
' ~7 j- \1 B5 v1 Z}
7 \1 P% `1 j, E
5 S5 ]* T$ H9 |3 S- ?: K5 O- o |
|