|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
Y* {$ q6 j( X' \) A; z1 L// 发送缓存
, R1 w1 \8 X! Y/ ]7 K$ schar Send[] = "UART1 test......\n\r";+ q- N9 K# W/ _: o
9 `( ~" b8 f1 p2 _extern void UARTconfig()
% ` F* v7 [* K; R{
! P* C/ a2 \5 `$ c //使能Uart1
7 A" @3 o" O. o5 }0 j1 @: u/ j PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 w0 D k& a1 q% S- N3 P( q8 h- p
! i1 V; a) T% D9 n // 使能 UART1禁用流控! R0 {- R+ B" k8 e# X
UARTPinMuxSetup(1, 0);
. w3 g, F I* y6 z
0 Z- J' L4 B* o! M2 \. {0 a0 E // 波特率 115200 数据位 8 停止位 1 无校验位
5 J. M" B1 K+ n/ S( L5 j UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# p4 A; X% a( @7 t. b: Y
& o! [5 j5 t' r1 ?$ u6 x1 q* i% i+ b // 使能 UART1
1 G6 y0 C( L6 Z- @* E, l+ h UARTEnable(SOC_UART_1_REGS);! k0 W% H0 @7 ?* W" i
// 使能接收 / 发送 FIFO m t$ z* ~1 t2 j- e
UARTFIFOEnable(SOC_UART_1_REGS);" o2 B* E( P3 ?( ~- V( S
// 设置 FIFO 级别
; g6 C: B3 o G. c UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
8 E. a: t# ?& b //Uart1中断使能
6 Y; k" y$ l' z( A* q' j unsigned int intFlags = 0;
* t# G5 g0 C# a2 d intFlags |= (UART_INT_LINE_STAT | \
2 `+ z& C# s/ ]% h+ j. F UART_INT_TX_EMPTY | \
6 V) S8 g; r" H UART_INT_RXDATA_CTI);
1 ?7 g/ z" n5 E/ {0 ^; ` 1 F6 ~0 W$ v e# S6 B0 T( f, l7 i
UARTIntEnable(SOC_UART_1_REGS, intFlags);
- s6 i4 o8 P- ^: |/ a0 h4 v0 ^' s" o}
7 l) a: \) T8 c& [) g% P8 e//UART 中断服务函数+ [- [* j) F3 S) K/ M
void UARTIsr(UArg arg)
) R- A! B' t' c* y; f5 S- n: f8 G{# n2 B+ m7 R2 D) q( I- b8 @
static unsigned int length = sizeof(Send);0 S( L7 B( ]7 W. {* v# T2 Y/ b
static unsigned int count = 0;
- L) `7 G6 o6 Y% h, o+ G3 w8 v unsigned char rxData = 0;
5 `$ N! _4 d9 T0 r' `, B1 v unsigned int int_id = 0;5 G. T! H8 |; E$ M }+ O8 }! T) o
// 确定中断源, m [& _9 k, V7 D$ \9 e8 v
int_id = UARTIntStatus(SOC_UART_1_REGS);( o( ]$ R3 ]$ h
// 清除 UART1 系统中断
! R, f) J$ E* s: H( K IntEventClear(SYS_INT_UART1_INT);9 \* T" E9 E1 t2 Q) I1 z" ^1 y
// 发送中断
) ~8 Q) m0 U6 m6 t* {% y if(UART_INTID_TX_EMPTY == int_id)
; j0 u3 ]2 c* G+ P3 @( x; @ {/ f& i3 c3 V2 K% D+ L7 {, f* f2 F
if(0 < length)
: k- q9 t. ?- ^: h {/ o/ x6 C6 e3 D" e/ g
// 写一个字节到 THR
2 ? D, f+ {" E6 K6 f UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);6 \7 b- i/ y" W3 A
length--;' N( A1 \2 A. u8 k
count++;7 e2 |% d* i) T0 k# s
}: X$ f" m( }) E
if(0 == length)) H4 s; l' @6 k6 }' W! v' }
{, N* w2 C& e- {, L; Y' S4 ?# H5 Y
// 禁用发送中断
/ a; g/ x, f% H S UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
7 K! d7 v: f2 O }
9 D5 ~2 Y1 j6 G5 d6 {0 i5 t: Q }
" V, v0 }+ O/ i! S // 接收中断
; D# Q* R/ @2 Z5 ] if(UART_INTID_RX_DATA == int_id)
( j2 L) t" O t/ @* q {
7 F* I1 e) y2 C, W. p5 A/ K7 _ rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);; \2 B D: b- h
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
; d& |9 D" N9 l# D }
; [2 U0 g$ e$ M* s$ d& ~( e // 接收错误/ {5 ?/ Z, a) S: D1 o# ]4 V
if(UART_INTID_RX_LINE_STAT == int_id)1 R9 e8 I4 T6 J2 I1 b
{
7 z8 g7 J- c- h3 y5 \; A1 F# a9 \ while(UARTRxErrorGet(SOC_UART_1_REGS))
9 h$ U3 e9 ~1 o( S$ d {4 u) m* D" e7 w: g
// 从 RBR 读一个字节- e9 d: X& s/ y% v. \
UARTCharGetNonBlocking(SOC_UART_1_REGS);6 _* S. y, l6 Z5 ^* V' m
}
6 L3 r' C1 s# v }; @9 g& B/ Q( q2 T: d2 o
return; q! y) Z, A, ^5 d. p5 M
}
! P. }/ n, v2 N% F0 OInt main()
+ z E- G8 p0 l{
' Y) S1 K) Y9 ? UARTconfig();//uart 配置
1 {9 q! Q) f( y7 R: ^) ]! x- @6 Q$ n: ~ Error_Block eb;
, \0 j( F. E3 H1 {7 u" o System_printf("enter main()\n");
! ?+ @& Y. j: Y8 W' R4 K; y Error_init(&eb);# C, ?1 y& x; M- m# c9 q8 }
// 动态创建硬件中断4 m8 }, W+ @ ~
Hwi_Handle hwi1;6 @/ N9 h! q7 C
Hwi_Params hwiParams;
. A: t& y- c% M: i! { // 使用默认值初始化参数1 ?) d) t/ A8 \+ W: p5 O* j( n& L
Hwi_Params_init(&hwiParams);7 S/ |1 H( y$ H8 L) C
// 中断事件
: Y/ C( ^5 r7 y( |2 K hwiParams.eventId = SYS_INT_UART1_INT;6 b$ k7 h2 D: S8 V
// 传递到中断服务函数的参数
) m! @/ ?* x6 B% D hwiParams.arg = 0;1 H) q3 D3 H4 }, B4 V9 y; J
// 不允许该中断自身嵌套
1 u; v# D ?1 R% }5 S+ N hwiParams.maskSetting = Hwi_MaskingOption_SELF;9 r) @3 Y6 J$ ~, I
// 使能中断
. X1 ~5 X$ J {+ @ hwiParams.enableInt = true;
: h x! B# q& L, C' {5 d // 可屏蔽中断 4! K. G7 \' M: o. \
// 中断服务函数 hwiMain( Q3 u' W6 |( H* N2 e6 J0 L6 d
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
5 @; k8 @% D' o" _ if (hwi1 == NULL)
# y0 T5 e0 D1 w3 w System_abort("Hwi1 create failed");
: C8 A' e6 l' F9 {, A* }0 x BIOS_start(); /* does not return */ |* D9 m" l- T8 {) Q
return(0);% q. S& m" @3 b; }! v
}) ^9 [& i5 F r. X1 q( s
- v! W }/ S1 m3 P" y! j |
|