|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下6 n# U3 ^) q% Q. I- ?- Y. k
// 发送缓存 @ K1 q* d/ c5 b f
char Send[] = "UART1 test......\n\r"; y; a2 k5 P% b6 E
/ p; @+ e% Z) f1 O1 F! B7 fextern void UARTconfig()& G+ l. q; W9 R! E
{5 g* x- Q1 v9 N6 D& e4 J
//使能Uart1
2 k$ B8 h8 w2 h PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);1 W. `3 N) s: P3 ^7 n2 ?
# U0 z* |* J$ R' ] m! U
// 使能 UART1禁用流控
, m( m3 O" ]( O" t* j UARTPinMuxSetup(1, 0);- A6 Q4 G+ ?3 [* X, U3 _* ]
: [% C1 L& \2 O
// 波特率 115200 数据位 8 停止位 1 无校验位4 N; r; [" r( r* U7 O8 c2 j
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);; O$ X. L. v8 M+ |
' }, B# f2 `, }7 }) T
// 使能 UART1& E* ~2 v8 E) w% _/ O5 {) ~
UARTEnable(SOC_UART_1_REGS);
$ ^4 X; A4 ~; B: A // 使能接收 / 发送 FIFO: \ @/ u5 i S: T' h$ I9 ^. D
UARTFIFOEnable(SOC_UART_1_REGS);
9 O- c2 S$ @3 }+ H // 设置 FIFO 级别
, P: G/ ^$ s7 G; f UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);( F) ~/ Q! b. }
//Uart1中断使能
/ ?4 e B& |& A; Q( M6 l unsigned int intFlags = 0;
) A9 a' }6 s7 |+ _ intFlags |= (UART_INT_LINE_STAT | \1 p8 ~- z; K, t8 o, o% Z+ _1 w
UART_INT_TX_EMPTY | \
6 s2 h m3 S6 K, V' t! J UART_INT_RXDATA_CTI);8 w/ I. y/ p$ v* p- U6 |
$ \* A* N" o# |. }
UARTIntEnable(SOC_UART_1_REGS, intFlags);0 k4 W# @* o; ?" [0 O
}
+ y m' V. Y: C8 \6 t: z* ?9 p//UART 中断服务函数2 \9 C; j. ~* [8 t
void UARTIsr(UArg arg). U/ ^7 W# d2 A, x8 x
{
, H! @2 o1 A E* `* Z2 m3 D0 V static unsigned int length = sizeof(Send);
9 x, v. R) B3 ~2 j0 c static unsigned int count = 0; O3 J) a; \2 `) M7 o7 n5 t3 S
unsigned char rxData = 0;) @8 p. k9 W" U+ u
unsigned int int_id = 0;
7 {/ |! K% c' `+ x) s // 确定中断源! o% k" b. J) x/ m8 P4 E
int_id = UARTIntStatus(SOC_UART_1_REGS);
2 s5 Q3 u$ t, ^4 q3 ^ // 清除 UART1 系统中断0 i5 G' j% ]1 \1 @7 f& y+ b, ?/ w
IntEventClear(SYS_INT_UART1_INT);2 l+ y; P1 \) V- J& U; ?
// 发送中断# D) X B- Z0 i6 F$ X' x! ?, y
if(UART_INTID_TX_EMPTY == int_id)& L" j1 ?8 _8 m5 L+ O
{7 I5 W, u V7 b8 i, `9 u9 K# }$ X
if(0 < length)
/ o: x; z5 c0 h# E% ` {/ a* e& b/ Y0 T' J) u" U6 I- n$ t
// 写一个字节到 THR8 I; P, |4 |+ _2 i3 Y
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
! q7 _8 A$ ^, E9 z length--;
! g( ~; w7 c! a: H" f' ^ count++;/ J0 o: @! N6 E0 Z, |
}
; k7 {! ~" L; W" d; g. c! G4 U% V5 e if(0 == length)* L+ G5 Q8 `" e2 s7 _
{! C# ~2 t5 R$ }" c4 W, c' A
// 禁用发送中断
0 }' B. @; ~- V UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
; h. X' W0 G5 m& h* t }
& U8 ]0 [/ E2 b( S' Q4 l }
# z/ E" c ]7 R3 s/ { g! y1 z // 接收中断
, V% S7 |: k7 { if(UART_INTID_RX_DATA == int_id)! J4 G; b) T( Z+ e8 p
{* F9 N `/ w0 k9 p( f
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
" t+ Z1 R) i2 y UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
# b/ j2 a; I5 t: ~% T4 u }
1 g; t" s/ Z# p4 a e // 接收错误! |/ D+ e( ?$ N. ]! S" r6 N- H l
if(UART_INTID_RX_LINE_STAT == int_id), n F: R5 A+ v7 U8 F& T! ^8 d
{9 k, U' I5 y) j' J" y
while(UARTRxErrorGet(SOC_UART_1_REGS))
& o& @' M) G- X+ q0 B! x8 s3 r {
7 j$ n5 `% |" d5 C // 从 RBR 读一个字节# S7 D P, q5 g8 v8 L$ y
UARTCharGetNonBlocking(SOC_UART_1_REGS);
/ W7 G5 r2 o( K* L }
7 E+ w/ T# ?& A# x t }. N ^/ W, C2 F3 T0 }9 C% s
return;" N. V% ] r) l6 M F
}
; f; Z5 @* y3 eInt main()+ J" K' m1 H4 q% v$ `5 M' F
{
2 G+ s t' ~/ r6 [ UARTconfig();//uart 配置4 _* y/ E' j2 k R$ s6 N. o
Error_Block eb;$ J, `+ ?' s+ O6 U0 P
System_printf("enter main()\n");
$ U2 B' I9 y, t5 T9 ]4 n Error_init(&eb);
+ }! z3 Y0 n& x" s Y6 g // 动态创建硬件中断
7 B" y5 H! I0 ^( L/ A Hwi_Handle hwi1;# ^" {% U! j& b" K
Hwi_Params hwiParams;
7 a, T. T! O2 N% R6 A // 使用默认值初始化参数
. [! q& ~8 P, k" x( I1 R3 I) } Hwi_Params_init(&hwiParams);
4 N0 A- S9 z# T/ S // 中断事件7 j5 I+ W6 b( _0 z# g
hwiParams.eventId = SYS_INT_UART1_INT;7 v0 p1 v% m+ X- `
// 传递到中断服务函数的参数
5 x+ v B6 I$ q. V! U hwiParams.arg = 0;: ]0 a: j9 a. ]+ L" ~8 [
// 不允许该中断自身嵌套
, z' Z9 F! h3 Z6 F: H hwiParams.maskSetting = Hwi_MaskingOption_SELF;! x) O& Y6 H- \; n6 O
// 使能中断' u( l) z/ z. u1 g
hwiParams.enableInt = true;
, d' v/ n4 J A; ]0 z8 o# H. l // 可屏蔽中断 4
# Q5 } Y' W8 u9 A1 Y5 b3 a // 中断服务函数 hwiMain
! S( ^2 F/ R* ^% u hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);% Y" _0 [: ^) P
if (hwi1 == NULL)
+ F1 y5 T9 \! m% E" ^ System_abort("Hwi1 create failed");) X2 m+ \4 g$ V7 g' e. n2 n
BIOS_start(); /* does not return */8 @9 q% `, |2 t) o7 Y. Q
return(0);" J. o! z( |- F
}
" F6 [/ W$ W. t2 N7 c+ d- g* E$ a+ R( w) b: d' ^" ]
|
|