|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
5 @* [( E: A! `# n* k// 发送缓存
6 l- U8 ~: Y9 T9 n! j) h! Rchar Send[] = "UART1 test......\n\r";
7 S) `. r2 h* @ I! F5 F9 T( p
* o5 g; i _. s# Oextern void UARTconfig()( P3 z+ y6 R$ P: Q
{1 N) R1 O4 {7 m5 m
//使能Uart1$ ~' k6 S2 r$ R
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);2 F$ M4 F, ^7 o0 @# W1 Q& o
: b" Z, v/ i1 e* u
// 使能 UART1禁用流控" E! W2 J3 D7 v" l9 O
UARTPinMuxSetup(1, 0);! [6 B7 B1 j3 P _2 J- g
0 _; c& U' T9 s* ?3 F% c // 波特率 115200 数据位 8 停止位 1 无校验位
: [- C6 M6 X% `5 B UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);4 I5 q+ b) t B& D; U- l' A
, s9 P4 y! P% C& Q! i) i
// 使能 UART1; t+ j9 R: f$ x; ^
UARTEnable(SOC_UART_1_REGS);
4 `0 l' |4 q' H. c' ]. r. W+ g // 使能接收 / 发送 FIFO
$ ?. N* `( D' ~ UARTFIFOEnable(SOC_UART_1_REGS);2 \) b: Y% P8 I% U
// 设置 FIFO 级别
% M. Y; |2 n5 I# c, ?- i UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
* m& b. j0 O" @! X$ A //Uart1中断使能
: K% f1 T/ p/ S' U unsigned int intFlags = 0;
: z6 I9 h) f4 ]6 X! m0 P intFlags |= (UART_INT_LINE_STAT | \
( E+ U& e! W/ R7 p3 i$ L UART_INT_TX_EMPTY | \
5 u# k8 N n+ z5 n [ UART_INT_RXDATA_CTI);
6 ]" M$ K; k4 ]7 e, j$ ]
& d! L ?! X8 g: J UARTIntEnable(SOC_UART_1_REGS, intFlags);
0 K( h6 A& Q$ P! Y: e}
' i0 W$ |+ ] t h# h4 [$ D+ F//UART 中断服务函数
; O# F! W, s- @% d2 s4 Q) s' dvoid UARTIsr(UArg arg)
; H L% f% j/ L$ I. K& ?& `0 |) b{8 t1 X" f0 k4 m
static unsigned int length = sizeof(Send);8 t% x9 t ^0 z3 S# c7 e( e0 g
static unsigned int count = 0;7 S# Z; z+ Z' b1 W8 W# q( @1 x
unsigned char rxData = 0;
2 U# s* L& \9 Z, g1 y; \0 F unsigned int int_id = 0;
# m4 Q/ W: p! V' W7 O // 确定中断源& S! x) m9 w8 ~9 W9 h! R& ~
int_id = UARTIntStatus(SOC_UART_1_REGS);
, ?. ?6 ~3 Q a // 清除 UART1 系统中断$ J) y- k# D9 {* X+ z5 M: g
IntEventClear(SYS_INT_UART1_INT);
& Y% d0 L- u2 G- L& o& ~# V- { // 发送中断' m6 u4 |1 k) m/ m
if(UART_INTID_TX_EMPTY == int_id)
# q# A0 Z) o0 R$ g5 w {4 }9 ^2 X. N$ R& N. a3 k$ `1 c
if(0 < length)
" B- Y, c, I$ p. r G+ }% O% @ {. h9 x* u" a1 o! @8 H# V
// 写一个字节到 THR- p4 W7 J; Z U3 @0 H
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
2 t4 m3 ^/ _8 z& u$ [& ^ length--;, }! R4 z( E3 I/ D2 ]
count++;
; c5 g( ~, W* [ }
8 s& p9 h* A+ K- O9 ] if(0 == length)
' P' z; U; C8 Y% l/ _ {4 N0 `4 k, I2 o) n4 D4 {, C8 r z
// 禁用发送中断
! @6 _, o" f. _( u- Z) H UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);8 m. b& R" X+ g: G" _7 A
}
& I5 T! M) C% r }8 `( e2 o L1 z+ }% d! A
// 接收中断% d7 k* J/ v& P0 G' ~, S
if(UART_INTID_RX_DATA == int_id)
0 t# i+ E b" E% H% i4 V9 {6 X {: n8 W5 Q! P" R$ b
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
- r. V% o1 m3 d/ s6 m" [ UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
) F. b- p5 _2 m' Z9 Y8 b2 G; z- v } T5 P, D C3 O. t$ l% A
// 接收错误
8 B4 S2 J" c+ d! S+ a3 r if(UART_INTID_RX_LINE_STAT == int_id)/ _+ W9 o \4 @% ~+ [8 p" |
{
$ M) @) c& A3 W+ Z while(UARTRxErrorGet(SOC_UART_1_REGS))& [7 F* \; `8 x n! g. p/ O, I
{' \! z" ^6 M: G1 y6 b7 N
// 从 RBR 读一个字节
1 l E, _* Y- n UARTCharGetNonBlocking(SOC_UART_1_REGS);
' f: C3 p5 V9 [! F0 w }5 E5 @4 Y) k0 l+ |
}
' J( N; S4 h# R& x- Z3 i! c8 T return;
- w/ [2 i/ H7 e}7 A* f4 c8 Q+ j6 L! _
Int main()2 ~! V3 S3 k) T
{
4 F/ Y! N0 D% P! x* r4 v; d- K UARTconfig();//uart 配置
, H8 \8 C; }7 L8 D+ p& \ Error_Block eb;5 e5 ~6 O' e- J& r6 S+ R/ r3 S% k& D
System_printf("enter main()\n");
4 ], b5 X- w( l0 j: M Error_init(&eb);8 d+ @0 O2 Z' o4 Z; G& ], W0 [
// 动态创建硬件中断
* K6 B, }. B$ X0 e) z# m Hwi_Handle hwi1; r4 g3 l' g5 Q# x+ o$ s) t1 R
Hwi_Params hwiParams;7 m$ c% s5 y0 V/ |; \
// 使用默认值初始化参数
$ q" i: ]2 [% [2 U Hwi_Params_init(&hwiParams);
; d. i0 e+ @- {- r // 中断事件6 f) `+ o3 J U6 K+ ~8 e$ G o* V
hwiParams.eventId = SYS_INT_UART1_INT;8 m9 o4 [2 j/ O, G0 I( w
// 传递到中断服务函数的参数
( Y& D, `) x. u6 P hwiParams.arg = 0;7 v( g E% ~) ~+ o8 B$ d$ k& A) Y
// 不允许该中断自身嵌套
- q# n4 j% T2 t9 ^4 O+ n( U7 _ ^ hwiParams.maskSetting = Hwi_MaskingOption_SELF;2 O8 Q* `8 l- t$ B: J( {
// 使能中断, Y1 P. v7 i9 p0 Z3 I! `* @
hwiParams.enableInt = true;
7 p: s# }. p8 [6 t: v3 g# k3 l // 可屏蔽中断 4
# {6 Y7 e0 T7 e4 T4 k' p- n% y // 中断服务函数 hwiMain, X; L L) c2 w7 a/ x0 S& Z
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);& g' y/ x! F# h2 C4 Y* ?+ g' [8 r/ ?
if (hwi1 == NULL)* v8 Z' A3 }2 i! A, A0 H+ l7 ~6 l
System_abort("Hwi1 create failed");
! F$ i# Y; {) M6 `9 l# H BIOS_start(); /* does not return */
8 ^, k; n* m2 r5 ~8 E return(0);
* y0 Y' `: T' A+ Q- x% P' B" w5 U2 H}
; v. J3 x; G- ~, s3 s3 V2 P2 P) n9 @3 R4 J- f
|
|