|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
/ z% D8 R( K; o- _* q H2 n// 发送缓存! e7 u" s2 _7 h. {" B
char Send[] = "UART1 test......\n\r";
- e4 f! @3 A$ t, R8 c) C$ c) b# G! ~: w: K7 o8 p6 t7 Q9 A5 @: s
extern void UARTconfig()
) f1 q; M$ @ f6 P{4 x: V9 j3 X* m
//使能Uart1! p$ X6 w1 k! w# _% v; z- p
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 r' W7 f( H3 t( Y. _- r& o
& u9 H u: p& i i+ w* f/ r( }3 z" O // 使能 UART1禁用流控
/ h/ I) a3 h/ f" }0 U+ n5 } UARTPinMuxSetup(1, 0);
+ V8 Z0 ~5 ~9 A& r1 Q; q |8 H' A
. Z3 T7 \; }; {* c# @& R // 波特率 115200 数据位 8 停止位 1 无校验位* L/ H+ D% {& R! z) q T4 a9 C& s3 r
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* l" ?% k+ w/ c3 z0 S* h
+ c3 ?0 I. c8 H // 使能 UART1
) k$ q+ ]: l0 s UARTEnable(SOC_UART_1_REGS);2 w, R% Z- P8 Q2 [8 J( g7 m
// 使能接收 / 发送 FIFO
4 F) E8 T4 [& Z S o. T5 @ UARTFIFOEnable(SOC_UART_1_REGS);
; r1 w$ ]3 h) F0 [: ~" ?0 O( q) g; g // 设置 FIFO 级别( z) k$ a3 y0 Y% B" k
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
% @: N B3 r" C! j //Uart1中断使能
+ B" m7 X f. \ unsigned int intFlags = 0;
" x8 ?& A) }: G# |: D intFlags |= (UART_INT_LINE_STAT | \5 Y3 `8 e. X! j
UART_INT_TX_EMPTY | \
: a- ^. j/ r; `- y UART_INT_RXDATA_CTI);
5 t, y9 I5 m4 V( R% J3 J* ]8 O' } 6 r$ X5 M4 n; ]
UARTIntEnable(SOC_UART_1_REGS, intFlags);6 R, ~- n. o) z e$ L
} P* B# K$ x" X4 j: s
//UART 中断服务函数! z! f% l, j/ E
void UARTIsr(UArg arg)
O8 r9 A5 I" c{
" C) ^5 p/ l0 K, p+ O static unsigned int length = sizeof(Send);$ F6 c$ @2 I# `. L3 C
static unsigned int count = 0;
/ E# w3 m/ ]& A$ Z, R unsigned char rxData = 0;
% P: j5 c. f+ o+ M, A* m7 @ unsigned int int_id = 0; Z4 ^* n9 ?; L9 m
// 确定中断源0 n7 l- {" z8 ^; e6 }9 l c7 z
int_id = UARTIntStatus(SOC_UART_1_REGS);: Z1 e9 z4 g. ] M {# J
// 清除 UART1 系统中断$ ~& J# T D4 b9 v
IntEventClear(SYS_INT_UART1_INT);" N5 a3 ~$ |5 N
// 发送中断
5 a$ X: o+ B# P8 X if(UART_INTID_TX_EMPTY == int_id)
' k8 n& g5 [( b {; z, l$ w& n7 K+ W
if(0 < length)
: b3 ~- j% Y2 ~5 X/ L& w {6 T; R& ^$ k& P" o
// 写一个字节到 THR1 [1 y4 y+ c3 S7 s: a( ?
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);! Q' Q9 g/ j- U* x W4 m
length--;, j' B8 @/ t" m& a
count++;
2 Q6 v1 a6 G# T* g9 N1 [ }$ q6 x& K0 s' @+ I; s8 c& x
if(0 == length)# Y, m4 A# F9 b1 s0 k. A
{
/ I/ ^. a" W& o' z // 禁用发送中断: t o. S% f& W9 t0 G6 ]
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);! T. G9 B& w& E0 z8 O6 u1 h
}. V2 a# I' A) B5 v. ^, Z
}& A& F4 J9 Y' U" u
// 接收中断
9 h! _2 S' `" v; P1 X0 p+ K: m2 E8 k if(UART_INTID_RX_DATA == int_id)
: {1 q5 [7 S# u4 ^$ V {$ C# n2 \# p2 L# j' d8 C5 g" q
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
$ @0 |; i* X% ?' J2 j- d UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);2 I9 w+ ~6 D, U) M( g1 ?
}
3 m4 q9 C! C3 a% h7 B5 l // 接收错误 q& @: `* U0 [7 v/ Y
if(UART_INTID_RX_LINE_STAT == int_id)
* n% ~6 k# H+ z- U0 s- C {: S9 H/ q$ f. c6 V) q# {6 I1 j3 b
while(UARTRxErrorGet(SOC_UART_1_REGS))
0 i4 [3 z' I1 r' t; o {
6 |( t6 }7 J @1 U6 n6 \: [' ? // 从 RBR 读一个字节
# V2 P3 {" L9 e# c) N$ x5 R9 ?4 N9 Q UARTCharGetNonBlocking(SOC_UART_1_REGS);
/ E# w* i; ]% A! z/ Y, {& x% G) H } Y7 K" d, c! B2 j$ o4 g- ]: D
}
( C: E9 j& k2 e+ C! B% f* W return;. K' H0 Z0 }- C! f5 @
}' @' \% @, }7 H- k1 }# M! J/ \
Int main()
9 t' B X% D6 r, r1 P! i+ X% G{
) I8 x; @7 V' M! y8 k, q" A UARTconfig();//uart 配置
5 A9 l- n1 K, n( n Error_Block eb;
3 k: I6 `( U J: \6 G/ K! O System_printf("enter main()\n");# y$ h. p! K& J+ y- _
Error_init(&eb);, M3 `( M4 s9 Q
// 动态创建硬件中断5 D. v, }- q5 y4 d% H% q
Hwi_Handle hwi1;7 j* r% s7 c9 X7 s8 B+ F3 |( `' Z
Hwi_Params hwiParams;. _9 O6 k( ]* Z- d1 b
// 使用默认值初始化参数) T* [6 a- W; `
Hwi_Params_init(&hwiParams);: J- ^+ T) s3 O9 A8 c5 _7 F
// 中断事件" l5 {( `( | t o$ O
hwiParams.eventId = SYS_INT_UART1_INT;. O2 h6 Y b% g
// 传递到中断服务函数的参数
& ^, C3 p8 y0 u; o$ j+ q hwiParams.arg = 0;: m1 m0 j9 P+ h
// 不允许该中断自身嵌套
e! T: i! V* w hwiParams.maskSetting = Hwi_MaskingOption_SELF;3 f& a* l8 v* q4 X
// 使能中断3 x. N) z. I, f' ~; I
hwiParams.enableInt = true;
) O4 z- p' V( |; s4 ~ // 可屏蔽中断 4
! T% b+ `( a7 `5 X# W5 h // 中断服务函数 hwiMain
- R9 _! ~1 ?% I4 ?5 n) ` hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
; D+ M7 ?0 X; P/ N9 ^4 S if (hwi1 == NULL) G, m& m" k7 H( c& F" U- w; S% R
System_abort("Hwi1 create failed");
# Q' ?$ h$ a+ `( z2 ^$ J, } BIOS_start(); /* does not return */5 u E+ \, m. a1 j8 _
return(0);
# ~0 [. k' A$ C}5 [; P8 j' h. x; ?$ r- @8 V
) ^' L; t8 Q& f# O6 D, i7 C7 Z' s0 ~ |
|