|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
( x! x5 g# D* h8 i' t# Z// 发送缓存% V, w5 H) n9 S4 l$ G X
char Send[] = "UART1 test......\n\r";6 _# q; Q, e; x v0 E
: k+ [* w3 Y. u! L+ t6 h6 S
extern void UARTconfig()( T I3 ]4 K, w* c' {1 u2 Q
{, a! u* C, K% f5 X% t; B8 g, m
//使能Uart1% ~; v7 {# o" S8 X7 x; n: N
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);3 P1 f2 @( w. f% a
6 B; j8 M$ {! F/ L; ?' D: a1 W, ^ // 使能 UART1禁用流控
" X$ |4 J5 i' O7 I. Z UARTPinMuxSetup(1, 0);
1 v! X0 }5 w, q0 a% E
( \: e$ q7 }3 Y7 r5 b* [ // 波特率 115200 数据位 8 停止位 1 无校验位: `( l+ p, P# M
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);3 q4 R* _) r1 D3 ?9 E9 d; C. D9 t
/ m/ Z; {0 p1 `/ n z" W
// 使能 UART1
) A% L4 O6 |) S, u. U' Q UARTEnable(SOC_UART_1_REGS);' g4 m- r0 s; e W
// 使能接收 / 发送 FIFO
2 H, ]! u& [ q, s* ~$ {7 B UARTFIFOEnable(SOC_UART_1_REGS);5 K7 y$ g) [. G' r6 X1 T
// 设置 FIFO 级别2 D6 L! ]# z2 n
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
& L: P1 w6 `; r //Uart1中断使能* o/ \% m$ ~& G0 c1 Z+ H
unsigned int intFlags = 0;
9 W0 X( T' ?" D. {. t intFlags |= (UART_INT_LINE_STAT | \8 ]) B7 o$ z. H M
UART_INT_TX_EMPTY | \
; e1 e, `8 j: Q6 G% v; c! c UART_INT_RXDATA_CTI);- d7 d; a3 o* `9 [5 K) M6 }. T
# d; h2 T8 B2 r* b5 c, h% _ O+ ~ UARTIntEnable(SOC_UART_1_REGS, intFlags);
4 g6 q) x" p5 p! n: F/ r}
. c& k8 S' i) ?8 E7 F//UART 中断服务函数& }9 y: r* Y* j& k& {1 U- s/ ~* Y
void UARTIsr(UArg arg)9 [8 q/ A+ {4 d2 g& J. C
{
! g( V' D1 G# ~" s( F7 w static unsigned int length = sizeof(Send);( Q; G' D! `1 X$ E9 p
static unsigned int count = 0;/ e% U% V r$ L3 Y6 G# z
unsigned char rxData = 0;
0 v! m5 L$ _6 i6 a4 B unsigned int int_id = 0;9 k( ]( M4 {7 o7 }2 O1 P4 O: `
// 确定中断源$ c) U$ s" r* K& ]; B' u# F
int_id = UARTIntStatus(SOC_UART_1_REGS);# u1 [& \' _, U& R
// 清除 UART1 系统中断" N0 I. S4 ]2 @+ h/ A- I: u7 F
IntEventClear(SYS_INT_UART1_INT);4 O, s2 g% I; A) |
// 发送中断9 }2 p% J) _+ _" c% n
if(UART_INTID_TX_EMPTY == int_id)
) {* F; Q; N5 }5 b) z+ E8 Z" b {
Y1 }2 w. m J4 Q/ H9 B4 w* ~ if(0 < length)
0 R" A/ q9 B: O. \" F {
/ i+ V* Y. R. u! A // 写一个字节到 THR
8 P) L, l2 U1 u& X6 ? UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);) a9 U O3 w2 o/ @, Z
length--;) m+ ~( X( W1 N- d2 p W
count++;
# h: X V# S% e- e: b0 D1 p9 Z) B }
" z. l% L# f* Z, U0 q if(0 == length)' e% j& F; N/ r" D; \" g8 V
{
+ _. j& S3 b+ ~; z // 禁用发送中断
# | X4 L1 {% H" I# N, C UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);% J; X: q7 g, F& N' ^( b
}
; G I/ \# S8 k1 q$ {/ A$ E: a }
& c- o$ Q3 V/ O1 [ // 接收中断
8 s3 r }0 [/ P) G if(UART_INTID_RX_DATA == int_id)
* i" U2 V# y0 Z# g" W8 N9 c {7 G& C1 y/ Z c( [* W V7 A6 a. X+ t
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);: N; _: V% {/ |2 l( L
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
8 u! T0 E+ O, j' W" a }
. p6 \2 _% J2 J# M* G W // 接收错误7 I- G0 o2 w; o4 \" j& [" h
if(UART_INTID_RX_LINE_STAT == int_id). A: f3 @) R) @4 d! m# e* P1 b3 X. ]7 }
{
% _7 P! T$ L {: ]# I while(UARTRxErrorGet(SOC_UART_1_REGS))) q5 Q0 t6 f, K E, T
{. Y8 c" @$ p7 X# l2 y1 q& [$ y/ S
// 从 RBR 读一个字节1 b! l: P: j/ Y3 M: v2 _
UARTCharGetNonBlocking(SOC_UART_1_REGS);0 L$ b! ^+ E) _& ]0 K) Z* W
}
, x( D6 ` ?' t7 h3 \' x0 d } P$ s4 V4 X& u M0 R
return;
# x3 [- f( Q0 E S}
+ \0 z& d# |) B dInt main()
; l2 k1 e" Q- [" f& `# }, b9 l{ ' T+ P$ ]; I1 L& ^
UARTconfig();//uart 配置
2 Q* M) Z' d# S4 F4 N+ E z Error_Block eb;
T) r& d! f2 S4 ] System_printf("enter main()\n");
. E+ P+ M5 @2 B* t Error_init(&eb);8 s# \5 J% V6 O3 i
// 动态创建硬件中断; }; r5 [& J) _# q
Hwi_Handle hwi1;" C b4 ?! k+ _; m$ b( R/ y; |
Hwi_Params hwiParams;
! G }! I# d: v0 p, G0 h/ v // 使用默认值初始化参数
& e6 j/ \8 j" x# s3 s# p Hwi_Params_init(&hwiParams);
7 ]8 H8 B8 b# _6 o // 中断事件
" b0 k6 _/ ?/ P" D v( L: `5 ` hwiParams.eventId = SYS_INT_UART1_INT;
! ?+ j& u7 v5 w // 传递到中断服务函数的参数; O8 b+ v( Q+ C; ?
hwiParams.arg = 0;
' F- i0 G. J$ \0 } // 不允许该中断自身嵌套
7 j- v) D* V8 r% v1 g2 x; c hwiParams.maskSetting = Hwi_MaskingOption_SELF;% H( e9 C' l6 g/ v4 @# f* E
// 使能中断5 s2 d8 k- f4 ]' Y$ n# z! h
hwiParams.enableInt = true;
: Q. M8 y" i( d4 ?, a5 @ // 可屏蔽中断 49 s# k7 |1 h6 d" d* Z: C/ n: Y* [
// 中断服务函数 hwiMain, x3 k" J! f0 h* w. l3 L, ]3 }4 M
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);2 W; c0 p% U& i3 W; r& }. E; w
if (hwi1 == NULL)
0 \ [3 O6 ]; B3 ?5 ?0 ] System_abort("Hwi1 create failed");% H3 k' Y" e' s9 t1 @) L
BIOS_start(); /* does not return */
% n/ y% j4 B- O+ Z) I$ _ return(0);+ |8 {9 `# A6 l( u, {# I) B1 p
}
7 J8 R# s9 I( u5 P4 v
( Z! \& [2 n9 @) ~! j J% Z |
|