|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
+ B6 u. C% k: ]( e9 d/ q// 发送缓存
, ~+ f) g" h* \+ { q. dchar Send[] = "UART1 test......\n\r";7 ?! ?2 m% y5 L U
8 S/ L: X/ F$ T7 Eextern void UARTconfig()/ W* h$ O! U2 ]0 }: K5 G. W# a
{5 F9 R/ d. a' N! q' [. r( z0 r
//使能Uart17 p6 z+ k6 {0 m. y% l: M# K
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* Y) Y# m5 D' F & u9 u7 M( ^( u6 q$ }) K) t
// 使能 UART1禁用流控$ _, `. z- y0 w- O* n. X' `
UARTPinMuxSetup(1, 0);. |1 D4 [, P& ?- w/ }/ S
2 m1 V6 m: a+ O0 x: t r4 z
// 波特率 115200 数据位 8 停止位 1 无校验位
$ j' E) R3 o, F, x) L, x' u UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 e3 h# c+ P0 l- L* k |: }0 F: H# V) m# U
// 使能 UART1
* T. l* x) Q3 z UARTEnable(SOC_UART_1_REGS);/ F6 g1 v9 b3 A& q3 D2 B
// 使能接收 / 发送 FIFO3 @: H0 j8 \7 E R
UARTFIFOEnable(SOC_UART_1_REGS);8 N% [" {9 i$ F0 ~$ o G8 q
// 设置 FIFO 级别
+ k& c e* U1 l% V# X2 a+ G; [ UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);9 x% n3 N1 \( m$ l
//Uart1中断使能. X, q0 K5 i+ I, g, u1 ]6 i, p
unsigned int intFlags = 0;% { V' A, J% ?$ o# x
intFlags |= (UART_INT_LINE_STAT | \
! _# A1 s& h7 S# B8 Y5 S, o+ N UART_INT_TX_EMPTY | \
# n! O! L/ h6 @7 e. z% K UART_INT_RXDATA_CTI);
/ H6 z! a1 b J7 J ; b) E+ H F4 s* |, ^
UARTIntEnable(SOC_UART_1_REGS, intFlags);6 n$ ^& H# s. V
}; ?# }# C; D( G" T" q, L# ^ ~
//UART 中断服务函数
- _; \: |* Z+ O/ `! s4 x2 pvoid UARTIsr(UArg arg)! `$ j# j5 r! O* [4 O
{
. S3 w) o1 ]0 a1 P static unsigned int length = sizeof(Send);
) L2 b, c9 j2 S b# \% C static unsigned int count = 0;' k8 i* n4 A& Q. k, o' B( V
unsigned char rxData = 0;
) f9 M- s8 W" k1 @/ ?" {. [1 n3 r unsigned int int_id = 0; C: a+ H- ?+ l3 h' H, F2 K
// 确定中断源9 @- c; u! R$ b
int_id = UARTIntStatus(SOC_UART_1_REGS);
$ M+ X6 H8 h8 j) n0 y // 清除 UART1 系统中断7 r* _: E" H! d
IntEventClear(SYS_INT_UART1_INT);, T" n0 c4 E; T+ m [$ d M9 B! T$ T
// 发送中断
' | t, w4 n" V1 d! ] if(UART_INTID_TX_EMPTY == int_id)- b: |: g6 j* t3 z# a
{
" n* Y: H3 o( s% h: c3 _7 t if(0 < length)
9 v. z$ m# O; e: D {
* q5 ~' J S" {- f/ j$ |* N // 写一个字节到 THR7 {% D) V2 r2 J0 K" L2 C
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
' C, f: B% z5 u3 H% A8 R5 x length--;
) [+ M5 m* h8 P2 G count++;* [! b' E) _3 g& h( n, ]! K; D
}0 q9 U+ f0 {! T' q
if(0 == length)0 S) C+ h2 t" X+ f3 p
{5 O1 x. }/ e( d# K
// 禁用发送中断4 a- k5 ]/ c' Q+ \. F$ `
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
8 b7 ^3 Y: `5 F; t* ^- r }8 Z+ W# p+ R' W; M) F! p* `
}
% c5 H5 ]+ M( w9 \ // 接收中断# h3 f, j9 [# e$ v4 c0 u O
if(UART_INTID_RX_DATA == int_id)
3 p& H8 M- w4 u2 \ {2 g% s- h5 a) G2 z* ?4 h( i
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);* H7 `& f/ ? V' p
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);7 P; d; N4 W# m$ e# O3 ~8 F
}$ X* C; s4 }6 {/ ^1 }2 ?3 H- ?
// 接收错误
% }. J8 G* b0 Q0 Q' T' U1 q+ @ if(UART_INTID_RX_LINE_STAT == int_id)
$ ?8 d/ [+ j, z% B7 n; d0 d" B+ W; V {
( f: Y8 Z( P) }+ m! z while(UARTRxErrorGet(SOC_UART_1_REGS))5 f# Z8 }2 |6 t) N4 @* e' O
{
' _$ O) }$ y) ^3 z, ^- f6 w( H( i y2 Q // 从 RBR 读一个字节
: [+ p. ~5 j5 r7 Z: @ UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 A: _- a0 g8 Y: k2 _ }
4 r# T' x: T% h' d7 {8 { }$ J. {9 ]- T- P0 C# g. M
return;. b/ X$ M# b5 {3 x& U3 K1 [
}
* {" L& E; C. n/ `5 BInt main()& Q+ s1 ]3 c1 r
{
7 y* h* }9 C7 A& {$ \0 i; Z UARTconfig();//uart 配置% [- _" B& M" w- v. Z @: ]; o
Error_Block eb;
6 j8 O: j. E4 j+ @4 ~+ M System_printf("enter main()\n");% z5 t4 \+ }/ V0 e8 E, t
Error_init(&eb);
* @' t' w- S k4 q6 K // 动态创建硬件中断$ o# p5 y; E. r4 C5 C
Hwi_Handle hwi1; j1 O; t/ @, Z4 C- y* T: L3 u# { o
Hwi_Params hwiParams;
2 r8 h0 v/ A+ E, a! J" B- d* r // 使用默认值初始化参数
! o$ Y: ~4 T; u7 h Hwi_Params_init(&hwiParams);7 l+ r+ _. D1 ?9 O" c+ ~+ ?
// 中断事件* k$ z @: b7 H" |3 V
hwiParams.eventId = SYS_INT_UART1_INT;
% E. E$ D# P3 [& o% y // 传递到中断服务函数的参数
0 o, {" a2 k* r hwiParams.arg = 0;
: m* K! j' R' c' X0 F // 不允许该中断自身嵌套' q; c* b. c7 h \, j
hwiParams.maskSetting = Hwi_MaskingOption_SELF;; n/ y* N( y: j7 l8 a; G5 T# n8 G
// 使能中断
$ f1 c. A4 f1 j1 o- F hwiParams.enableInt = true;
( \ e5 O0 R" i // 可屏蔽中断 4* P) ]! ?) ]5 Y( a( X
// 中断服务函数 hwiMain
3 |" ~4 w/ N3 i: Y4 h2 ] hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
% B3 e. _" V. F* r4 R if (hwi1 == NULL)$ o6 E$ p ^4 R# A3 N( G, v
System_abort("Hwi1 create failed");
8 C6 ^) S8 A% w& ]# U) T$ f5 X BIOS_start(); /* does not return */( E6 V* B0 K) ~; L6 L
return(0);( n2 E2 a- u% u4 L/ J7 W7 w1 d
}
1 q% M% w P6 ^! N8 C$ C+ e, g* t( Y2 {
|
|