|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
q: D2 t1 B4 {* r8 x// 发送缓存
8 }, M; C, \; v$ v0 j5 Ychar Send[] = "UART1 test......\n\r";- q7 B4 J' q( c; w, j6 k9 @8 K! I
5 S2 Z/ \+ [! n% Y# k: }0 C
extern void UARTconfig()' n9 }# K3 l7 S
{
: Z5 g& a1 [4 u2 K: x7 i8 G //使能Uart1
! M4 f' r( f( S. i7 v# p" Z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- L* d; i V$ o( G! i - r7 b! B6 h7 \ `& ?
// 使能 UART1禁用流控
. v: q1 p$ j$ e/ L1 o, S' j* { UARTPinMuxSetup(1, 0);* c' r# |' s0 y1 {2 N
$ P% q4 O9 @) ^, u$ o6 d$ @- l4 r% [
// 波特率 115200 数据位 8 停止位 1 无校验位$ Q9 [! N7 l5 Y! s7 ?0 X# @
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
% u. d! E* o' X& Y4 E: t, J+ R% y& l" _
9 D/ b" U$ @% d( Y6 P6 z- a3 ]7 J# ?2 s# o // 使能 UART1
- N% j8 a# E5 s" P& D% U% I UARTEnable(SOC_UART_1_REGS);1 t. W, [" `2 N, a! _9 O4 Z8 e
// 使能接收 / 发送 FIFO) \% m6 Q- @, Y g
UARTFIFOEnable(SOC_UART_1_REGS);
, g7 Q- E7 u0 W5 |! ? // 设置 FIFO 级别
) t5 ^$ H( i' {% t. G+ I UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);! [0 N' H0 p' b, Y' M
//Uart1中断使能5 @8 ^" v: J. X M
unsigned int intFlags = 0;
2 {. M" @: R1 e+ t' E9 C intFlags |= (UART_INT_LINE_STAT | \4 y1 ?5 \3 D; L: s* ~, `! l3 m
UART_INT_TX_EMPTY | \
, P3 b4 h3 {& f9 t7 A1 H6 c2 A8 N- Z UART_INT_RXDATA_CTI);
|; V5 h% P4 j# {: L( a
6 B# C9 l( M6 r& M+ \* {% j UARTIntEnable(SOC_UART_1_REGS, intFlags);7 v7 C, E B5 z0 {+ X, ^ S9 t- U
}, z4 T6 d) V" ]& @! K* D
//UART 中断服务函数. S$ A4 F, W, U4 ~! R. V
void UARTIsr(UArg arg)2 Q( e5 ?: D; H9 m. p' k* @5 d
{ G* Z) d4 n/ ] V9 p
static unsigned int length = sizeof(Send);
0 C3 d l; r- e; b( |% ]! V K static unsigned int count = 0;+ G) _' [0 S* }
unsigned char rxData = 0;
- t! ~- O5 f5 Y- S/ W& @* ?+ y unsigned int int_id = 0;
6 s( Q( l4 D2 d: `& G // 确定中断源
& ~! ?" K. \ y7 U0 n: l int_id = UARTIntStatus(SOC_UART_1_REGS);
4 \1 u9 [4 M$ N" b // 清除 UART1 系统中断
4 k6 s7 i' `+ h- E4 l0 C1 H IntEventClear(SYS_INT_UART1_INT);# G$ y+ S; c; K, @& K6 r( H
// 发送中断6 h3 m1 ?+ _) U- m. T# T2 f
if(UART_INTID_TX_EMPTY == int_id)" t, [( T0 |' h; ~! @+ ^
{
+ R0 F% ?5 v& ~0 V& U if(0 < length)5 r G/ w# d7 `' a+ r
{
`+ e3 Y6 \# F& B // 写一个字节到 THR
# n4 D0 i# p7 X4 k, Q% ?+ V* h# q UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);' o; i$ J' B4 p' q
length--;& y/ l9 g3 u* a4 i
count++;2 Y+ T/ [" `2 A/ s
}8 l5 r5 R/ r- L l
if(0 == length); k+ Y9 o+ R+ S) e( P8 n2 o
{+ V9 ?) W( |1 c: R7 d
// 禁用发送中断/ L4 e# }7 X2 ~9 ?" L
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);6 y* ^7 D: ]8 x# L, E$ @
}, m5 p1 x# v+ q
}3 \5 n% p8 P0 V' R t
// 接收中断; h3 c. D( V2 v ^, I6 E" }# D K. X9 }# J
if(UART_INTID_RX_DATA == int_id)
1 k: y( A0 g3 V& V! }) n {$ u& K( P' l; l9 R' ^/ O2 }
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
0 I8 z% s' ]6 P: y) @5 D UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);/ [2 M2 e+ D l2 u5 N
}) k6 F! { }( R7 p% a
// 接收错误
2 N1 e4 U& i/ ]4 T2 a/ T2 h if(UART_INTID_RX_LINE_STAT == int_id)$ k7 b* b( ^, H/ O# \2 _1 J
{
7 A' i, \5 \# M while(UARTRxErrorGet(SOC_UART_1_REGS))
6 P7 U9 l8 ]0 Y9 v3 K {
0 _% n2 }/ A7 r // 从 RBR 读一个字节/ o9 T e( L/ E7 X& m" U5 D! R
UARTCharGetNonBlocking(SOC_UART_1_REGS);
, N) z$ X, O0 [8 D# ^: a2 v }9 C4 K5 Q1 j% |1 F
}
3 z% T- S8 |+ y& l& L/ h+ v return;
C2 q5 c( s; x. n8 e}" M3 I1 [6 Q1 w: B5 M% B
Int main()
: C/ p0 o( @( Y0 G, F8 E3 t' a{ ; W! I( A' i2 L6 J% T8 A( Y* y
UARTconfig();//uart 配置
- Z: Y, q4 q' h: k Error_Block eb;
) Q1 l" F! L! C0 {0 M+ G System_printf("enter main()\n");( \8 _- ]6 K C" \+ k$ Q
Error_init(&eb);5 v2 i3 _5 d% A) v. |8 D
// 动态创建硬件中断
0 `. j4 O3 U& u8 ^& h; d Hwi_Handle hwi1;
* \: V6 a! U8 y2 ~ Hwi_Params hwiParams;
* q& i0 B* Q" I. ?2 f; A // 使用默认值初始化参数
" Y8 D& K0 ?0 L# V% b Hwi_Params_init(&hwiParams);9 M# p/ E8 ?& a! r
// 中断事件
) O8 U5 N! I, v% w: Y+ f hwiParams.eventId = SYS_INT_UART1_INT;
1 D! Y% ^; F. {4 L7 _. T' o // 传递到中断服务函数的参数
- k6 G9 ]/ ~+ U3 i4 |/ ` hwiParams.arg = 0;! ~) `- U* n+ Q# Z& q5 @2 y
// 不允许该中断自身嵌套; W% @8 Y% N& G* p5 h3 @
hwiParams.maskSetting = Hwi_MaskingOption_SELF;. @" ` _! N" s" }! {3 R
// 使能中断& }( M8 R+ f% Y- x; p% j
hwiParams.enableInt = true;
) T. o! Q, y4 i7 H) I // 可屏蔽中断 4' h8 U* ]$ o- t6 l, b
// 中断服务函数 hwiMain$ ~, a! I: e* Z3 o* u6 i
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);1 X- E) K v7 U& A5 b" o
if (hwi1 == NULL)
$ E. U& l/ |9 z5 D; } System_abort("Hwi1 create failed");9 C1 ^: C( {' i& P0 e: s
BIOS_start(); /* does not return */
# D& b% g4 m9 ~% X4 a/ c return(0);; |, k4 m% G* U/ |8 M( ?: i; z
}
: m* d. z# i) ?
( o2 h' V, Y6 |3 s( R/ b |
|