|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下0 T1 w t3 ?/ S- \2 s8 Z
// 发送缓存
3 B& R8 ?) Q/ ^& Xchar Send[] = "UART1 test......\n\r";% E2 P5 p( c7 u& y& J
0 Y' @0 F8 `8 j! O* V5 pextern void UARTconfig()2 x* j! ?* X0 X. ?) ?' I5 A& Y. H4 \# V
{1 ~1 V% h( a+ z; K% }) R3 |
//使能Uart1
0 A' t1 W3 K8 x- j6 ? PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);& i! C9 E9 y& O
1 ?' v. M- Y a/ Y) c" K // 使能 UART1禁用流控
I: C8 D. l& z UARTPinMuxSetup(1, 0);
8 }) X! T7 c+ k* R, f8 i |$ U' o% M' m% n8 i' n
// 波特率 115200 数据位 8 停止位 1 无校验位
- r( X0 V" ^) l" Y' e6 B9 _ UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);: @5 r2 q& v5 T% G
' s. C1 v. g6 j' t. ]- _4 R. t3 e/ H // 使能 UART18 ?' [% ~& i# v& D
UARTEnable(SOC_UART_1_REGS);$ ^% v, i. b5 ~2 d
// 使能接收 / 发送 FIFO. f( a, N1 v9 s+ H: O7 f+ I
UARTFIFOEnable(SOC_UART_1_REGS);
5 `1 O! R5 ~7 f. m2 n% ]& l9 G // 设置 FIFO 级别) g. M( E! C* d! L8 [! j
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
8 D5 d F$ p) b3 {8 O: j' G' \ //Uart1中断使能
l5 F3 P0 Z. n3 M1 W. ]% n unsigned int intFlags = 0;6 N. k. J6 C& V# u2 `
intFlags |= (UART_INT_LINE_STAT | \; \( w1 n, |1 j4 M% D
UART_INT_TX_EMPTY | \
" V Z" x- n' v1 q, [ UART_INT_RXDATA_CTI);3 D. S& A$ t9 a* D! p
# \- N, z. j& K' c3 U4 R5 X
UARTIntEnable(SOC_UART_1_REGS, intFlags);* W% x% B5 m) O4 s( c2 X
} n m' [0 Y& A& g& M
//UART 中断服务函数
* B" m1 X( l1 H. l+ Q. R3 ]void UARTIsr(UArg arg). z& }; o8 r* C) D4 Q. o
{) q* `. j. |* u' h" E0 l, M
static unsigned int length = sizeof(Send);1 }* R2 i6 K' K
static unsigned int count = 0;' X0 L5 }' m5 { A! \- _
unsigned char rxData = 0;
5 @2 D$ B$ N- N unsigned int int_id = 0;, B2 J* Z& Y$ c$ j" ~
// 确定中断源$ X, q$ ?. u) c. E" u
int_id = UARTIntStatus(SOC_UART_1_REGS);- z6 _2 w% h( }8 {8 k. O
// 清除 UART1 系统中断$ j( \; v6 G% ^
IntEventClear(SYS_INT_UART1_INT); \0 k+ w8 i" f8 n0 G: \9 o
// 发送中断
, n: D: n" |: f if(UART_INTID_TX_EMPTY == int_id)$ R' W7 w: r. L7 a2 V8 i. T$ h
{
4 G" x0 E# H. t9 j" i0 u if(0 < length)
* Q, c, t! m" t& y2 {$ C" [$ u {
1 I. n) n5 p6 m4 b1 J5 c/ w4 A // 写一个字节到 THR" v: H$ A4 A& {
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
5 v, V3 ~5 g9 A+ T1 z" z length--;
% Y3 g+ `$ K- }1 e+ z# I, t4 V7 i( h count++;/ Y6 f H5 C* v- x t; d
}
2 W' L c; j/ U9 k2 W- P if(0 == length)
8 L3 w! D8 r; h/ V {- R# I8 a6 ~ {' O
// 禁用发送中断% V! Q# N/ O2 ~8 R$ a% x
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
- {$ ]: A9 p. t8 B9 U) m) W1 A7 t }
5 q' f2 B+ X) E3 t1 a {' j" b }- }7 P8 c- m8 ~5 Y
// 接收中断3 ~# P y+ t0 D( u( a4 S
if(UART_INTID_RX_DATA == int_id)! U( N2 f" m8 @8 I
{
) x! j6 M" m6 `+ Y) V( S rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
K" \% i4 l0 N3 K* T7 J) y0 H UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
% b& y S b0 `" P/ Z0 D: c. ] }" G o/ ?. M& H* h: Y% R
// 接收错误
5 `' D% J* G, }7 e if(UART_INTID_RX_LINE_STAT == int_id)/ M+ ?5 G% G+ b1 j& }; v6 b% Q# _
{+ i8 I" q/ b0 ?9 O& t
while(UARTRxErrorGet(SOC_UART_1_REGS))- Q( h6 {' q+ D
{
6 M/ ]% r0 W7 n( n3 _ // 从 RBR 读一个字节3 F& e; c# D. ^6 L; t6 x
UARTCharGetNonBlocking(SOC_UART_1_REGS);
3 H8 A- D: E) n$ d }/ p ~$ c" o3 u/ o. [1 o
}
1 |! l* e. }9 p. I, e3 E, { return;
: T% i9 r5 @# X* o; n}. i. U7 l N& Q8 Q$ }
Int main()% O4 f/ v( ?$ N. B6 W" x$ L0 c
{ " l) Z) U! @ U; B( G2 }9 t
UARTconfig();//uart 配置
- r6 U Y4 U9 }) {1 w Error_Block eb;
6 C3 p& ]% x1 u" o& H/ d System_printf("enter main()\n");
! t. L, z |. J9 t, |) l+ f% J Error_init(&eb);
+ U. D/ j# } ~- N // 动态创建硬件中断
; g- R4 C3 p+ o- J) J3 M4 ] Hwi_Handle hwi1;2 ^% k' p' _/ T6 r+ l
Hwi_Params hwiParams;
: y% u) {* T% F9 q. M/ o // 使用默认值初始化参数$ Z/ x* [* t% C# g
Hwi_Params_init(&hwiParams);5 `3 _% L2 W9 n
// 中断事件
2 t" |& {6 i9 B hwiParams.eventId = SYS_INT_UART1_INT;
3 {9 D" H# O4 G" |7 R2 O- `& y // 传递到中断服务函数的参数8 x" t& d4 M+ F. Q" A( C# Z; n; F
hwiParams.arg = 0;# I( B |7 a8 ?" `+ c% V
// 不允许该中断自身嵌套
3 D2 `$ ]" [* {, L s hwiParams.maskSetting = Hwi_MaskingOption_SELF;
) v& n4 v2 g; v6 F; y // 使能中断( l# O' k% y3 R# y
hwiParams.enableInt = true;
3 H+ J d! n( `9 z+ e7 ^ // 可屏蔽中断 4
, i2 p% q, d; Y0 a' Z. X I" d // 中断服务函数 hwiMain6 G& g) f8 z6 p+ ?
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);: w) W/ B( p. a
if (hwi1 == NULL)
' T: S4 U9 \# Z System_abort("Hwi1 create failed");* ?1 `4 O1 t" s! R; D. {7 Q) }
BIOS_start(); /* does not return */( Z/ ?9 J: K8 }
return(0);4 w) N, d$ a* [% O M
}
& j5 T" |7 [7 b, R- [, q( J- h; U$ s/ j8 N# b8 q* ~$ B {, P
|
|