|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
/ Z! e4 T: O5 q: E6 Y9 i e b// 发送缓存
( O1 }! s0 a- B5 F$ ?6 _9 Q9 Bchar Send[] = "UART1 test......\n\r";
! ?. ]( f8 h) s: X& H0 y3 r' A2 C# ^/ r* l( V9 U$ V
extern void UARTconfig()
( ^$ R8 ~3 s9 V/ C{
# P p9 K% b3 h+ E% d9 R- e/ d //使能Uart1
) d- X; K9 J3 c4 G PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);2 [5 h! Y( B z+ K
1 g2 c. B7 y- l9 [* S // 使能 UART1禁用流控) O& K& P, e; G
UARTPinMuxSetup(1, 0);
% m* |& `" {6 U
: L3 C7 \3 E7 W7 v; K+ o, E5 c // 波特率 115200 数据位 8 停止位 1 无校验位/ g+ z9 R+ Q v5 U4 H% }
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);9 J9 W1 t4 Z* `( q, Y
" B" B( y' O, v- g9 U8 o4 g' o // 使能 UART1
9 S: w5 Q; g7 X UARTEnable(SOC_UART_1_REGS);
- g$ I/ r" v- ? e2 q$ m // 使能接收 / 发送 FIFO$ K# t/ H; U& e" w/ W* C
UARTFIFOEnable(SOC_UART_1_REGS);7 _6 J; I. `/ X2 X9 ]: ?6 W$ N, u
// 设置 FIFO 级别
5 z. W& D5 ]; y! b( R! H UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);( k8 Z- ?' R6 C0 i) v
//Uart1中断使能; d3 q6 J2 D4 E8 m: ]
unsigned int intFlags = 0;0 p* N I0 |, h; [% V6 [2 g
intFlags |= (UART_INT_LINE_STAT | \3 z! @/ B* K( [& h& w: f
UART_INT_TX_EMPTY | \* J2 \- H. T8 Q0 f& X: ^7 Q) v0 d
UART_INT_RXDATA_CTI);# @8 B7 j! G- b
' ? m& y9 j3 m UARTIntEnable(SOC_UART_1_REGS, intFlags);
3 l5 l% ~* O8 U4 J! Q+ h3 B6 |}3 v) Y+ v e7 Y# p3 l( _
//UART 中断服务函数4 h! c2 g7 H6 k* M" \" w+ s2 g
void UARTIsr(UArg arg)
8 O4 q; L6 [- H4 d: Y5 `0 ]# r) i{. t6 [6 H) B2 C' @- I- o) l. ^7 q
static unsigned int length = sizeof(Send);
/ M3 t$ Q p5 U( H8 \ static unsigned int count = 0;
9 A& L' T3 f9 f unsigned char rxData = 0;( ?5 n, Z% F! j/ P! {, l' h6 [
unsigned int int_id = 0;
+ f' b& a) N, N* `! R // 确定中断源
( C4 e7 v# k+ y. N/ |9 e int_id = UARTIntStatus(SOC_UART_1_REGS);
; u+ j: P( P; V/ M" t S- M0 H // 清除 UART1 系统中断0 c+ @' B, G! ?7 n
IntEventClear(SYS_INT_UART1_INT);
8 J! [1 C- z: v. q // 发送中断
7 M5 V& D* G, p/ m4 O# W1 X if(UART_INTID_TX_EMPTY == int_id)
* d; `6 ]$ F5 ^3 r" B {
9 v: w v* }/ T$ F- H! ~ if(0 < length)7 r' W5 \: i5 _8 O2 Y6 L
{+ [* V& p7 `0 j+ G
// 写一个字节到 THR- ~( g$ O7 f- x. I8 v
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
- |6 ~4 H+ q: S) F% L length--;: }5 H" }; m& }; N% M
count++;1 E% N: `% w( Y( U
}, `/ ~: [8 [/ u9 D4 W& }2 Q
if(0 == length)! @, X5 w, s& E9 Z' v
{
# |6 o8 z' H/ W* p // 禁用发送中断
( ^+ W, k3 ]6 i, K ?6 q UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
, _; |( Q, k# E- k! H }2 \: s6 x: w* O* `; r7 B0 Y
}
* X, b0 @# r# ^ // 接收中断
( M! h2 Q) V8 j+ R T/ D" c6 S( V if(UART_INTID_RX_DATA == int_id)" k3 I' m3 |/ k, _2 }
{" X0 ~: G w5 V
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
9 ^# ?: n! W. l# e UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);* o; S! R G' D
}5 Y6 x+ E. M- ~) C; s9 u
// 接收错误" I ~/ L! f5 U" I
if(UART_INTID_RX_LINE_STAT == int_id)/ Z* g0 |( {0 o) z
{* p& T @6 x+ D2 y1 w, X* i" b
while(UARTRxErrorGet(SOC_UART_1_REGS))) B- K# Z" |+ j6 u% k! S
{
( ^' Q. t7 `: `! o# r // 从 RBR 读一个字节
" f j8 r3 k. K9 Q& S$ [" O2 | UARTCharGetNonBlocking(SOC_UART_1_REGS);) e2 X' w# U7 L8 r* }1 p) h8 W
}1 o" l! s( k8 `: F- L0 a) m
}9 y! v. d' ]4 u) D4 Q( k
return;
# c# i! _2 m0 ]% [( p}# {/ {* G8 t2 l w
Int main()
5 q' T: v; D( K1 h{ e4 F& s5 z; O' a. C& f
UARTconfig();//uart 配置
$ K7 e+ l2 _8 Q% w6 l6 a/ C; ]* E Error_Block eb;
! z9 y' m7 E, T- S6 w; r System_printf("enter main()\n");
: l/ U3 ^3 Y& B/ d3 ?" g5 f Error_init(&eb);
7 \* @% H) ?2 }8 n( \% k0 l9 _ // 动态创建硬件中断
; n9 \! e+ U& ?) h$ u# `( F Hwi_Handle hwi1;0 Q; p1 A6 P2 h- a* v- F
Hwi_Params hwiParams;3 W- }6 I0 ~- C. ^% Q7 `3 z$ Z
// 使用默认值初始化参数
. `+ L) y/ r( q; i" }9 T9 h Hwi_Params_init(&hwiParams);
6 b! d- M: w2 W0 z- p4 `& f4 J/ J // 中断事件! X+ D6 M. w6 d! _ A- K
hwiParams.eventId = SYS_INT_UART1_INT;
9 s) g* I4 E8 y( z4 Q* Y // 传递到中断服务函数的参数
% B+ l a0 W7 X. n# ^% g( Z hwiParams.arg = 0;
* e( B: V+ t* p8 v5 v1 y* S // 不允许该中断自身嵌套
, h5 L$ q5 A8 U, J2 c3 h3 o hwiParams.maskSetting = Hwi_MaskingOption_SELF;
2 J$ n0 W! f6 B0 k3 g // 使能中断
8 |# H' y5 ~: x& s4 T; \- a% o, B hwiParams.enableInt = true;! y" K1 q9 h* f6 w" P
// 可屏蔽中断 44 G& I6 y7 z" z( H$ e
// 中断服务函数 hwiMain7 h4 e! I7 \; C: y4 z! Y/ k
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);, ]7 B- ]: d* d# C0 G
if (hwi1 == NULL)
5 f0 Y' B; X- s1 u1 K2 N5 T System_abort("Hwi1 create failed");
8 B9 i+ p4 h* I) D) P6 ^ BIOS_start(); /* does not return */
5 W: v- J: k* D$ t- d return(0);
, H) U7 X4 S \1 A/ I2 c7 E}
! C- e! d% x3 r# U7 P) I2 [/ c* o3 C3 \: J+ \$ I2 W
|
|