|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下- M, `9 c; P. X! W7 v( ]
// 发送缓存
% P4 O# a; m. d; T4 E* Dchar Send[] = "UART1 test......\n\r";( s7 X$ q( q0 T3 K" ^+ U
, Q8 \5 G( d: e# Q: qextern void UARTconfig()* v% g; U/ ~/ U0 l# T! ~5 N
{
- O& @5 i' `6 L% K //使能Uart1
: n; S" Z! }8 w" a9 S PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' l7 E. q0 [0 D, i! e" a7 B5 l; u 9 w5 i9 Q# ^& }9 o% f* v- X$ s( ?
// 使能 UART1禁用流控
" y% r; X7 m S! @ UARTPinMuxSetup(1, 0);" I' m8 n2 z+ {0 ^5 m8 M
4 |! q7 | y5 e, _& ]& O: p0 l7 ~
// 波特率 115200 数据位 8 停止位 1 无校验位
2 o* S. V' c2 i2 r UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
& D" u+ T1 w3 d, R, \
4 |1 \4 Y/ D# q- `8 x1 _# S, n1 [' U // 使能 UART1
! C( {- H8 \$ K/ Q UARTEnable(SOC_UART_1_REGS);
) ^4 f5 G* j/ `/ O. `( ]& v // 使能接收 / 发送 FIFO
8 m4 q* Y7 Q# D& e UARTFIFOEnable(SOC_UART_1_REGS);
% `8 C& e- ^' ] // 设置 FIFO 级别6 `3 ^1 B0 r/ M. s! `# ^! {# I7 |
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
$ j5 P+ P% a- n( [) j6 ` //Uart1中断使能' E! S- _, Y i" Z8 p& Y9 k
unsigned int intFlags = 0;
0 l$ I# ?8 Q; m" I/ ` intFlags |= (UART_INT_LINE_STAT | \* Q0 c% ]8 x* H# p
UART_INT_TX_EMPTY | \
' V a$ b2 P& g; _' c `1 `7 D UART_INT_RXDATA_CTI);
! j/ _ q) W( I, @9 b9 { - z3 ?* A$ s' c3 W6 q7 z; I& Z
UARTIntEnable(SOC_UART_1_REGS, intFlags);
8 p6 C6 {" P. N: Q/ z}
0 A1 z( L- f5 H( { H+ ]" |//UART 中断服务函数
" i* r5 o% {$ n' G8 s2 Dvoid UARTIsr(UArg arg)
2 ^$ C1 n8 \% R* P! y4 ]: Q+ G{
2 |9 i; U& M/ q' c" | static unsigned int length = sizeof(Send);2 ?- L9 g( b Y7 a$ B0 b9 ~
static unsigned int count = 0;9 }0 ^% T" M2 P. m2 r' D
unsigned char rxData = 0;
, i. m6 i/ s5 b; ^0 @ unsigned int int_id = 0;
. Z+ A0 |9 O5 s // 确定中断源7 m, T. S& |( J6 _5 J
int_id = UARTIntStatus(SOC_UART_1_REGS);4 T8 I7 @) o- D3 M0 g- L5 X% b2 ]- F
// 清除 UART1 系统中断2 T1 c+ y( p5 L0 n
IntEventClear(SYS_INT_UART1_INT);
: A$ H+ s0 W7 ?) |2 ` // 发送中断
$ [( E H) _0 l6 K, v& _$ C if(UART_INTID_TX_EMPTY == int_id)% L" p$ r% D9 Y
{* Y0 ^. E; t6 C% P3 W' h
if(0 < length)
) c( \# n( \+ f+ ?% a: E$ P {
7 c; F! w/ |, c // 写一个字节到 THR
3 U4 f3 N" Q" o% W$ V& B! |# M UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
4 c3 G5 y7 P2 h4 a; u) w length--;" f8 _* v/ [& S" U5 L! Y# v
count++;: f! C( _( a# |1 ~! p. g2 q0 y
}/ G, n$ C, G/ _0 |
if(0 == length)
) N" M. g; ~" W; h4 q P {8 ~0 N) H, _" O: h1 Z# @
// 禁用发送中断
; Y% \& S0 B [# k( S: g UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);" H" k" s5 _4 @' y
}; c+ m3 B6 G2 m% ]) E
}
2 P3 s7 c. U# B$ S+ V, \ // 接收中断
K. G+ } _2 ~6 o% y if(UART_INTID_RX_DATA == int_id)
7 T( Z" l6 ]# g9 `1 a" k {
% c$ n# k( j- V8 }! O) e3 A rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
; L+ s7 Z/ Y- m; { UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);7 N& t3 X/ G e& @
}: ~. y( |0 D% L; P$ D# d
// 接收错误
0 U# P* D7 W: [" J' w! T8 F if(UART_INTID_RX_LINE_STAT == int_id). c! \ o& F3 y9 n; K/ i
{2 L+ S; S1 \, j# X( e7 V' M% C( e
while(UARTRxErrorGet(SOC_UART_1_REGS))1 C$ I& ?, U" f, J4 }+ j
{/ |6 F( q( R# f) @2 `
// 从 RBR 读一个字节
+ p# d) V# i2 R5 c8 \# o; A6 j1 b UARTCharGetNonBlocking(SOC_UART_1_REGS);
: R1 ^& Q2 n; b }* N+ m( v8 U' Q
}
! l9 `- o Q) a, K return;; }/ |% I0 O( R
}1 a3 }* w; @1 Z7 v
Int main()
5 W3 v' S0 K: f+ `+ F* D0 Z" {{ ! C# K- f' n* u; p
UARTconfig();//uart 配置 E5 i8 e7 h) K: v ?2 \
Error_Block eb;, ~' W! i; U% b
System_printf("enter main()\n");
) w8 v2 P2 }0 w2 e1 _ Error_init(&eb);; }: y: ~5 D8 u# Q5 h
// 动态创建硬件中断
' {/ \4 y9 v6 F7 @* m: Y4 e Hwi_Handle hwi1;" n0 A* R/ {8 g# c' q
Hwi_Params hwiParams;
8 a% f0 n- {6 X# G // 使用默认值初始化参数0 s' \ w \. C
Hwi_Params_init(&hwiParams);7 e/ V: G( @& }0 Q/ }5 r; U' Y2 A
// 中断事件
9 c$ `4 I0 }% a) }2 P# ^: s0 ]2 _- u hwiParams.eventId = SYS_INT_UART1_INT;
* Z& G3 Q' ]& O // 传递到中断服务函数的参数
: C9 f z! q& A hwiParams.arg = 0;& @9 V4 _- B$ k. k( Z6 W3 ]
// 不允许该中断自身嵌套% M1 C; M+ C5 d9 M% B0 j
hwiParams.maskSetting = Hwi_MaskingOption_SELF;0 M" i2 {$ K4 w. l6 n3 t
// 使能中断
6 x: s4 \: b7 M6 C' r' l6 F! R( k hwiParams.enableInt = true;
1 l) I5 S4 z' ]! N( R // 可屏蔽中断 4
4 p9 b# k8 v$ e' U/ o' n // 中断服务函数 hwiMain
3 I0 p, E/ N/ g9 V t hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);( z% V0 y: I: F/ I3 m
if (hwi1 == NULL)& V/ }4 \! j* |( t
System_abort("Hwi1 create failed");( s6 v' u5 J: ^3 }' W/ j# T1 r5 w
BIOS_start(); /* does not return */
! T$ B3 l" N6 _: w- J, K return(0);. |( S: }, N' _5 `- n/ d; D! i: S
}
- q' U% ^9 ?3 U9 N7 |' `5 K# e9 [( O* w
|
|