|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
: d/ N1 y* F4 U* J" o3 h3 ^// 发送缓存; r2 I4 S- U+ ]7 ]" r7 q
char Send[] = "UART1 test......\n\r";
3 m; p5 x, i! F
+ i, N, k( ~1 cextern void UARTconfig()7 @ @2 l" W$ n" h
{
. S! O$ d) O) g0 | //使能Uart1: Q: K% M- k2 y6 }" ^7 C
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 {; j: A0 K5 n( H4 N L. B7 j 2 P9 X' ^5 E: P7 k6 |/ i3 V
// 使能 UART1禁用流控
' ?5 `* F% I0 j# s* E- O UARTPinMuxSetup(1, 0);
4 r4 z' A( x Y
% R% L" ~0 [% Q$ w // 波特率 115200 数据位 8 停止位 1 无校验位& |5 P/ B5 x* \# `
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);/ _ b' E. R1 d# Q4 h! \+ G
% c. \1 O/ F6 t7 o$ }8 v0 ^0 @ // 使能 UART1
" f& ?+ H5 v! T v+ Q UARTEnable(SOC_UART_1_REGS);4 ?- [1 v6 a% g
// 使能接收 / 发送 FIFO
/ w1 d4 z1 |9 ^" a. ^ UARTFIFOEnable(SOC_UART_1_REGS);
- k3 U+ ^! t( `) a5 Z5 J // 设置 FIFO 级别' u1 k) }! `0 I
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);) f. ?+ H' e3 _
//Uart1中断使能( v! G5 V* E$ ^
unsigned int intFlags = 0;% M! W; o: z$ {$ S# |/ K
intFlags |= (UART_INT_LINE_STAT | \' o' Q3 U1 H- I @) _+ r; k
UART_INT_TX_EMPTY | \! u9 C' U$ ]" @; D$ ]* e' h
UART_INT_RXDATA_CTI);
) u: o6 O2 b" _' c: S + F' Q; h* G# q+ E
UARTIntEnable(SOC_UART_1_REGS, intFlags);9 D8 b( L7 @7 d# t' p+ p
}
9 k; q3 q7 q( b//UART 中断服务函数
1 r" i1 V3 M* l M. v3 xvoid UARTIsr(UArg arg)
k7 M/ R8 _* Q+ {{
" k6 V* x d9 ]9 G( Y static unsigned int length = sizeof(Send);
# C; e0 G' D6 D9 m8 _ static unsigned int count = 0;8 M2 s# e0 Z( n* v
unsigned char rxData = 0;. r+ d6 p3 ]( ]1 F( N; ?* |
unsigned int int_id = 0;, K2 E3 X2 P. M! T5 {( O: m
// 确定中断源" c1 R) g" @$ ?/ g% {1 m4 c
int_id = UARTIntStatus(SOC_UART_1_REGS);) }( g! \% V. l
// 清除 UART1 系统中断8 u* Z' O- n$ i" d
IntEventClear(SYS_INT_UART1_INT);5 ?$ J6 ^( U8 \7 S( D: d; L! }
// 发送中断
" y3 k- F" l+ o2 H, @: I) r$ W if(UART_INTID_TX_EMPTY == int_id)
' S( W) Q0 Q9 L {
% Z( ?' V1 _+ ? O7 z if(0 < length)
2 C _! h% [: I" Q/ e {
2 r* W4 f3 e4 Q // 写一个字节到 THR# ~) I2 H0 |/ N! x
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);0 F' L6 w& f% n2 O6 i
length--;& C0 f+ T1 u Z
count++;
0 `* [! }- w- ? n n. I$ C& Y }# ~! r0 y: `. B4 P$ ~; V
if(0 == length)
$ z$ c* P0 W2 S% L6 _+ u8 D% Y, c {7 H4 M; Q- F. X$ Q* }
// 禁用发送中断
e) g& W+ W3 p1 y; d) c3 S4 n UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);- |# B6 v; K4 ^# r- ?4 \7 R `" ~
}4 P5 a- C6 _: ~/ \+ r3 I
}
3 W7 r# }0 \: ^, u. W5 ? // 接收中断4 e6 `9 r0 y) B+ k
if(UART_INTID_RX_DATA == int_id)
( Q9 c+ Y* N1 } {: M, T' G/ `7 q
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
) u9 t3 h( F6 ~, A) x" { UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);# N, Y- p4 Y9 ~+ g: W
}
4 A0 L& D4 v0 n( \+ G& H // 接收错误
5 k9 y# w2 n& T* @( D+ m+ D+ \ if(UART_INTID_RX_LINE_STAT == int_id), k6 e) d" U9 Q9 L) q2 T
{
* c \6 F3 Y4 p1 v: e5 M1 h while(UARTRxErrorGet(SOC_UART_1_REGS))
# g; @, ^9 t a" c {
9 Y+ u% [8 M! v2 P$ b. W // 从 RBR 读一个字节
% O H6 V% E/ ?. @' c UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 f. n& ^( G/ S }
: a8 i; i8 j7 w; g }
4 S; W. F3 k, |( D) ^ V return;
" l; F! n8 C2 ^}6 {, @. H" R8 F% y
Int main()
; n& b& x9 H4 @* Y8 a" v{ + f- }1 w% S; R: {1 a$ g* f
UARTconfig();//uart 配置# j/ n A; z+ W. \, ^
Error_Block eb; E8 H) H5 ~1 a1 }- r
System_printf("enter main()\n");
# z. X/ [' X# |* h- t: V Error_init(&eb);
/ J8 H' ~: P7 K. s2 d2 D // 动态创建硬件中断
! F2 O. l' ~% E Hwi_Handle hwi1;. p; I1 c/ J& B$ Y, p/ m1 S
Hwi_Params hwiParams;
8 p! v' o+ ?* Z, X) ^/ I( o- | // 使用默认值初始化参数( ] l% {5 p# x5 D8 a+ v) w3 }2 z
Hwi_Params_init(&hwiParams);2 |* L+ U, i: V. {3 u4 O6 q. H
// 中断事件4 d' ]' c. }: [% G5 J4 X
hwiParams.eventId = SYS_INT_UART1_INT;& {% w O# L6 A7 Z2 F( w
// 传递到中断服务函数的参数7 {$ e i; b4 ?" }+ T3 F. t
hwiParams.arg = 0;
2 d* b$ R5 `- I% }/ H# D" o // 不允许该中断自身嵌套
, o P4 M9 c6 A9 G' { hwiParams.maskSetting = Hwi_MaskingOption_SELF;
2 J9 q+ A5 H7 X4 T% a8 K# t // 使能中断7 W4 |+ | L5 |
hwiParams.enableInt = true;0 ]) r: C- |; c/ |3 L
// 可屏蔽中断 4
# E: D( ^, U1 z3 E9 K5 K* d // 中断服务函数 hwiMain5 a% h+ t/ Y: p+ U# T2 c
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);9 ?! A8 S e5 R5 m$ T# C
if (hwi1 == NULL)7 T2 p) @% j# { i: w
System_abort("Hwi1 create failed");5 ]" M1 D9 {" S8 f
BIOS_start(); /* does not return */' `/ x ^; T6 L; t0 P
return(0);
- g7 X! j I! h7 }2 L/ J}
1 Z) G' H+ ^* P) Y( f" p
9 r R; U/ g% W! D& e3 l |
|