|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
" B( [+ J4 s! y; n6 R% Q// 发送缓存4 Z! \2 f8 E" e* H/ `; m" A# G8 N" w
char Send[] = "UART1 test......\n\r";; k7 T! M4 T5 z1 ]
/ g1 _8 A* O5 Z m9 ?' z/ s
extern void UARTconfig()- K6 Q: i1 b' S' g: s
{
. u- A& ~& U, N' q //使能Uart1
& N! u6 W4 z5 t6 i; @ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);: x1 P8 ?0 k+ c6 y6 G" J
) D( f3 u$ d; j9 Y9 W- g
// 使能 UART1禁用流控
: e, W0 t+ {7 G UARTPinMuxSetup(1, 0);
" n' h" v; c. a! ?2 N. a
) u) m( S/ a8 w- A // 波特率 115200 数据位 8 停止位 1 无校验位
2 A) ?2 h6 y% {9 [4 f( ] UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ O+ Q' V9 f; ~ |
# p s0 f) I- P // 使能 UART1. T4 r% ~& H0 \4 ^6 I* Q% x- @
UARTEnable(SOC_UART_1_REGS);6 Q& g8 f+ `" b
// 使能接收 / 发送 FIFO- h3 h% q |4 @. m
UARTFIFOEnable(SOC_UART_1_REGS);
' d& [/ \6 b1 g& i // 设置 FIFO 级别
' r: ^# e! G. T, A5 b3 M a/ N UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
/ b- L3 D- ^: d8 Y( p g //Uart1中断使能
* A0 X6 h7 _ N9 }0 W unsigned int intFlags = 0;
4 I, u0 q0 D. `, `; D# o# n" h intFlags |= (UART_INT_LINE_STAT | \
0 `4 M+ ]8 N% {. x+ S UART_INT_TX_EMPTY | \
+ J- s/ n) E6 x UART_INT_RXDATA_CTI);' | {' @! K8 z% G: s/ m5 W" |
6 k. E+ T: r2 F2 x) F3 U, A; V UARTIntEnable(SOC_UART_1_REGS, intFlags);9 ]9 w0 @. J" ?. ] ^# P% V# X
}- Y, [, k4 v: Y3 R6 h% G( I5 N7 u
//UART 中断服务函数
h; k1 B- N/ Z0 f9 `void UARTIsr(UArg arg)
; X; C: N& o: ?& ]+ Y{
0 v, p( N; L6 B, c% ?3 y static unsigned int length = sizeof(Send);
B9 X, |9 Y R1 m static unsigned int count = 0;" W" \( k5 U. ~( C* ]; p5 | D6 O
unsigned char rxData = 0;
4 s4 `/ _6 v! a) R F+ Q unsigned int int_id = 0;' |0 {8 |* t0 B, V0 Y4 D
// 确定中断源, U9 L+ K1 h8 ^: i
int_id = UARTIntStatus(SOC_UART_1_REGS);
7 ]" l$ `$ C7 |+ _4 J- ? // 清除 UART1 系统中断
( y8 k& Z8 W8 a IntEventClear(SYS_INT_UART1_INT);
! e# g0 x. a/ H# V4 W // 发送中断
3 \; q( v3 _7 v3 u, z5 r if(UART_INTID_TX_EMPTY == int_id)
8 A3 @" a, V1 a! J5 z {
4 R) h# C& |1 V3 ^5 D if(0 < length)
# F( v. N/ z* t0 @ {2 Y4 |, q9 M. `6 A: e
// 写一个字节到 THR
# p# x1 [, t; f6 ?. Z: k UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
; t) V2 I1 ~, m" X# Q# e! a length--;
7 A _- t& G2 j9 x1 i count++;
5 t# t3 i9 o* {2 l: a! J( o }
- @" b4 L6 X r; l if(0 == length)
/ R" J( }* H* k: e* d. k {% ]! f8 V$ ^0 S; E& m; a
// 禁用发送中断
3 g* _4 m" D. I8 S2 ^7 ~: g UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
* ~7 L B# ]" [3 p# s7 m/ p }5 E/ d8 k' ?& ?6 P& \
}* K' B+ G) D4 U6 f1 n2 V5 f
// 接收中断
* }- b* M. a) _ X& n5 } _7 r if(UART_INTID_RX_DATA == int_id)
4 r6 F( ^9 c4 o9 w k/ P5 F2 a {
8 Z3 A8 \; n4 i8 l( v0 A; h rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS); ~- M, L! k* V) u% X# e
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
0 w; q0 T W A( b/ I }0 K% r+ a' ^8 ]5 }1 W& B
// 接收错误
/ c3 z0 J, K- j0 a R4 N2 w if(UART_INTID_RX_LINE_STAT == int_id)
% A& \& O T- l' q1 u+ z6 B) z {4 k. M$ J, x. B$ ]/ G1 _
while(UARTRxErrorGet(SOC_UART_1_REGS))
: r: E) w1 P t {" Y0 g' X E% f& I) ~
// 从 RBR 读一个字节/ d, V3 P" ~+ [7 W1 f$ p
UARTCharGetNonBlocking(SOC_UART_1_REGS);
& Z; }; x7 Q" A* j" |7 F }" [' r( \; e7 F/ l/ C
}
* P. C5 x$ U( J' d5 W/ E! C return;
! y5 G8 w( ^( Z8 p} {$ Z: v* H/ `$ J6 }8 G, S/ D4 H
Int main()0 k7 }* T/ s- E4 X3 I
{ 1 }5 c& g' e. o/ j' W' L! L
UARTconfig();//uart 配置' T& X1 o5 r( @; ]
Error_Block eb;% x; I' s9 |. X3 [7 ~4 s. U
System_printf("enter main()\n");, k5 }% i/ @# |( \ Q# X) ^( q2 \0 N' ?
Error_init(&eb);
$ \, @) q d8 E, c, C // 动态创建硬件中断0 @, O- g% w _5 j7 g
Hwi_Handle hwi1;: g7 i% }! N3 F
Hwi_Params hwiParams;0 {5 S! \+ H2 m7 q" m; H" r& t
// 使用默认值初始化参数4 Z5 p5 j/ u' m7 E% r# J
Hwi_Params_init(&hwiParams);/ q/ n- X0 r2 J5 H" ?* m: q
// 中断事件
$ D2 e& R- [. j9 Q: O5 q hwiParams.eventId = SYS_INT_UART1_INT;5 |9 _6 i5 V9 x9 P( u, p n* Z) u. ^
// 传递到中断服务函数的参数! }: K2 v: M: G2 ]
hwiParams.arg = 0;
2 u; ^: l9 k( a6 [8 ?1 @, T // 不允许该中断自身嵌套5 ]9 A8 N6 Y' K- Q7 o3 ? @& E
hwiParams.maskSetting = Hwi_MaskingOption_SELF;$ j+ d8 ?, s [5 E o" J
// 使能中断, _4 t1 Z' U* ]* u2 n+ E
hwiParams.enableInt = true;' P0 F6 P: [/ ~* E
// 可屏蔽中断 4% e/ q4 q7 L; _$ P
// 中断服务函数 hwiMain5 \2 ?. T T% i( k0 x8 b
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);" T; ^& {- k& g! Y! H9 V
if (hwi1 == NULL)
# `, u: w$ v$ c$ g% }" F System_abort("Hwi1 create failed");
" a0 |: m& l7 v* L- {0 M- J9 ~ BIOS_start(); /* does not return */) J b- M! L" R
return(0);
7 c4 Y4 M) ^- Y}5 u/ x) D2 B5 y6 h, U' ~ k
?& S) w% [. Z* r |
|