|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下$ G( q: A7 G& y. L8 o J6 S
// 发送缓存
4 H4 \, D- B; g# _6 achar Send[] = "UART1 test......\n\r";
1 a4 ]) f4 B W" r
0 M6 w5 F0 H; ^4 B, ?/ v7 v, @1 mextern void UARTconfig()
/ `7 O' ?) W, B' J D3 c9 t{
0 X y6 `" I8 D) `% ` //使能Uart1% u/ y- S% R, y! f- h3 H: ?0 l* B
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# h1 o7 W7 U- }+ a' `
; q j- V) F8 b- X" j
// 使能 UART1禁用流控4 {# V3 x7 I$ M! Y2 G; Y
UARTPinMuxSetup(1, 0);) Y. x9 P1 K" [/ h C5 ^5 T& C# C
7 `. Z h1 v3 ]" {9 H% r0 N // 波特率 115200 数据位 8 停止位 1 无校验位5 S% c* |% l# h7 P$ {
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);2 r! s: w; W6 n0 U! s
% {0 v9 u* S H- c& h // 使能 UART1
) m+ w5 t# u- ]6 Y; o' x6 W! y UARTEnable(SOC_UART_1_REGS);
j( O2 Y! y# c) ~; G- L% C5 D/ D // 使能接收 / 发送 FIFO
% Z. ~# v8 D8 F1 E! C" V& Z UARTFIFOEnable(SOC_UART_1_REGS);9 w" ^, \' C' R$ Q; [( ?
// 设置 FIFO 级别! t( [+ P! q* t2 d5 a
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);) c w0 X) ]4 K2 y
//Uart1中断使能# Z( j. ^4 H" I- s+ [+ @
unsigned int intFlags = 0;2 N: K3 J$ E' d* S8 f" W
intFlags |= (UART_INT_LINE_STAT | \
, m7 S& j" Y9 d UART_INT_TX_EMPTY | \ c+ J6 g# L1 ~3 a/ F6 j, Q
UART_INT_RXDATA_CTI);7 [$ y% t; m; a; F5 j y
' ~- ^9 m+ S; G5 A5 P
UARTIntEnable(SOC_UART_1_REGS, intFlags);6 h- Y% j% [" M! y- {4 ^
}( }7 r. E2 `* }. b7 x$ b# D7 s
//UART 中断服务函数
+ m1 Q9 g+ a1 L, ivoid UARTIsr(UArg arg)
; G( |, m1 u4 c3 }& s; y( ~{4 @2 y, ]( B9 r; q1 C; h
static unsigned int length = sizeof(Send);
+ D# O* g- |- I* w9 f static unsigned int count = 0;' b' D8 M( x; H* Q; E" d
unsigned char rxData = 0;0 h( U0 ]/ q. H
unsigned int int_id = 0;+ D! r9 p' p( w! V. w! \0 R
// 确定中断源
+ C* q* u+ P8 B int_id = UARTIntStatus(SOC_UART_1_REGS);5 |% x0 [, n) e, y
// 清除 UART1 系统中断( J, V" o) s) G% H: J- v+ X
IntEventClear(SYS_INT_UART1_INT);
3 [0 L# h* ~+ i3 m // 发送中断
+ X u' f2 [6 i9 h% l- b if(UART_INTID_TX_EMPTY == int_id)/ P" k" ?, B% H
{
M- v6 d. `( x" }" ?4 s if(0 < length)) |' C2 D: o( w( E# E; p
{& o, r. r) ^( {4 P( a; r0 L0 U! J3 S
// 写一个字节到 THR
2 w8 ^* i/ P/ n; l UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
" h4 N5 v0 G% E0 w7 f length--;
0 `% c; c8 x/ R+ F count++; ^ `' w1 t! l6 `0 R
}
' R e/ C9 Y$ V+ i if(0 == length)
7 k! a1 g" y& v1 \, Z9 m {
' X1 G* z d2 N3 [2 g& z/ o5 Y // 禁用发送中断: }. E0 L2 i" j( t& d1 Y7 P
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);" [# \% }% H% T
}3 s2 O3 m4 e- Z1 Z
}
' \4 h# c) \! G* x // 接收中断! C( c2 H( {3 V# ^4 u: R' A5 O6 B
if(UART_INTID_RX_DATA == int_id)6 {0 t0 X3 ?0 m n0 ] o# t
{* q; c4 @# |% C0 k$ [* A
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
. T) n. b' W* [9 w% M2 a5 l& j UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);. A' v& X7 r( S/ `8 ^' B
}( @9 }7 n0 w& }7 C: B
// 接收错误( a# b! ^5 @# E- m! d/ P! w9 |/ s
if(UART_INTID_RX_LINE_STAT == int_id)" m3 S6 @+ M- S
{5 c" ~% P. ~% c! y9 {
while(UARTRxErrorGet(SOC_UART_1_REGS))
& G3 z1 z, _9 O9 e$ X* h {, t5 _: `6 z: K g
// 从 RBR 读一个字节
; d% _4 o( r4 U UARTCharGetNonBlocking(SOC_UART_1_REGS);6 ^6 N! N1 Z S
}" ~' `" i3 v, X' O6 w' R' G
}
5 [5 ~- B9 |8 c5 ]% `1 {9 A return;" }8 M" ]5 j& y& H$ U* W* }
}
( o' O5 N- n7 a0 \0 F* Y: ]" YInt main()& D! b$ i9 X6 s/ [* t
{ ' Z, M/ C& ?4 V, a
UARTconfig();//uart 配置7 g, c' M8 Z# T3 t2 T9 O6 T4 z
Error_Block eb;; v! z; ^( G" L d
System_printf("enter main()\n");
1 {0 C8 c& x$ }1 j9 C( j! a Error_init(&eb);! n- f4 ]5 L6 w: y- o6 }# b8 n
// 动态创建硬件中断
" V) d# E! o- B* Z$ f( L. R Hwi_Handle hwi1;9 q" j; H" c" M
Hwi_Params hwiParams;
# C+ A3 _, o8 j& D // 使用默认值初始化参数) w" D( M) M+ Y$ J/ \
Hwi_Params_init(&hwiParams);
4 V1 O( R. V2 f# R5 D$ v, o( A& J // 中断事件
( q: X, Z, K3 `: Y hwiParams.eventId = SYS_INT_UART1_INT;
8 g/ B6 W" J4 E V& O! O+ a! V // 传递到中断服务函数的参数. p- K! r# j% I' W4 @
hwiParams.arg = 0;4 W& z4 ^' P% K, f
// 不允许该中断自身嵌套
) z. ^4 m- Z" c& x: ]/ T( Z, g& R0 O hwiParams.maskSetting = Hwi_MaskingOption_SELF;
0 A4 o, b" T# X, G. U // 使能中断
v: j% B. D: h5 t1 r hwiParams.enableInt = true;
5 G) t# A1 Y4 { // 可屏蔽中断 4, ]8 q& w m- T3 j w+ u2 {0 u
// 中断服务函数 hwiMain
1 P6 j6 o+ Y% Y5 L ] hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);' F9 U; |8 _8 t4 Q( m! S6 L
if (hwi1 == NULL)! T" b- r5 T! u5 \, z* ], O" G
System_abort("Hwi1 create failed");
/ `% |- s: a1 A* J9 r BIOS_start(); /* does not return */
5 X7 E7 X9 j+ F& M* w return(0);
6 v1 D L P8 Y5 w h6 x) o}' \7 a6 r5 D# c4 L8 m' j
0 m8 i& F3 D3 e! Q
|
|