|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下" z% }% N3 c! @: J6 A: Z: M, E
// 发送缓存
$ |$ x1 p5 e$ |2 k7 Q, h3 ~6 qchar Send[] = "UART1 test......\n\r";
- }3 Z- _: M0 T; b8 p N/ @3 H/ n. @ ~1 m4 g/ n
extern void UARTconfig()
3 r8 [, Q: m% l5 v{
; h% y% O8 l y( B //使能Uart1
% H' h- g0 q5 V: V- J PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);3 }6 f" r. v4 O. v
A+ i0 w+ q6 o% ? // 使能 UART1禁用流控
8 L, b$ Q9 ?' V( e5 a6 P UARTPinMuxSetup(1, 0);, {# l$ M& ]& e' u& ~& m
% K L1 c- i& L8 S' M
// 波特率 115200 数据位 8 停止位 1 无校验位" @3 _, H5 \. `' u6 C
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);& S! W5 O/ b1 W7 e# P3 b
, c" M$ I9 H. x8 A // 使能 UART1, T& t6 O, u# H' j" u
UARTEnable(SOC_UART_1_REGS);
. G* y% D/ R) k: p9 r$ A$ |( T // 使能接收 / 发送 FIFO- V4 |6 l& |/ s6 `
UARTFIFOEnable(SOC_UART_1_REGS);
5 ^/ X5 r2 o( B' b4 L // 设置 FIFO 级别. R) X3 e; [! ]& k
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
9 u0 H1 |/ i/ t1 S* G1 h6 T! @ //Uart1中断使能" v& K. I, ~' H. U/ j2 z, c4 E* F
unsigned int intFlags = 0;
: L+ a/ ~3 L- e. b intFlags |= (UART_INT_LINE_STAT | \
' J! n$ u' i! G" |" p! r$ H' a! U UART_INT_TX_EMPTY | \
- V6 y+ Z* G# S# E( k7 a$ J UART_INT_RXDATA_CTI);" m$ y4 S2 A, S; L
+ U7 }6 [1 I* V4 b- ] UARTIntEnable(SOC_UART_1_REGS, intFlags);
# d# U" P9 I Y% u2 B}4 g8 M/ V; A9 S9 X/ w
//UART 中断服务函数
" O% x6 ^, K ^7 Ivoid UARTIsr(UArg arg)% {: j# K' Y+ O3 t6 u/ ]
{4 n: {$ b! j% M$ E5 U9 W" H; L- _
static unsigned int length = sizeof(Send);3 _, g% e! r, V b3 X' h: h x! y
static unsigned int count = 0;; G7 x, T% M, B" \/ G. T. J
unsigned char rxData = 0;
; ]) b! \4 u: Y unsigned int int_id = 0;
3 i! C0 Q; `, E- f1 i // 确定中断源
3 s% J$ o! ^1 r" }! v int_id = UARTIntStatus(SOC_UART_1_REGS);
* U+ e5 q. K. a6 d: N( O // 清除 UART1 系统中断9 b$ q5 P3 r" D1 M5 b0 a
IntEventClear(SYS_INT_UART1_INT);1 @" O. @4 ^6 W; ^! |
// 发送中断9 K$ `' ]6 }& V- \* i* n
if(UART_INTID_TX_EMPTY == int_id)( |) ~9 ]. j& J L8 t
{
8 r) K) m/ V; s2 o! u2 k/ ?; s7 x( b0 R if(0 < length)
6 Y, M$ l7 y8 F$ x6 I4 r; o { l3 J0 t1 ^+ c& h
// 写一个字节到 THR; D/ |, u5 E8 j; b9 S
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);5 M |$ h8 V8 R$ F
length--;) Z! J0 a2 l$ W
count++;, I+ {' J4 Q* w* P- o3 e3 b
}# X) S+ F l. }; q% ~
if(0 == length)
/ F* o! N2 T, Y& m' ` {
. P( Q8 }7 ]6 [0 X // 禁用发送中断, B5 c# _" U4 k3 Y2 o
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
9 _# J' c& I3 Y) B# ~ }
$ d9 c- e) X/ V8 D [. O& M }/ n3 A1 F" w- P0 V. s2 p+ j5 e$ b6 C) S
// 接收中断- |, V. z- H& M
if(UART_INTID_RX_DATA == int_id)
0 W% v- h" T/ s X/ w# u- J4 K) y {" y/ Y3 e7 @- n! b3 Y$ V5 C7 j0 o/ Y
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
0 a- V: B" N% }" L, y UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);. J0 M1 f8 q& e# g, s7 o
}
& D# H o1 P7 z. l& u // 接收错误
( B0 d: u/ O* }4 `! L9 e& d if(UART_INTID_RX_LINE_STAT == int_id)
2 Y) P$ C2 h* l) O {
5 ?3 d$ c- u; O: m+ L; R- M while(UARTRxErrorGet(SOC_UART_1_REGS))
, B* d0 s# B1 ~7 u8 y- G: [9 V {6 Z: ^) `; i7 |, @4 w
// 从 RBR 读一个字节
5 G' F: Q0 l# r UARTCharGetNonBlocking(SOC_UART_1_REGS);% s% ?. h4 d& T& Z( {/ b
}! _* U' R# K$ U! M! [7 T' }9 @
}5 c2 H2 I- [* \# Z q, w
return;5 f; i5 K/ e6 ?" [7 v% @
} ^4 ]% j3 h" G n3 d
Int main()7 D4 R) _" K* Q" i: \
{ $ x2 i/ V7 q/ Q+ T
UARTconfig();//uart 配置$ }9 R$ E! x7 \* l- a: @4 d3 Y0 ], ~
Error_Block eb;# |3 |/ R$ {3 L, v# Y
System_printf("enter main()\n");
) I) f3 C$ C2 S+ R Error_init(&eb);0 J6 l; @+ a( j& |6 K+ P. a
// 动态创建硬件中断
- l4 _* _3 J. @. E+ l Hwi_Handle hwi1;
% j" T: C/ S/ e: v( k Hwi_Params hwiParams;
7 |$ D3 M9 K" \: T // 使用默认值初始化参数: g% B- G9 _8 I) Z9 {# ~0 u
Hwi_Params_init(&hwiParams);
# V- S3 J4 k: S: @0 f: B% k // 中断事件
$ j; }" L) ~8 C/ Y* s0 Z hwiParams.eventId = SYS_INT_UART1_INT;
' e, I9 `/ U( u: S // 传递到中断服务函数的参数
0 a2 b6 l9 m. ` B }3 V7 m hwiParams.arg = 0;; D3 ]: g( Q' }8 ]4 M: A4 P
// 不允许该中断自身嵌套/ ~" H* W( F k/ f- \3 ?
hwiParams.maskSetting = Hwi_MaskingOption_SELF;0 ^' q3 x% y7 I" l+ G' M# q# e) M
// 使能中断
& Q- N) ^, x' Y+ d/ U0 Q hwiParams.enableInt = true;
6 t9 @! A2 [- t // 可屏蔽中断 4
1 c( g4 ^2 g0 L // 中断服务函数 hwiMain
* w/ Z, {6 C) e1 `6 ] hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
7 z& b) c% \, d" z if (hwi1 == NULL)
2 {* o6 E" ^5 S9 \/ [! o! m System_abort("Hwi1 create failed");
- w( s% l- h5 q" [, U8 X/ f7 `" j BIOS_start(); /* does not return */
1 L+ `& |) w2 g3 b; E return(0);
& G: O+ j* ]6 I& h2 l1 `) w3 Y}
& y& P9 F9 e# t3 n# a+ i/ F6 L& U( M/ q' o3 |5 Z+ b5 Y; i
|
|