|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下9 E% S1 O! h! V: \1 c
// 发送缓存. W; n Y! ` [. q8 U4 D( B
char Send[] = "UART1 test......\n\r"; M& D2 w' U+ H
8 ^ b' e" _8 R( T8 i3 Bextern void UARTconfig()( D7 C+ z& A2 O$ O9 ]" \
{" u" ?3 u- g$ Q3 n% S
//使能Uart1( a# U: M* ^% A( n; i7 h* i
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! x, q1 A/ d: L, j. P# ~& d2 _
0 `0 b# D/ S X. s; O; r // 使能 UART1禁用流控
4 W. C0 y; F, c3 j( j UARTPinMuxSetup(1, 0);
4 a8 u* Q* A) O+ u* f' u' @ : b9 _/ R! r0 ] R" B9 H
// 波特率 115200 数据位 8 停止位 1 无校验位% v5 W- |1 x) `4 w
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ s, e* @& t4 c
& L" M( l" u% l // 使能 UART1' v! K \2 w, _3 S8 [9 K% |
UARTEnable(SOC_UART_1_REGS);) a5 B6 h `. W: R3 M' d( q
// 使能接收 / 发送 FIFO( p! e2 ]0 b) k9 v' `9 ^0 e
UARTFIFOEnable(SOC_UART_1_REGS);
( U' C2 _6 A, N) A( d // 设置 FIFO 级别! q; u. T, _9 G
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);& f, x( z! j8 U3 `1 v3 y
//Uart1中断使能+ b- ^ j' I: c
unsigned int intFlags = 0;) G( x9 r0 L2 r8 C
intFlags |= (UART_INT_LINE_STAT | \) T- ~, v" m5 P y% X
UART_INT_TX_EMPTY | \
; j2 O/ [6 l0 m# n UART_INT_RXDATA_CTI);" h/ I' n2 R2 O" \/ m4 O) c5 M
+ H8 C) ^0 ^0 A% O4 q7 S
UARTIntEnable(SOC_UART_1_REGS, intFlags);! g- @* Z% U* x+ \
}
2 o8 n2 h! Z4 @, |6 a- e8 u ~: c//UART 中断服务函数
3 ^6 u! P7 i5 E1 K( F" Fvoid UARTIsr(UArg arg): ]# [8 X, v! s ?0 a0 o! D* g
{: y4 J6 ]9 k+ q( G, U& e. x
static unsigned int length = sizeof(Send);
& k) s7 ]) a6 X. f7 h static unsigned int count = 0;
9 q% x$ l% V3 Z unsigned char rxData = 0;
/ B2 Z& `( q& U9 O unsigned int int_id = 0;
5 U; J, S! D2 p8 B" t& X; o // 确定中断源: J$ m# X+ @0 h, m4 i
int_id = UARTIntStatus(SOC_UART_1_REGS);
: M7 U5 Q: `$ f: Z // 清除 UART1 系统中断
1 k7 v3 c" _$ f8 } | IntEventClear(SYS_INT_UART1_INT);
+ G" X& a8 S6 W Q1 x8 @ // 发送中断4 B4 o O+ r' K" R; d( c S& f. E
if(UART_INTID_TX_EMPTY == int_id)
. O; r, k+ w0 j6 H2 q {& ]* E0 c( ]/ [9 b, O q
if(0 < length)
& b# i6 H8 N$ M9 Y1 u0 G/ R: G, l4 L {4 q# ~+ Q5 ?2 h+ E9 q/ k+ O
// 写一个字节到 THR+ n1 y( E3 M6 Z+ T' X
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
) P9 A7 x/ C( W( f# F2 Y length--;
8 \6 }5 z, {1 m count++;
& w+ H- {" w8 B! a( y }
, x5 h4 ~- z8 z0 v0 }/ U if(0 == length)( [- \8 l, c/ b# ^3 q' [2 [
{
8 ?6 o e( U- ? // 禁用发送中断5 q# J' q) U' I8 }( U
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
" a3 p* m4 X3 P }
0 ^: w6 Q. M/ l' N" k% C8 i4 Z }. o z) W: e# n" t
// 接收中断9 i+ Z/ v) b% ^# c) y
if(UART_INTID_RX_DATA == int_id)) _8 }" L9 A8 Y# {9 K! E3 T
{% M9 R0 a% R2 p& ^
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
, a. k. P; ]! a' A UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);/ t1 U2 [% }- F4 H% l6 m: v2 G
}
5 H! w F) l6 T. m6 |% k // 接收错误6 O# r: g! {8 e7 Y
if(UART_INTID_RX_LINE_STAT == int_id)
1 R) d: t$ D' R' q+ s/ X } {, K* a f4 j; I. B& V2 |
while(UARTRxErrorGet(SOC_UART_1_REGS))8 v* B& f- P% K" r7 `: i
{
# ]( y* e3 i7 \2 S( K: Q8 W // 从 RBR 读一个字节* b& R5 J2 d. e5 q
UARTCharGetNonBlocking(SOC_UART_1_REGS);
' v# l0 e" L. w# T( B3 c }9 H2 i q- Q% N7 O9 B6 N3 d
}
; t H* X- e1 R. D7 ~7 a return;
( e% c1 \- k+ N& A. ~9 B. S. E; W}
% P; [" Z/ k& U6 NInt main(), N0 k, F! z! ^/ e& }1 h$ f
{
) L% {0 [. e2 f3 v4 s/ H9 I. i3 A UARTconfig();//uart 配置
1 x4 J# Q0 m& l' G8 f/ L! E- r X3 S Error_Block eb;$ U0 Q3 e0 ~. C& Z8 E1 S
System_printf("enter main()\n");
6 A$ T2 q l5 i6 P2 u0 Q4 A9 }$ K Error_init(&eb);. H) z* R) O- _. a `8 i( @4 `! f
// 动态创建硬件中断
1 H0 x0 \9 s$ u6 n. G Hwi_Handle hwi1;' S4 `" m7 c6 t' g- |7 `7 C
Hwi_Params hwiParams;; g) V$ I. a3 X3 k+ e
// 使用默认值初始化参数' Q- [, \9 Q! \$ x' S
Hwi_Params_init(&hwiParams);
4 w/ |1 l, ^0 U: e! y+ k, G // 中断事件
( u M) s' e9 y- T! s7 [ hwiParams.eventId = SYS_INT_UART1_INT;
# r; W0 v/ h$ S& q4 s // 传递到中断服务函数的参数( Y6 [7 ^" X! _) O
hwiParams.arg = 0;9 g* h( y7 J/ q+ z( z$ l
// 不允许该中断自身嵌套2 j" P' O5 H4 s0 ^( i7 H) Z8 f
hwiParams.maskSetting = Hwi_MaskingOption_SELF;+ L8 v) ]9 `! U3 i F7 o: r
// 使能中断0 A- ]5 ^ {& l$ Y! k. i, @" w
hwiParams.enableInt = true;5 G9 b6 \$ D4 l# p @+ Z' M
// 可屏蔽中断 4) U7 ^" v. K4 R, }1 n
// 中断服务函数 hwiMain
9 Q# u0 c% j4 Q; l$ Y7 O5 [ hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
5 a3 f- _# e7 }4 j0 I0 G/ h" ` if (hwi1 == NULL)2 b* c* g- B1 U9 c1 i
System_abort("Hwi1 create failed");
( \+ \) |; F, p' |$ U# Z- ^ BIOS_start(); /* does not return */ n4 M+ M$ `3 P9 n D5 A
return(0);
9 G# m5 ~, o- Q# M& \0 b, d& c: N}
! j: |4 E' N9 R. X6 b
* x5 m, a# v' X' X |
|