|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下! Z6 n7 e. X @8 Q2 g$ Q* @
// 发送缓存
% w1 w5 G9 G9 i- Echar Send[] = "UART1 test......\n\r";
6 `" v# |4 r( [
& n/ E6 [ v+ }1 u+ n+ Kextern void UARTconfig(), N) H; V6 J7 c! w' Q5 [" m [
{
& a7 {$ E0 d3 _1 J) E4 X //使能Uart1
5 n! t6 w, f1 O% f w, b( D PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* z$ m& y& ~& X Q9 d+ W
/ u! {8 W6 ^3 j8 @9 x
// 使能 UART1禁用流控
/ M& D, n" i$ U' v) p7 S! R UARTPinMuxSetup(1, 0);% t- u0 R3 l6 H
" ~! }. S5 [" U% }3 O; d+ V+ h! p
// 波特率 115200 数据位 8 停止位 1 无校验位; f, g% d/ n7 R# _5 I7 @3 }; t# l) J
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
. u' V% t0 \) W" c 1 h1 y4 A; b& `6 |
// 使能 UART1+ C0 Q& R% }0 C
UARTEnable(SOC_UART_1_REGS);
2 u7 ]" `8 ?1 E, J& V // 使能接收 / 发送 FIFO" k0 [) c& l( [* k2 v0 r: c
UARTFIFOEnable(SOC_UART_1_REGS);
. y& ]' L. K- Y1 C$ v // 设置 FIFO 级别5 Y# Q5 ^# ]3 \/ a$ L
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
# L: L# ^/ D8 L- m/ O& E3 Y //Uart1中断使能5 Q* D8 e* N, V/ [
unsigned int intFlags = 0;
6 @. h' o* u9 b5 _ intFlags |= (UART_INT_LINE_STAT | \5 L, k, q% o6 M5 C% j! q) G% O$ I) T
UART_INT_TX_EMPTY | \& n' V1 C) ^; s; W+ y
UART_INT_RXDATA_CTI);
5 n7 H& N) @' J2 J, ` ' l/ d5 Y- P# c+ `
UARTIntEnable(SOC_UART_1_REGS, intFlags);
% s6 p, s* s4 U5 q& {}
+ ~+ X2 f- h7 {: ^$ m+ z7 y//UART 中断服务函数1 `6 o4 ~; F7 \( w' c
void UARTIsr(UArg arg)' b X' R6 Q* H g2 J
{
8 `8 F+ |4 A) p# N2 _ static unsigned int length = sizeof(Send);
0 h- ~( P2 z, J. o static unsigned int count = 0;
" B5 j4 G, Y7 U- p unsigned char rxData = 0;
\$ g3 H& i% l0 b, L" ` unsigned int int_id = 0;
, p' z3 ]. ]# k4 }4 P3 }2 u' z4 ^ // 确定中断源
1 ]/ A, W0 Q7 r2 @0 l int_id = UARTIntStatus(SOC_UART_1_REGS);1 A7 j+ S7 q+ c$ W% P( \
// 清除 UART1 系统中断2 i' b7 U7 S- `) d+ U
IntEventClear(SYS_INT_UART1_INT);
+ ~! z/ {3 ^/ C9 W. q* s# j // 发送中断+ R6 D; {$ d4 Y$ v1 C
if(UART_INTID_TX_EMPTY == int_id)
! _7 b6 V0 r: G$ y* D {
) t; A: W5 g& x if(0 < length)3 B( ^7 y6 u1 B/ E
{. s+ h! N$ P7 ^2 p4 s
// 写一个字节到 THR
7 G! P+ V& F- |7 {8 t* Z+ m UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);$ ~+ x+ t) [- x4 G
length--;
1 V4 I6 D% Y; l: B count++;& G$ q% n. u3 @, ~, P' ?
}# f: d3 S7 ^ [1 i
if(0 == length)
0 H8 U. _$ E0 U5 B {
, c+ A, [1 U( c: J! p // 禁用发送中断* u3 |8 C5 Y5 i$ L+ S
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);' L) e! d3 l. m% Z+ Z7 H0 \
}" ^. K+ U+ ^& S/ }
}
0 N7 q! f7 G" G // 接收中断9 r7 A5 T+ p9 m% N `/ Y
if(UART_INTID_RX_DATA == int_id)+ H7 h" W) h' {1 N. k
{5 x, U) t1 N# k" S' D& K8 Y
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);- S9 h7 m( m# G+ W) Q+ u2 O
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
* u2 @ D9 N5 O2 x, ` }
+ K" b+ }0 D; O( N% x/ z" H; Z: \2 H // 接收错误
1 ]! {: E- v6 f" e if(UART_INTID_RX_LINE_STAT == int_id)( w8 R5 T& i# j, v$ G
{! ]) M) y4 r! d5 u/ F: x
while(UARTRxErrorGet(SOC_UART_1_REGS))) r, t, Z. m m1 S, \
{
) i, F r' ]! B7 l0 R( a // 从 RBR 读一个字节
5 k$ f! Z; a @' \7 x% Q( W UARTCharGetNonBlocking(SOC_UART_1_REGS);/ k. j, a' H. @3 V: S
}4 E- f$ j2 \7 E# C. z9 j
}
1 k9 J9 ^9 \. R2 P, Z return;
2 [4 G! e; E" W% T6 P}& q) k8 [" |9 D7 O7 {5 e; U$ |
Int main()% F" v' t3 Q }' l5 y* s
{
) S2 W. o. ^$ y+ O) J UARTconfig();//uart 配置
7 Y- o& c9 L9 {: x+ ~; N Error_Block eb;! d) w7 M3 o% @6 Z z
System_printf("enter main()\n"); L6 X* o2 e5 N# _6 ?
Error_init(&eb);6 m I( Q: y2 t( ~
// 动态创建硬件中断2 x$ K/ }. f1 u& U( o4 ]2 Y7 H
Hwi_Handle hwi1;
9 O% a* K/ x, k4 \* t6 S Hwi_Params hwiParams;2 p- b8 I: F5 b+ \3 B
// 使用默认值初始化参数0 b* K) T7 c* w) i
Hwi_Params_init(&hwiParams);8 _9 ?- V% { B k+ e
// 中断事件
* v6 m( W# ]0 I' I hwiParams.eventId = SYS_INT_UART1_INT;, G: a! r4 o9 p* E
// 传递到中断服务函数的参数: r# F" x& \: ]- Z. q9 k
hwiParams.arg = 0;
. X& g0 l$ B" H8 B // 不允许该中断自身嵌套
, Z; ~ H% Z' D7 u% ~) h, Z, R# E hwiParams.maskSetting = Hwi_MaskingOption_SELF;5 H, n5 F& Y* A- I. n
// 使能中断
- k) z5 q6 T4 h6 m. O$ f; H hwiParams.enableInt = true;8 _' M7 o4 G5 o' W( s
// 可屏蔽中断 4
9 {6 x2 Q& N3 ]8 z // 中断服务函数 hwiMain
0 o9 X3 J- A" d) I Z* e hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
5 M- N& U, B3 k5 x if (hwi1 == NULL) {* ~( X! W% ]! o1 C. S; |
System_abort("Hwi1 create failed");) m3 E( k1 `" |9 Q: H5 V+ [3 [
BIOS_start(); /* does not return */
- v+ j0 ^( @& `. ?. n* Q return(0);
' H/ ?5 G- d. M! i}
8 S& S+ `1 t/ z3 C
0 E7 f* l# ]6 r! E, B5 Y& I |
|