|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
. `7 c% g# P4 r' l// 发送缓存
# o: }; }) Q& n7 G# Ochar Send[] = "UART1 test......\n\r";: y6 `; R* {9 p: r6 Q
5 N% |. R i( S( `extern void UARTconfig()+ S+ }3 P6 }" r
{* `. z7 n% k( t# r5 Y a0 J5 M
//使能Uart1, F$ K: p9 @! v6 _6 ]5 |1 B
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( d w# O# e ~6 _" l7 l7 R 2 O! h# p( b/ F! s" V
// 使能 UART1禁用流控
! t8 a0 b4 I3 g9 j4 P/ _ [, \) V. @ UARTPinMuxSetup(1, 0);
: \! b0 _0 u" m1 O% t+ T* b5 A1 N( r + v) Q, [, b6 q5 A! Z
// 波特率 115200 数据位 8 停止位 1 无校验位9 c, `* B( Z9 n" ?# `
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ z. p7 ?0 e0 s; i. Q( K1 [ 7 ~3 k/ e+ Q: z: c5 D
// 使能 UART12 y" ?, ~" ~- a: D8 [
UARTEnable(SOC_UART_1_REGS);
! S; c6 U) x* Z // 使能接收 / 发送 FIFO
" Z" L5 ~* w! T! e( X UARTFIFOEnable(SOC_UART_1_REGS); }* x# `( P& D6 ^
// 设置 FIFO 级别
$ E- g6 { F0 b5 @7 j& G UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);' p4 W4 P0 e5 g
//Uart1中断使能
# |$ ^( b! j6 J5 O& s/ D unsigned int intFlags = 0;
2 l) v& I9 A1 U0 E" h intFlags |= (UART_INT_LINE_STAT | \
( S: U4 W! m2 Z+ v6 K UART_INT_TX_EMPTY | \
6 ~' M- e6 w2 {3 A6 z UART_INT_RXDATA_CTI);
3 P5 j& p( n/ b$ t0 N& {# ?# M 4 z. R0 x5 {2 c$ h+ V, d n. m
UARTIntEnable(SOC_UART_1_REGS, intFlags);$ ] h1 ^9 D" o4 y* [' z
}
' g) i5 z5 r& A7 m a8 J//UART 中断服务函数. @8 x" h8 R2 M* D3 T/ z. e" s5 m
void UARTIsr(UArg arg)
( L! ?; w" j: Y) @{
/ `% V" ?# T9 o, ~ static unsigned int length = sizeof(Send);: y- @. `( x( Y. d- ]
static unsigned int count = 0;
: k+ u6 z! ?8 I) z8 O% M unsigned char rxData = 0;
6 S7 Z ]0 f: X0 a. X unsigned int int_id = 0;
( Y) ?3 K* B8 t // 确定中断源
' j. D0 O( _; r3 f$ w int_id = UARTIntStatus(SOC_UART_1_REGS);0 {* L# K+ n6 D! M p
// 清除 UART1 系统中断
6 a4 q+ ~' B# S7 o2 N3 a* w IntEventClear(SYS_INT_UART1_INT); D c9 l$ P' N
// 发送中断
7 u, C6 R n7 L' P0 B, d5 U if(UART_INTID_TX_EMPTY == int_id)
+ q# b7 g2 G! }1 Z0 a) ? {( |, }3 _6 G* K/ I; I, _
if(0 < length)# t6 Q9 J& [! V1 q( R l0 _
{+ m+ c$ U5 R; Q1 [. a' X, X
// 写一个字节到 THR
1 _* J9 K) M2 T. j9 x UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);3 F' [# p2 z, {% H( b
length--;
1 o `& v, K, a* ? count++;& S0 }# V' y7 ]0 Y& R
}
" k& V* g( p/ H8 l. m" ~1 }# { if(0 == length). m! ]/ ^$ V P" c9 ]" G) K: r6 z
{
& v9 U9 @: ?$ A // 禁用发送中断
3 P* q! F/ p. g UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
! j5 s# X/ [' [3 O }
5 B) S5 k, E9 ^1 t# k$ ?& _8 [ }
" h1 G: [5 k4 M$ |4 g7 M2 V // 接收中断
, ^2 @; `# t, p1 p/ I/ q U8 t if(UART_INTID_RX_DATA == int_id)1 p0 ?; G' m) R, s7 E7 c+ g x! N
{
( v0 }9 S7 q0 c$ Y, p s rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS); v' b5 Z- a- h% l
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData); w- ?, b4 |: R. V
}
4 J' R: k2 f, G7 J // 接收错误
6 A0 R7 y! r* r1 U! L5 z if(UART_INTID_RX_LINE_STAT == int_id)
# [" @& S% g7 C3 i {
* D' ]7 v0 k- L3 Z* f2 M while(UARTRxErrorGet(SOC_UART_1_REGS))7 u" L; p/ }; r0 r" P) P8 s) {1 U$ ~
{) X, v7 a6 V' R1 e& _
// 从 RBR 读一个字节' Z+ d+ J" N4 l0 Z
UARTCharGetNonBlocking(SOC_UART_1_REGS);+ e N0 ~* `. M
}
, T7 u5 }0 L( V& ~. E( w& v2 ]2 i }
! O2 ~6 H @' }1 I return;, L" E. h/ E3 M6 N! Z/ k5 r
}( I) H! O& l) j
Int main()
, o M8 H1 ^8 \. B{ $ v6 p0 o. V% A) w f! ]" }* ]* ^
UARTconfig();//uart 配置
) A# R) C: T' q1 h9 T* S Error_Block eb;* l9 L5 }* @, u7 O/ G4 i
System_printf("enter main()\n");
% Q# ~6 Z7 N5 i3 X4 D% i3 d8 @& Y Error_init(&eb);
, X; m- a1 Z: Z$ D: A // 动态创建硬件中断: H$ M, _5 X) b6 a4 i. W3 L2 K
Hwi_Handle hwi1;
0 [, E: e. u! {; O% b8 `, H4 G4 R Hwi_Params hwiParams;: f. o! g$ v( r
// 使用默认值初始化参数
: U T5 W. S2 E( @3 u Hwi_Params_init(&hwiParams);
5 g* `: k/ }6 C/ N/ r // 中断事件; J" C; g- D) z4 @
hwiParams.eventId = SYS_INT_UART1_INT;
: l, R9 K4 {, h( n/ X // 传递到中断服务函数的参数) [! r+ s% q, C' V% |) x# ?
hwiParams.arg = 0;
$ n% m8 v0 r& b4 N. p0 C // 不允许该中断自身嵌套' Z3 I5 V1 W, {% @- D
hwiParams.maskSetting = Hwi_MaskingOption_SELF;. t% B0 x) P8 ^5 N
// 使能中断
7 W4 ?: ~; M9 Q5 z$ s hwiParams.enableInt = true; v* X) X/ m, C7 Z! I) j" [! ]
// 可屏蔽中断 4
; H4 C+ [6 i9 Q // 中断服务函数 hwiMain! ?* K R$ B+ ]' C
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
" B0 V& V& J7 ?0 B if (hwi1 == NULL)
* V( A5 I5 S6 l1 I: H; }, D System_abort("Hwi1 create failed");& Z( u m* W+ P0 E% e1 N. H
BIOS_start(); /* does not return */
! u0 y5 k/ X M+ C% e8 K return(0);
; n+ t0 J# @0 ~# J}0 p2 h S: [- q& B+ e9 A
f3 \' m6 J% `. r0 q# t$ E
|
|