|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
; g- |; I9 E( |2 F8 U// 发送缓存
# |! b/ P' o6 o, D" {- A4 Zchar Send[] = "UART1 test......\n\r";# u. V4 V' I/ E" D7 J. Z6 o
+ n# M) { {% j; {6 n7 F4 }; j' j
extern void UARTconfig()
# n- `5 Y/ M) ]2 K; q{0 `: p1 { ~6 e+ G4 C# P' f
//使能Uart1
O' Q) ?, M: W# N! G2 F PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# w7 ?$ o# a3 R0 i+ f
/ c: l1 \) ^5 E# |. l // 使能 UART1禁用流控6 }6 W! `. o+ O6 `
UARTPinMuxSetup(1, 0);
! A- [% V P Q% m! Y9 w) @- W
# U* n4 }: X$ A7 ~! x // 波特率 115200 数据位 8 停止位 1 无校验位
* X8 _- S7 p6 `$ b. r3 z5 o$ L UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
( F. E, u! e7 @1 B# T5 ~
6 y3 E0 h# \# k! r: E" \ // 使能 UART1* j6 n6 l' Z9 z
UARTEnable(SOC_UART_1_REGS);4 D* @4 {# `* d# W
// 使能接收 / 发送 FIFO! D) w( b* S% J! t7 X- b1 @. _9 T
UARTFIFOEnable(SOC_UART_1_REGS);. u: i! H6 ~4 ?8 W7 d
// 设置 FIFO 级别5 X* }7 }/ l K! M% Y/ Q$ p2 }5 i
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);! b3 {" k' N; B$ k! J; V( t
//Uart1中断使能5 @( ?2 D2 {# ~% O
unsigned int intFlags = 0;
) B& u, S3 s& H, N/ t# v intFlags |= (UART_INT_LINE_STAT | \% G7 X2 e/ i/ _7 ^" Z
UART_INT_TX_EMPTY | \
& s G, R" @# W; M# ]6 Q& L5 x4 C% d UART_INT_RXDATA_CTI);( c" ^+ T' C* h2 ^) C
5 ~9 }1 f9 Y/ j$ a) M UARTIntEnable(SOC_UART_1_REGS, intFlags);' }) T& X& ~( X3 |3 J2 P2 h
}
% m9 r- u3 g3 i, c% ~9 N0 f//UART 中断服务函数
9 K. i; R8 @, I3 K P8 T3 X8 g) n. Nvoid UARTIsr(UArg arg)
3 Z4 m: Y4 }, L" V6 M, g{
- }8 c* a% J' T1 }0 L0 j! } static unsigned int length = sizeof(Send);
. R# `: I3 y! j5 }2 X static unsigned int count = 0;0 P4 |% f, A. t+ |
unsigned char rxData = 0;
8 d1 B+ o L; n) |; B$ X* W unsigned int int_id = 0;
6 s4 ~; |: ?! O // 确定中断源2 e$ d7 a, I4 M& }2 }* o* @( k+ ?
int_id = UARTIntStatus(SOC_UART_1_REGS);$ H/ t/ T8 y; T# n# Q" Y
// 清除 UART1 系统中断% U* d* W5 ^2 T# n9 i: \
IntEventClear(SYS_INT_UART1_INT);4 C+ T I4 F, q+ R/ {2 u
// 发送中断
( D* M% N9 N& [6 h7 d if(UART_INTID_TX_EMPTY == int_id)2 c2 y: E( m7 f' t# U3 b) q
{$ U; R5 e7 i: q, o
if(0 < length)
H" x/ G; A/ V! b* @3 D, Z+ d1 r+ t {
* ^. f: w9 j/ e" U9 M // 写一个字节到 THR
; X( Z% J8 G) s+ _ UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);7 R7 ^2 ~8 @+ |5 l+ E6 _# u9 W
length--;) R& W$ C7 ]7 u7 C: m( a
count++;4 v' S* e9 c1 w m* [8 S0 o
}$ r$ ]9 y. t& ?9 V. p
if(0 == length): c2 I) Y0 {0 c
{& q! ]7 E6 t& R7 E( ?) o
// 禁用发送中断( g" d$ J/ a4 p5 w' d- X! ]
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
9 }) s2 z1 {0 g% C2 _ }2 H5 O5 P; B. n! Q
}% {3 f$ v9 O4 h% u/ }
// 接收中断
0 j% `$ q$ G0 \7 ?9 M) Y if(UART_INTID_RX_DATA == int_id)
( z7 {! C# k" o3 ]# ~$ n3 }) p) ?( { {
5 D' P9 N# T9 D. o4 v rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
! C1 Q+ T5 n! E5 V+ V, v! G% i UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
0 E: M4 Y, g. R! K- Y }3 E- `5 e6 j- }7 Q
// 接收错误$ a" b, u% n- _0 W! F% F6 T$ z
if(UART_INTID_RX_LINE_STAT == int_id)
O3 w0 z" j, m, n. C- H$ x2 v {
8 ~0 T( ~7 \2 \6 o8 O8 F while(UARTRxErrorGet(SOC_UART_1_REGS))
( q9 ?0 p& [1 Z8 k" d {
, U0 I4 H8 c. ^# v8 s" p. R7 I // 从 RBR 读一个字节! t6 c6 P$ J9 M$ M; c/ M
UARTCharGetNonBlocking(SOC_UART_1_REGS);7 z2 \4 C1 U! i6 @3 `3 p
}
/ K, e; ?6 {) l5 l }" h$ n" ?5 ^- p# s+ a; J$ b
return;4 p1 A+ E) q3 @( B& o
}
* c7 R+ r, ^3 L* F) Q5 W) V5 QInt main()" ~0 l/ E/ @+ q9 n l5 M
{ 6 w$ O' a1 p5 h& M. Q6 m
UARTconfig();//uart 配置
* ~" S' p }$ M+ B1 j5 w! N Error_Block eb;+ h9 Q- _! C" f7 W
System_printf("enter main()\n");
( v* U/ d8 z6 x. p. g6 d* Q Error_init(&eb);
' J6 o- l1 W9 n( r' |3 b* Z J // 动态创建硬件中断. S5 {) k$ S$ Z) I. p) Q7 {9 Q9 s
Hwi_Handle hwi1;: g- C( H/ y( `' D* W8 K" k T6 p
Hwi_Params hwiParams;
. Z- A9 r, [4 U/ V // 使用默认值初始化参数
. k, [0 M. L( }( g) @ Hwi_Params_init(&hwiParams);
$ g3 J+ l- J6 h* T: p // 中断事件
6 O) M1 i1 l$ a, X# R hwiParams.eventId = SYS_INT_UART1_INT;
+ y$ @" R7 Z1 q0 O L8 M# T: K; B // 传递到中断服务函数的参数
* F9 x+ r; h1 t9 Y4 H' m hwiParams.arg = 0;
2 z# u8 G m" f1 [. q" M // 不允许该中断自身嵌套, v+ e7 p) U1 [1 {! b H
hwiParams.maskSetting = Hwi_MaskingOption_SELF;' v9 O% `8 l4 P7 Y, A
// 使能中断" _& j, o& j9 E* x q
hwiParams.enableInt = true;
3 j. Q! [$ U( q // 可屏蔽中断 4
0 ?# _+ i$ Y8 ~1 b // 中断服务函数 hwiMain8 n: l2 B) @( p2 v" p% l; y
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);6 |0 g0 [1 h$ ~" {! ]
if (hwi1 == NULL)
5 l1 P5 n: V1 ^9 r$ Q2 Z+ a; v System_abort("Hwi1 create failed");* q& h5 {3 N4 H) h- l% B2 t$ _9 g
BIOS_start(); /* does not return */
2 ~/ J4 V& l& Q& g. ~" O4 w return(0);& E1 K y9 `! b$ Y/ E
}; |; K v0 f$ M; K: D& i: O% w
- x' B4 L7 ~4 _# j% x$ `2 S) z1 f |
|