|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下2 I \; B2 T q# T# `
// 发送缓存0 C, i) ~6 F1 N/ F, z
char Send[] = "UART1 test......\n\r";! T3 h8 r+ H- C: a, t3 J4 }: T1 c- |
x. i) C8 @9 { _/ @2 sextern void UARTconfig()! Q0 Z, z. P$ M1 a$ x
{- N. V5 a1 {. }: m
//使能Uart1
$ Z" Z( G3 l* |7 }* Q PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 X* ^- {4 h' t. R$ \ P+ o; v * Q M2 A5 d3 y- `1 Y
// 使能 UART1禁用流控 \, }9 x: T" z2 l8 Y) [' n
UARTPinMuxSetup(1, 0);
* [, x* y% p- C x0 u4 w" U) J 5 ] B5 b) I. v$ Z9 u6 A( y! m
// 波特率 115200 数据位 8 停止位 1 无校验位4 k2 e9 O1 p! I
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);0 P7 i& c9 Q3 P1 n- \# r1 ]
2 e# L9 B. M0 T" w3 Q // 使能 UART1) Q, L8 S% C" U: V- C% e, {8 n
UARTEnable(SOC_UART_1_REGS);
; h- I- i- N8 \( P' d // 使能接收 / 发送 FIFO( g' o; f* X' i( z
UARTFIFOEnable(SOC_UART_1_REGS);" G+ A8 o7 s1 V/ }
// 设置 FIFO 级别! i: D1 L2 s3 M E% t
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
& a o$ |4 _* k6 m/ \/ Y2 R3 b //Uart1中断使能
) q0 ~# R+ W; x unsigned int intFlags = 0;
2 i8 n, N- W" w# D6 [0 x intFlags |= (UART_INT_LINE_STAT | \
' t3 }8 y0 V$ H% U9 e% Z' A UART_INT_TX_EMPTY | \
/ L6 S# ^. b8 N2 l4 S UART_INT_RXDATA_CTI);% w2 W& D/ V/ N; s$ M
7 p1 ]- N$ B) m
UARTIntEnable(SOC_UART_1_REGS, intFlags);
: M2 n, `+ s% }$ X4 `# h7 o}" {% m B$ {% H# V6 }9 r
//UART 中断服务函数
5 e2 g1 K+ B. g ]* nvoid UARTIsr(UArg arg)8 t$ ?& U8 e9 g9 }+ b" l
{ d2 g( V/ F; x
static unsigned int length = sizeof(Send);6 D2 _! w- y: Y- o# O5 u
static unsigned int count = 0;
( a Z( U( u% j5 E1 P. i; w unsigned char rxData = 0;
& F: d" a3 j1 F unsigned int int_id = 0;
" y- \' Z) Y$ l. a // 确定中断源# F9 ^1 ~" Q, P" m% E
int_id = UARTIntStatus(SOC_UART_1_REGS);1 l8 h% W% u8 g' B
// 清除 UART1 系统中断7 k% ?: f3 O/ G; D. C' z
IntEventClear(SYS_INT_UART1_INT);
$ h- J7 e, `" G" K! e, e // 发送中断) ` Z q0 _) U: x" I6 U4 a$ w* e
if(UART_INTID_TX_EMPTY == int_id)! C, E A, b% e& x" |3 r* D( \
{! [- u/ Y q2 c! e& C2 X/ y
if(0 < length): r! l& x* |# b
{) E, J- F3 J/ w2 s
// 写一个字节到 THR: J @ P T9 f; a' H* ~8 G5 _
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);& w* I \& j) y
length--; T4 {- b, w4 t( B: O: ~
count++;
4 d8 i/ I2 {7 Q( T9 ]" g" j+ W4 ?7 m }
: Z: m' D! {9 t if(0 == length)
/ h- S& a2 J! I' N* r; e- O {
1 t) h0 g& }+ F9 y; n& `3 M9 M // 禁用发送中断
/ a( ` P/ ]7 K* y UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
X, ^% l/ N) }; j' l4 ^. B }
! `4 M: t6 n- g2 [( \& y0 R% m }
) Y: Y$ F- A% Q [# L0 f( i( A$ A // 接收中断1 q2 B; w% ]7 w# |$ @$ O8 j
if(UART_INTID_RX_DATA == int_id)- O4 }0 `0 x; H7 \
{
, |; v; n+ J7 X; x! J, m- z rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);% m! A4 o+ C J
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);+ T, B8 ^/ D( \. ?3 a7 @
}
( p" T4 i6 [9 K7 u) D // 接收错误
' p: I# |4 ^, q+ b if(UART_INTID_RX_LINE_STAT == int_id)
; d0 O$ a t- K3 N e! | {1 I3 z i$ Q4 E2 n4 D
while(UARTRxErrorGet(SOC_UART_1_REGS))
, A: R( W& M; ]4 {& G% m {% M' Y1 \* K0 w X r6 Q9 B
// 从 RBR 读一个字节4 e, P6 g7 _# n% n
UARTCharGetNonBlocking(SOC_UART_1_REGS);. `8 I A# B/ x. W1 ^
}
( M) A w) a0 L( N4 |( u- s3 F }
4 ^, v; C" o! |8 H3 M- n return;
?" P) \: P& a/ T! U: L8 k5 o}6 f5 o6 |' y/ S; w+ M+ @/ `
Int main()
& N1 o- z$ _$ T! H C! U0 {7 C% c6 |{ - s- n2 ?5 K1 E$ _, b
UARTconfig();//uart 配置
3 x" E& J7 a8 @( _ p; a Error_Block eb;
1 q0 H( y8 V( h$ z; v2 G4 e System_printf("enter main()\n");% @! J( s% ^) B, J6 b2 I
Error_init(&eb);' l# Y* Y5 d9 x* e" s ]
// 动态创建硬件中断- z9 p: |6 \+ `! k
Hwi_Handle hwi1;. O5 V2 A0 X; }- x2 @+ D5 D
Hwi_Params hwiParams;) j. r# Z) Y( G3 e
// 使用默认值初始化参数
2 _1 U ~4 Q) m3 B Hwi_Params_init(&hwiParams);9 k: k, I! A; q: q- A* d0 L2 m
// 中断事件
: _+ N0 s T |# r) }9 P hwiParams.eventId = SYS_INT_UART1_INT;
* m. h/ C8 F1 m4 i // 传递到中断服务函数的参数
A( H/ V- G/ L hwiParams.arg = 0;! w& `' j7 j9 @, T
// 不允许该中断自身嵌套9 J/ s: N) \- R! e0 ~" e
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
" B' X" g3 g+ C1 u* s( N( c // 使能中断& J7 I* L6 |, t9 P- Q
hwiParams.enableInt = true;
5 j* ^% k- l( ]' e4 T7 r // 可屏蔽中断 4
2 J6 X8 Q; u2 t3 C1 i O. Z; y // 中断服务函数 hwiMain% A) k) A- G: Z, ~5 T
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
* E) Q6 F# Q [4 y' k( m3 a; A if (hwi1 == NULL)
) p. a0 {+ l9 z System_abort("Hwi1 create failed");! ?9 b! R. S$ W
BIOS_start(); /* does not return */( A! }4 }& j- I3 w+ L# A, W* X$ R
return(0);, V" I8 R4 Z& B8 V+ ^1 P( G
}
5 m' `( R( z* P+ W8 k1 [4 D( |
, z! V% q# e( s+ H& S7 D, b |
|