|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
% }" K& c. q& y2 D6 f' J+ J// 发送缓存2 n/ ^' p3 P* q2 ~6 ~ p
char Send[] = "UART1 test......\n\r";
p9 q# }& j+ f) s# D! k: m) ?* p/ y) V8 H* m+ n* s) s" y6 v
extern void UARTconfig()5 F& m0 c8 _4 l2 ?
{
$ z/ [; h, F4 M# W/ t8 ^ //使能Uart1
1 `3 f' ?& N8 b! S7 d$ C PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 [7 [% q- Q% v# t% z. ?
$ C7 [1 W) U2 C // 使能 UART1禁用流控1 H+ W% x* ~ X/ B1 ?! b# P1 _
UARTPinMuxSetup(1, 0);) s1 ^- ^+ I9 ^( ]5 o
5 | ^8 M" u/ L4 i6 I/ d
// 波特率 115200 数据位 8 停止位 1 无校验位* n) ~# }2 _& o& {, u
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 P( c3 m; e: X, S
# ~0 b8 a$ c$ U/ {
// 使能 UART1. i. v5 ~2 x0 L
UARTEnable(SOC_UART_1_REGS);+ U( d1 B2 y6 A* V
// 使能接收 / 发送 FIFO" B% g1 W* n) M$ r S0 T6 `
UARTFIFOEnable(SOC_UART_1_REGS);/ x& D9 o8 a% W" N
// 设置 FIFO 级别
6 w/ N4 C+ k7 `5 F" C2 g- J UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
2 ]$ D, ^/ b5 l5 C9 ? //Uart1中断使能
) m# E$ Q" P$ R$ P5 j unsigned int intFlags = 0;
9 i$ W ]6 r& _5 X; d9 U intFlags |= (UART_INT_LINE_STAT | \
# r1 |* V# T5 h5 O9 V UART_INT_TX_EMPTY | \
+ k& A3 ]7 a( E3 f2 z4 w UART_INT_RXDATA_CTI);& j. a4 f6 m: r' b9 u6 K
" e# e4 O5 H4 K# X7 X0 z: |6 |
UARTIntEnable(SOC_UART_1_REGS, intFlags);
* A, c7 w, |* Q6 e$ b}
2 ]3 @: K) ?/ e, S' m& b# |. I9 s//UART 中断服务函数
- a0 \+ [% \# o V+ x3 j& I" }- h+ Pvoid UARTIsr(UArg arg)
4 r# k) v. c# [' X{5 [" W! }: r- Z4 A
static unsigned int length = sizeof(Send);5 V. \5 x# b. M5 e& {, q8 P
static unsigned int count = 0;6 o6 N: v# k. ]$ n# @/ B2 o
unsigned char rxData = 0;' o/ Z+ g/ W& {
unsigned int int_id = 0;
; F1 h( S' o. ?! l9 x# ~ t // 确定中断源
" S; c" x/ G5 Q int_id = UARTIntStatus(SOC_UART_1_REGS);
?0 G; [* U$ r, a3 ]9 f, Y // 清除 UART1 系统中断! ?. x# d& t9 j8 g7 S
IntEventClear(SYS_INT_UART1_INT);
6 o! ^2 r8 H5 N% s% L( z // 发送中断2 |+ R, E. j$ ?) E7 U; {* Z7 ?- ~
if(UART_INTID_TX_EMPTY == int_id)
) u3 p. X& w" l& Q4 q0 T; Q' a6 _ {
# q1 O4 ?. C) h) [9 i if(0 < length)9 A$ s/ I w3 o2 l
{
& q; S+ I( X& `- `5 `$ L- h // 写一个字节到 THR1 p4 N* F! U, P* ]0 C+ m
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
8 O( H' J8 k1 { length--;
6 h f+ G/ j. `5 s! K% p5 M count++;5 i- l3 A! e9 j
}
5 [4 p3 ^! h! q6 T t; e2 s8 t if(0 == length)
8 w& S, k1 T0 m$ f! ~ {
2 [- o- t7 @5 U( ~/ a // 禁用发送中断
/ T- M2 u" d! G UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
+ N6 \' j5 K! q: N$ H. y }
& s4 z" ?1 ?( M0 J* d5 `* _ }
5 ? Q5 ^' H- H. s. A8 P // 接收中断
" g, o3 a$ p( O2 E if(UART_INTID_RX_DATA == int_id)
G" y& O7 I# `9 c6 K9 T& [ {$ {% d% z! k- N# ^$ ]
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
; `# k1 O$ C2 y UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
6 c. k- t' K) T. \; V }
8 z" e5 W7 @8 @3 v // 接收错误
9 E m9 u( i6 G2 e* |$ S+ ~4 r if(UART_INTID_RX_LINE_STAT == int_id)
7 C0 I) O& b( ` {
9 f ?% A# u8 l, p- E& A% B while(UARTRxErrorGet(SOC_UART_1_REGS))! w6 H0 r( Y. d4 O
{% [1 {' f. L( r/ r
// 从 RBR 读一个字节
4 O6 b7 n9 S1 G$ U& {4 `9 n6 [ UARTCharGetNonBlocking(SOC_UART_1_REGS);
% j# O3 w, }( d }
m% o' ^1 Z4 R7 Q& V. Z ]6 n }
! U( U& m3 z b: ^* H8 D return;
8 j, d* E' ?7 U/ k}, Z1 o% n. a* \$ R3 L) Y8 ?" J
Int main()! B; V6 s; G, ^% M1 B1 z
{ ' t/ }- v( Y0 q% n' Y9 T
UARTconfig();//uart 配置 j$ |2 w$ H; @" B3 j, T
Error_Block eb;8 |9 q7 o8 k+ E1 @( |/ }7 s
System_printf("enter main()\n");
" H2 M S8 _; }( ~- M- p Error_init(&eb);
) o% U- k1 v, O' p0 j/ C // 动态创建硬件中断: y5 O- ^# L2 Y7 {
Hwi_Handle hwi1;
% x1 l7 H5 |% A! x! j Hwi_Params hwiParams;
. U; o0 ^5 ]: S* e2 E+ _/ W$ e- F // 使用默认值初始化参数
% l9 o1 J6 x$ W. ]9 }" M Hwi_Params_init(&hwiParams);
5 a, @! {3 f5 W1 U // 中断事件2 j/ n, b; q; X4 ^ Q0 L
hwiParams.eventId = SYS_INT_UART1_INT;6 e' o0 L( d2 d
// 传递到中断服务函数的参数
2 t" e" j! H! o* A hwiParams.arg = 0;
0 S% n# ] X) G8 N$ q- b // 不允许该中断自身嵌套4 k' S; L7 p) E4 h7 h
hwiParams.maskSetting = Hwi_MaskingOption_SELF;( K8 a6 R/ z3 m
// 使能中断
" {8 ^" ~9 W$ l5 X( k2 B) R- q hwiParams.enableInt = true;/ U4 U' U' _7 F
// 可屏蔽中断 4$ E" W! {2 e5 F% m
// 中断服务函数 hwiMain
. U5 j k& m* `1 \% D6 }; E3 | hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
* [* z# V+ @) e9 K$ B, @ if (hwi1 == NULL)
- d8 [9 k9 [& j( P- j) C% L( C System_abort("Hwi1 create failed");& {5 J( ~: |- f5 l* y- A7 ]8 W
BIOS_start(); /* does not return */: ~! Y8 Z- j/ M$ r- V, H
return(0);+ L# Q6 c: n; O
}; z4 l: A1 L& x8 A
* d/ F+ O: I' ]2 C U; @6 S |
|