|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
" c: b% I! m: I5 I// 发送缓存
) P' i, L. w# s7 ]% y7 X u" m5 [char Send[] = "UART1 test......\n\r";# s6 E1 g; O1 t- Y& B" q% M
5 `" z; x' a8 y$ o/ i
extern void UARTconfig()
( V" T3 }8 P" W{
5 o" L8 n, c7 a" p' k+ Q //使能Uart1
- a0 @2 S2 R/ d- |3 } PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# G+ p; i$ p G" T
* V, W0 ?; W+ v4 x8 g+ M // 使能 UART1禁用流控
# N" [- b7 {; w2 u$ V" W b0 \ UARTPinMuxSetup(1, 0);
/ u6 s. L4 t+ F, ]; |
" ]. Y/ P- t" g8 ^3 |. }$ w // 波特率 115200 数据位 8 停止位 1 无校验位7 N; t# l9 g# M1 K* D( K9 j) ~$ ?
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* }% B9 X$ C9 w3 G: w9 m% B, \
0 o6 c+ P- M8 M) |/ P1 G // 使能 UART1! h2 e# P. k5 w2 J$ c' q
UARTEnable(SOC_UART_1_REGS);
1 g1 o3 D! K8 Y: |- q+ b' n // 使能接收 / 发送 FIFO) n* B/ W- y Y- ~" y
UARTFIFOEnable(SOC_UART_1_REGS);! |* I# q" t: E% ~0 P
// 设置 FIFO 级别
1 {9 b3 m9 t) r8 t' n& S UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);- t! k6 ?3 A) z6 | O- H4 a+ a
//Uart1中断使能" i- g; w4 a, F3 Q
unsigned int intFlags = 0;5 ^% L3 [' y0 ]/ z4 Y8 p) z
intFlags |= (UART_INT_LINE_STAT | \& B9 \* S. A2 g: U4 R5 G
UART_INT_TX_EMPTY | \6 ^% L0 k7 l+ T' a3 U
UART_INT_RXDATA_CTI);# v* w3 x* T/ d( r! ~6 j4 `
6 t+ T/ [+ y4 T) q8 i UARTIntEnable(SOC_UART_1_REGS, intFlags);
$ o! v/ }5 f7 ?' r' M}" y' g. G9 ]! k9 j5 y0 o7 x
//UART 中断服务函数
& }2 j8 Q0 U; [) M9 Svoid UARTIsr(UArg arg)
0 n- S8 `7 H% ?7 t4 a{. m3 B4 K# `6 i& j* e& _+ T
static unsigned int length = sizeof(Send);% f3 m' [ `; b. x
static unsigned int count = 0;
9 `, P0 Q+ O7 J1 O/ O unsigned char rxData = 0;
9 Z9 I, f4 F0 l3 F7 y; ] unsigned int int_id = 0;
1 j5 }" X/ N+ W/ o: _ // 确定中断源4 R( O# c9 |1 P1 [& ]) @
int_id = UARTIntStatus(SOC_UART_1_REGS);
5 D ~. m0 B2 W5 V // 清除 UART1 系统中断
+ e J: Q! z/ o8 O/ _" v, ] IntEventClear(SYS_INT_UART1_INT);
8 M; ]. W- T4 l) m9 ^! ]5 h7 R8 O3 u // 发送中断
1 b7 X- F9 x. B9 j3 K9 v& J- H+ c! N if(UART_INTID_TX_EMPTY == int_id)
- h2 S5 W l( ]' C8 ?: M0 ~ {: y1 F5 ~: k2 ?; Y
if(0 < length)
* {. w, o _8 ^( b; A" r {
8 w/ S2 d F, p# U( Y% v // 写一个字节到 THR
7 G& C! W- V4 T UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
' f( C: \' f I0 ?9 {, s/ ] length--;% _& Q( b/ J6 P
count++;
; J8 d3 U8 K* E. L/ I } a2 A1 k# L, i8 v& b$ w6 s
if(0 == length)5 i' w% S( e3 f8 y, |) s; f
{3 V: e8 z4 ]) z, A, w/ W. v
// 禁用发送中断
2 O4 W5 t4 P# _! P UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
& B1 |3 W% S; F/ y! a6 ] }
+ ]7 t/ u4 V6 W. P" t" k; \# W/ U }
! h3 }3 c8 o( k9 u3 j // 接收中断8 S( b/ B" B% i$ i5 ?/ P
if(UART_INTID_RX_DATA == int_id)& L8 K2 \' j0 X' G
{- E- m, Y- t! y# [3 ~- F. W2 ?+ \
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
: J6 }4 U3 W! Y3 n& d UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);7 f: n& e: i- B: V8 g, r! }7 J
}4 d% C) O) n5 K$ o( n, e9 ~1 r: u
// 接收错误
( H! o$ S% c9 { if(UART_INTID_RX_LINE_STAT == int_id)
) ~) l% I0 N3 Z% C" x% ~, y {
6 a _( n. K4 v/ ]9 {* H while(UARTRxErrorGet(SOC_UART_1_REGS))
. Q6 ~! T; r& n4 ?4 K( Y4 ` {2 T$ p3 k) Q% w
// 从 RBR 读一个字节
! j: J. d4 Z1 ~. }4 o) V2 Q3 V UARTCharGetNonBlocking(SOC_UART_1_REGS);
) K- `4 l0 S! c' t }1 N$ g& _. @; r
}
# x& H9 l# n5 M7 Z: y3 @ return;
) ^* B. F) l$ q7 b( X' J3 C}
. A' o& Q( y7 V' x/ ^' D, {$ SInt main()
* B% h+ K, R: X/ _{ + W- e: P1 `. F" ^
UARTconfig();//uart 配置7 k6 Z! j0 Y$ V9 O, [
Error_Block eb;
' q9 E; Q) @" D* s. }1 d System_printf("enter main()\n");
2 _2 v# C2 I0 K6 O5 m; ~ Error_init(&eb);
3 r' b5 C9 o& S& B2 r, u // 动态创建硬件中断
7 V, [0 z6 Y1 O Hwi_Handle hwi1;
7 r% p+ ^9 z" N. [ Hwi_Params hwiParams;, c! }7 X) n5 r6 T# e9 j
// 使用默认值初始化参数
9 [5 p; l9 Q6 r u$ Q Hwi_Params_init(&hwiParams);. ~8 s- l& v' G5 H( R
// 中断事件% q; \ r. z3 u
hwiParams.eventId = SYS_INT_UART1_INT;
0 H" k* @, N+ Q! Y3 h // 传递到中断服务函数的参数7 r7 i' k, ^" Q
hwiParams.arg = 0;6 { Z; F% ?+ F- R
// 不允许该中断自身嵌套. r0 h6 }2 [# b* x! c- w, l
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
$ [( E2 n5 k& v& a* _& f // 使能中断5 G5 C. \+ l* y6 K) Y
hwiParams.enableInt = true;8 p) T& Y2 A3 M8 e8 `$ h
// 可屏蔽中断 4
! p0 F/ u/ c$ `' n // 中断服务函数 hwiMain
' N: T( `' e# ~( f9 a C8 g4 N hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);$ A9 F5 R) J1 n5 ?8 N' q
if (hwi1 == NULL)3 _- S+ I" K# g/ P% a, n# S) A* Y
System_abort("Hwi1 create failed");
. O3 k. p. U- y1 U6 O BIOS_start(); /* does not return */7 X: S3 V* }7 I7 w+ x
return(0);
+ Y' O" q1 ]' U% N4 N}4 v. C* y% ]- ~
& y O4 V; l7 q |
|