|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
# |8 r, J: ^! i: Y" i' `7 j& c// 发送缓存& k% M0 e* i/ B, X2 _$ {3 O; `: D. D
char Send[] = "UART1 test......\n\r";% d: g$ v8 M! p. \8 j* X9 B$ o
) u% [6 m- ]" b. I; O0 B8 D
extern void UARTconfig(); ~" X. l' x$ J: t- @' }
{% c- Y/ S8 M/ F- M% K q4 u, `
//使能Uart1
7 x* m( ?! }" w H/ \6 | PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( {& K! F7 l' Y% |
( E" D( K5 |1 x- s. I+ K& Q+ t* ` // 使能 UART1禁用流控
( [- s6 J* I. F UARTPinMuxSetup(1, 0);
2 w8 ^( S& Y1 p3 A3 w 5 s6 B% m5 e! I2 m* c
// 波特率 115200 数据位 8 停止位 1 无校验位- ], k0 ]6 V2 I' o5 P N! Y
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);' r0 T9 A" }1 T4 A- G8 r
( q8 b6 E% W! F1 t Q // 使能 UART1
. P0 O G# L3 {, H" W. l UARTEnable(SOC_UART_1_REGS);& r8 \. B @4 @4 s4 m, I% J
// 使能接收 / 发送 FIFO4 S; E% i& x' f
UARTFIFOEnable(SOC_UART_1_REGS);3 F' U9 } G/ z3 V9 U/ a
// 设置 FIFO 级别
' k6 `% J- H$ a$ P! y' |3 U; r! W* D% e UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
' v2 X( S) L! n3 H7 ` //Uart1中断使能
% O& q& I% L8 h; y4 Z unsigned int intFlags = 0;4 _( b7 ~8 o0 E. N# S
intFlags |= (UART_INT_LINE_STAT | \
; M+ c* |% c4 C6 F UART_INT_TX_EMPTY | \! d% N9 d4 a, v
UART_INT_RXDATA_CTI);
, X. ^" w0 B- K- H9 W+ j# ]
5 A6 i8 a! R: ~( e& g3 w) E UARTIntEnable(SOC_UART_1_REGS, intFlags);1 Z: ~% ^& M* j# R- ^9 W1 J) C# a- r
}/ |7 c+ p* F9 \1 e8 v
//UART 中断服务函数
/ I# B: l2 j# g2 o5 l* [3 A& {: @void UARTIsr(UArg arg)5 F% E4 T+ [+ x0 d
{
* C# Y0 `$ B3 h4 C$ @0 t/ ? static unsigned int length = sizeof(Send);& K' i O& B; w6 [& T. M7 a
static unsigned int count = 0;
6 e. r3 Y- l2 z# \$ @* t unsigned char rxData = 0;9 a; U" E& Q8 V2 H/ z4 |
unsigned int int_id = 0;
% ]9 `& k7 D6 i // 确定中断源
r7 k* c* _4 k, |4 @' t9 `5 _( T int_id = UARTIntStatus(SOC_UART_1_REGS);
4 N# N7 e k8 _ // 清除 UART1 系统中断
. c" k" H7 V, q& T* x8 z9 H IntEventClear(SYS_INT_UART1_INT);* @; G$ t) L3 d
// 发送中断8 d1 ^/ ~7 w1 Q9 t
if(UART_INTID_TX_EMPTY == int_id)' I0 q7 F) j7 M. k/ Q4 L. x
{
! p* k$ t+ a% t6 Y( j8 y- c. W if(0 < length)
6 R9 p! t3 H1 @7 f) R' \+ _ {
" R# @" K9 G9 e5 d7 O // 写一个字节到 THR% {% A, f2 B) f3 n
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);3 V5 j$ l- k9 g
length--;& n5 h6 [8 k1 _7 X( |( w; I
count++;
2 h/ K; E2 r+ C% ~9 l }
/ F; I; b9 H% [5 ] if(0 == length) U! a2 U% }9 H# h
{8 R+ s3 c0 U# h# R' s; _3 |
// 禁用发送中断
) d9 @# Z) n: \/ k# e. f" Q UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
* u' U7 i: E5 h- y! D; | {2 p: z5 e) C }0 k8 H3 t! f4 H4 ~! ]
}5 a0 _: g* V6 [9 ?+ w
// 接收中断+ B0 v* C% v' Q
if(UART_INTID_RX_DATA == int_id)7 I% E, M# p. g) k! F
{8 ~& ~: F( T3 x# M1 O8 f7 q
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
% _) B+ Q& @: F9 k c, ] UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData); N) ?* G! y; p L* |# Q% V
}1 ^; J5 ]/ N, [+ }% h; H& m0 q
// 接收错误$ ]+ L6 l f( {) I9 e% _( c
if(UART_INTID_RX_LINE_STAT == int_id)% v* t. S$ v6 {
{
* a- s: i3 C2 {) ]; U while(UARTRxErrorGet(SOC_UART_1_REGS))
! B3 ^) D; G0 O3 I/ \2 A) u# k O {' S7 h5 a6 l, Q. _9 ?% R
// 从 RBR 读一个字节
- T [- a) i& o' D& t( U2 T% j( n UARTCharGetNonBlocking(SOC_UART_1_REGS);& A6 W9 V/ O* b# `+ _8 L0 Q6 U- @6 Y- m3 V
}+ h5 X$ v5 j6 q6 V6 D% l6 D9 z
}
6 c% u& H5 ~# W$ y% V return;) [9 d0 D6 G4 w' S
}
: k% [4 j) | ^1 `6 w4 R# GInt main(): ?) ]$ @* ~$ w- {6 e
{
+ R2 h9 U- T# r, J+ [ UARTconfig();//uart 配置
9 t$ l0 k- k% \0 T" j Error_Block eb;/ D' ~/ S/ _3 ]: j6 F/ G0 r
System_printf("enter main()\n");+ ]6 z+ l: n% _) ]+ n7 m
Error_init(&eb);
$ c: a" F$ y$ K1 Y4 W // 动态创建硬件中断
) L( l2 c' b3 J# C; h* G1 l+ D/ i Hwi_Handle hwi1;
) {- a8 `9 g% k+ S* f2 c Hwi_Params hwiParams;. D, S l; e1 J8 c, d/ K* J4 `
// 使用默认值初始化参数
1 y: }5 S' s, E |2 M+ m* J2 G Hwi_Params_init(&hwiParams);
6 F5 p. `# e$ ]5 \$ H( H // 中断事件) f) D; Q7 E7 W7 s8 L5 |
hwiParams.eventId = SYS_INT_UART1_INT;
0 O4 Y9 K% _4 Y& j // 传递到中断服务函数的参数
9 u' p* v2 m0 q/ n. W hwiParams.arg = 0;
! w T" p8 D% B" k // 不允许该中断自身嵌套
4 R) [% D! X2 A/ _, \; L hwiParams.maskSetting = Hwi_MaskingOption_SELF;' D5 t/ J4 ]5 U0 y1 o; p) }- c" ?
// 使能中断% l! x2 a! e t2 P% @- B
hwiParams.enableInt = true;9 w( z$ l8 A# }! c
// 可屏蔽中断 48 i: S# s0 Q+ N" Y7 `. l7 W( c
// 中断服务函数 hwiMain) [9 S2 [7 q! ]. p
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
- i( e, Q) V) b& K1 u" P if (hwi1 == NULL)' a$ q# `# S! H M0 ?) f( c
System_abort("Hwi1 create failed");- H" G, T$ x6 z! h2 Y
BIOS_start(); /* does not return */9 b3 Z, z& n: B+ p+ I* ]% Y
return(0);
1 C6 W$ d& I; c}, s) d7 o) `( f4 R( B( n
: L7 N. Y# ?' |' _
|
|