|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下- Y% o% G* ?+ K4 U2 V. b9 P
// 发送缓存5 c& o$ Q4 _; i( V# C
char Send[] = "UART1 test......\n\r";1 S! y' \) F* H1 ^
( ]7 ^: W1 Q4 D M* F# h" M* N L
extern void UARTconfig()
% @) z2 d7 w0 Q; t: V. z{- m. E6 X! S7 H6 T5 x# F+ Y; Q
//使能Uart1& M& ?# v, j9 }' A1 s; j% {
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
3 o# W. Q0 P- l8 ~: e) z n+ { g
* y9 B* U$ n2 w8 k; Y+ |3 A9 D // 使能 UART1禁用流控: d: G- C% ]# t! a6 E2 y
UARTPinMuxSetup(1, 0);* O4 \( }0 x% a1 [
/ {9 h) f/ P$ A* x Y
// 波特率 115200 数据位 8 停止位 1 无校验位
2 S$ @$ F+ L$ J/ c UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
1 B/ C- x6 q' }" s& J* @ 1 U: u5 H+ Q2 x" z7 T! D$ N
// 使能 UART1
- T+ S0 h3 M/ D/ s UARTEnable(SOC_UART_1_REGS);
: I/ R, i% H9 N7 U# S" Q, ~/ R. X+ j // 使能接收 / 发送 FIFO
% Y U' t: }. J# q* S! v UARTFIFOEnable(SOC_UART_1_REGS);+ t7 |9 m( i: u7 Q H
// 设置 FIFO 级别
( d9 g. V' `5 P6 _ UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);( E/ |6 J: j" D1 H4 r
//Uart1中断使能! ~3 T# A4 Q0 c. t
unsigned int intFlags = 0;+ Y9 D' ^; V m, h% R. G
intFlags |= (UART_INT_LINE_STAT | \
1 m& N% |' C6 ^; K6 e4 P- m) ? UART_INT_TX_EMPTY | \# K9 q' j4 [5 ?3 u* b) m7 U
UART_INT_RXDATA_CTI);) P' ?; H* O+ t6 ~' B; D
B* a, X$ f8 X! I0 r* [: t/ _
UARTIntEnable(SOC_UART_1_REGS, intFlags);
0 i8 c7 J' @* y* f4 \4 N}
% r8 c5 {6 P0 Y, o" u//UART 中断服务函数& `2 V$ m6 A& Y: H; \4 ?+ G
void UARTIsr(UArg arg)
. z8 h: n) N' A, J{
# s2 v+ X4 g. y% ] static unsigned int length = sizeof(Send);
: C9 ]: o1 B' g; s5 a; M/ J. q static unsigned int count = 0;! ]/ d2 k# c; V/ w6 A# w" G, Q
unsigned char rxData = 0;
$ Z: a0 D; r/ }) ? unsigned int int_id = 0;
3 c. `) ? E) r) k4 t7 ^ // 确定中断源
4 C9 H* H1 Z, x3 b" p+ h6 h int_id = UARTIntStatus(SOC_UART_1_REGS);* v# Z2 J+ v, ~
// 清除 UART1 系统中断7 r& j( B- P( d) R/ G6 g$ ?; x
IntEventClear(SYS_INT_UART1_INT);) ~! G( a4 ]; k# \0 d7 C
// 发送中断% t- X" _) r6 b
if(UART_INTID_TX_EMPTY == int_id)
! U3 M- F# [# c% F: d; h) S {% j5 u! H' N) N5 Y) M% v5 |' J6 S K
if(0 < length)9 Q3 O$ E @' v' _
{# I; Z6 j9 h: B2 d- x
// 写一个字节到 THR
# _- K7 G; Q2 D& r0 P3 f3 N; q) O UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);7 J) V, S& j3 Z5 [
length--;1 ]# Q. k0 s" l* @ _2 U
count++;' N% l+ h) S8 y" J3 V8 x
}
5 P/ y. i. y3 E M8 F$ Z( p- e) g if(0 == length)
* ]$ |' f* k. M9 p {
# P2 E5 \3 j; w3 m // 禁用发送中断
/ F$ R$ F; @9 ?+ P7 d& V0 l2 F; J6 Y UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
( d- ?0 l: Z% M8 [& h, M& n* J$ k) w }
" Y/ `1 p* L2 L7 c- n% g; m9 x }
$ k& B# S* Y* h5 [ // 接收中断
$ l n0 I. {3 T if(UART_INTID_RX_DATA == int_id)
4 m+ D' w0 n+ i1 m( J6 F3 f {
# l( }% _( a; u w% P) t$ V: A; U rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);8 u. ?$ \6 L, q* D% s# m
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);- \2 D& t' r( i: z5 d! C0 o
}
# I( L/ i, l9 Q: A // 接收错误
' }8 z$ _, C+ ?5 d. R* l N if(UART_INTID_RX_LINE_STAT == int_id)
- d9 L5 C$ z3 ?( _# h+ F1 ^ {
& ?7 s: M: h3 w0 X while(UARTRxErrorGet(SOC_UART_1_REGS))
: d0 E' e% y* ^" m. ?& Y5 M {3 `' X: {7 z# n# I( n4 q
// 从 RBR 读一个字节
: f7 D3 c3 |1 {1 s0 g UARTCharGetNonBlocking(SOC_UART_1_REGS);, V2 X2 q; N/ D6 X; w% q1 r
}
6 t6 b$ z! r; j$ v. `3 S' J }! _6 s/ \8 W* C$ d+ ^2 j, @3 M
return;5 C3 |& C$ [- a1 x+ z
}
! V# i# J3 e) XInt main()
7 b8 }7 j8 n* a- G4 ?! Q{
, F7 h# f) f1 N UARTconfig();//uart 配置
9 i" s/ { \5 x* _! p4 a9 H Error_Block eb;
) X; e" ]: Y. ]1 _' G, i) } System_printf("enter main()\n");2 G7 ?1 z8 J' G% `( d
Error_init(&eb);! s3 y, ^* S2 Y9 m5 {4 ?. n- ?+ N9 `
// 动态创建硬件中断$ ~) y" f% ?% R( m
Hwi_Handle hwi1;; s0 t0 u: P+ R$ [5 {$ P& X
Hwi_Params hwiParams;* @5 G& N n ^8 N
// 使用默认值初始化参数
, m, {6 `3 M4 g$ O, s Hwi_Params_init(&hwiParams);' }. q& f" z. o2 ~7 n# U
// 中断事件7 M h( I0 n; `2 y/ h* j
hwiParams.eventId = SYS_INT_UART1_INT;
$ n) P k% F2 _$ R. U& y- Y% N // 传递到中断服务函数的参数6 B2 F" {- W: x1 D
hwiParams.arg = 0;
# o4 j+ W2 ~9 R- R0 j$ W // 不允许该中断自身嵌套5 {0 V5 A9 D# O" q
hwiParams.maskSetting = Hwi_MaskingOption_SELF;$ j, p( g$ ?' K; Z8 z! a4 P- t
// 使能中断2 L# c4 O8 z+ j% x
hwiParams.enableInt = true;8 G3 z N; g9 U2 o+ P9 `! H( p
// 可屏蔽中断 45 L q6 }& C+ l# k2 m5 F6 [2 Q3 ]2 O9 u
// 中断服务函数 hwiMain2 }! G9 E+ j8 O
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
/ E3 W% ]. G& \" B7 j5 C K if (hwi1 == NULL): \3 g. C" r. R% U! O* A, \2 }* q
System_abort("Hwi1 create failed");/ U/ f6 n5 K! u7 B4 B
BIOS_start(); /* does not return */- d; h' z% {# ~5 ~2 E
return(0);" [" ] `+ _ y' U( |! F' k
}1 j! w% A q x
% i% F; n8 G4 [0 E |
|