|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
3 t/ v9 T4 J" N* R z// 发送缓存4 H' a7 z: S7 q: F' V% Q
char Send[] = "UART1 test......\n\r";
( M# e+ {3 u6 q& Q% ]& d0 G) n; n, ^( h p. b! e
extern void UARTconfig()1 l- }, `) c% ]0 ^) ~! `
{4 e0 S4 L. y1 l" _! J3 R# r
//使能Uart1
c9 X& X6 |. m& z' T% { PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ w' M/ n' y1 Y$ h$ [" l
+ i D. K. t" j0 A1 T& O
// 使能 UART1禁用流控
) e7 w |1 D' x g UARTPinMuxSetup(1, 0);* u' Z7 `/ f1 c( G- Y5 s: B
2 d d; j( K& u% t T! J
// 波特率 115200 数据位 8 停止位 1 无校验位
/ q) Y/ w7 W: b! D G" h UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: X$ _/ A1 ?7 ]/ Z# V
$ _( q3 B% {2 l% T1 ^* d, r& i4 g" w // 使能 UART1# V: } B: W5 C, i6 a8 T
UARTEnable(SOC_UART_1_REGS);
- s5 E) N$ f2 C' D8 _' T @ // 使能接收 / 发送 FIFO
* |5 [4 t8 ]0 L# C UARTFIFOEnable(SOC_UART_1_REGS);
1 h* Q+ \- N+ O- t# ^ // 设置 FIFO 级别! b, e6 R% F' C$ U
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
! q; `. U$ s8 p0 L //Uart1中断使能
( ?) [& n5 D& X' R6 P& r unsigned int intFlags = 0;
2 [+ d. i; k+ ] J intFlags |= (UART_INT_LINE_STAT | \" P! _* |' c5 \- Q# Y0 \: M
UART_INT_TX_EMPTY | \+ m3 r1 q! G! I1 P8 n7 @8 N
UART_INT_RXDATA_CTI);: ], @8 k4 M) H4 \
" W# d' k$ n9 i8 U' h" d
UARTIntEnable(SOC_UART_1_REGS, intFlags);1 x* Q7 z$ W6 X/ D8 [
}
; {* _/ U0 d1 u//UART 中断服务函数 D+ s0 C0 j! a: A
void UARTIsr(UArg arg)
0 H; D9 {( `& B/ H& [ `2 K2 V{) m+ n7 D, }8 i% V1 s6 ?
static unsigned int length = sizeof(Send);; D( b0 ^, b+ y# [7 I' k2 x, Z
static unsigned int count = 0;7 B- K, J# n: ^
unsigned char rxData = 0;
Z& ?4 c! D3 W/ w g unsigned int int_id = 0;
% L- \. \: ?) g; \ // 确定中断源
- a. @9 G* E( f5 y( Q int_id = UARTIntStatus(SOC_UART_1_REGS);7 Q+ Q% x! G- M! ?; d. ^6 a) ^
// 清除 UART1 系统中断0 j5 `8 i- E9 Y4 j! B
IntEventClear(SYS_INT_UART1_INT);& b' L" n4 N$ T" ^/ x6 Y6 s0 T
// 发送中断: s4 [: m0 i# N! C) E: x' N
if(UART_INTID_TX_EMPTY == int_id)& N8 n1 K4 P- D" Q3 R6 C/ t
{
' e& A0 Z3 w( ] C* Z if(0 < length)6 b# t7 |! f5 p# C: L5 P
{4 r' O7 J3 r5 r' a3 G% Q" B: Q
// 写一个字节到 THR
% I$ P: {7 a% D( I3 d* v* M) s UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
2 K3 V8 y# w5 x6 |* W length--;
* R: ]" z% @: S3 t- v) Q( u' {. A' l count++;
0 D0 z; h8 l5 m! V- h- c/ A& z }* H4 X: l+ a' i" Q1 Z
if(0 == length)8 h0 y7 ~( ?6 w7 x: k0 T1 I$ A- l
{+ p: `2 q% C9 J. p# l
// 禁用发送中断
$ }5 T) [8 ~2 g. V- p7 I# x UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);% M9 {* ^6 R0 h" u) j: ]1 F7 y( H
}
; s. r+ S; y; e g }
9 E! w+ q: B" b2 K% i0 T& l // 接收中断$ \' Z' j: K# a2 Z/ J6 H
if(UART_INTID_RX_DATA == int_id)
. M- c. D2 v! _+ T, I {
7 \$ N) w' Z+ v! L6 ]1 }; V rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);/ F" d: [* i# c$ `, i) B/ b5 n
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);2 L0 G( B B! K" k6 P4 }" P0 z& F
}2 Y, V* K8 h$ O
// 接收错误% x4 B9 x3 Q0 J2 x5 V
if(UART_INTID_RX_LINE_STAT == int_id): g, L( R8 V. s" e7 ^! a6 j+ l7 N8 C
{
% E: t5 x5 D* _$ B! L while(UARTRxErrorGet(SOC_UART_1_REGS))7 T) f3 Y# M9 J* ?$ [
{8 d; i$ x& V( G n
// 从 RBR 读一个字节
- f D2 h: }- v1 ~ UARTCharGetNonBlocking(SOC_UART_1_REGS);5 U* l1 ?% U! e; h1 S& g
}
9 U9 A$ l" C. E. T% A) x2 Y8 F% n }) E9 F' h% I+ q% y1 O& X
return;3 I8 a* P% k2 c- Y* z* F- @, [
}
, ]$ ^- p! r# \& G5 }2 q4 uInt main()
+ s; c* _1 u! Y2 p{
- I) |' K# o* ?! S; G' k UARTconfig();//uart 配置
5 n& y5 a/ w) a8 l M# T) Q9 o Error_Block eb;1 D( d! i4 {- y: j( r5 n
System_printf("enter main()\n");
& C1 x9 |" M6 q e8 K, p, Z Error_init(&eb);1 T [' u$ D2 l$ e0 J3 G4 G
// 动态创建硬件中断
, I& k* U8 w& i* C Hwi_Handle hwi1;5 R; S4 W; Y& x# |" e3 K) |7 M% x; E
Hwi_Params hwiParams;
2 V. L, u* }# M Z$ D // 使用默认值初始化参数# f, H+ E+ F9 \; N- {
Hwi_Params_init(&hwiParams);
) j% U& E3 t* g K- D/ g2 J // 中断事件
2 w% n4 N j4 K1 r+ {9 y hwiParams.eventId = SYS_INT_UART1_INT;. ^: F1 r' U9 a
// 传递到中断服务函数的参数 ]& d& O. P3 e8 b! [9 j! H2 K% I
hwiParams.arg = 0;0 q }2 M2 P/ ^* E% F
// 不允许该中断自身嵌套' Q; h I& ~4 T6 y
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
3 {* t% F! q* \* z( Z* y // 使能中断
3 r" H( m1 G1 f! @5 u$ `! O hwiParams.enableInt = true;7 @6 Q3 W, ~, f* {! g3 X& B5 g' P8 `
// 可屏蔽中断 4: _8 ?- P( e* ^/ A
// 中断服务函数 hwiMain, E& T$ I5 B- t6 q. ?
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);. [- r1 F& d9 m' W9 t
if (hwi1 == NULL)
% I0 U- x8 I6 T x+ ?% T System_abort("Hwi1 create failed");. ?3 |$ s% K3 ]$ O* D4 Y8 \0 S
BIOS_start(); /* does not return */! z" h" o0 z9 J) B
return(0);
9 O* q- y4 I* w1 B6 ?0 E V- A: F}
/ I0 I1 ~ p# e# c2 D9 E, d) _ [1 c3 U! x: c
|
|