|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下) t+ D- u2 {1 A$ ~) b/ r( `0 A r/ D
// 发送缓存
' P- K$ T, y. G% m C7 Ochar Send[] = "UART1 test......\n\r";
/ L& |2 o- g/ G L
, @( {; _, e0 t$ Y5 jextern void UARTconfig()
$ y3 j4 m2 B. E/ l' X{
0 `) Z3 S* ?9 I, P( J P //使能Uart1( ~2 N/ y) p1 u a
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);+ Z( C6 a- _+ G- y" k
5 O$ z0 s, u- D) H# V/ A
// 使能 UART1禁用流控
3 y+ u; ]1 V+ r2 [8 u UARTPinMuxSetup(1, 0);
' X, B# F) Q* x1 N/ |$ c
0 A3 X4 h- w: V0 \: \9 ?4 Z // 波特率 115200 数据位 8 停止位 1 无校验位
$ @6 g& r y$ C4 u! J" u1 n UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' y4 ]7 N; R6 Q' l4 y
2 T2 q" I; O8 l7 m // 使能 UART17 [7 D* T1 R( I% u* T9 S( C5 J6 C
UARTEnable(SOC_UART_1_REGS);( @) |# f3 `% W$ t
// 使能接收 / 发送 FIFO
& J% E0 U, x& a( _$ T2 B7 k- w. M UARTFIFOEnable(SOC_UART_1_REGS);0 k0 N# d2 h& b7 e" L- m5 J
// 设置 FIFO 级别
( f- \0 c9 ~- _, e% q3 M' {! ? UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
$ r& x Z3 r) e# C% w //Uart1中断使能( b4 D5 E% y3 u& n3 s. ]4 y, q
unsigned int intFlags = 0;$ t8 J- X' ~/ y, }
intFlags |= (UART_INT_LINE_STAT | \6 v c) e3 R' D* e+ |) I
UART_INT_TX_EMPTY | \
$ G& n. j7 [/ }" S3 p+ |+ F9 G UART_INT_RXDATA_CTI);: I* c! S; t' D' n4 J( t
. S% s( R: e$ r" t2 }
UARTIntEnable(SOC_UART_1_REGS, intFlags);) Q ~$ ~, `$ ^+ y
}4 u. M! M# l' ~7 i' b7 v0 M
//UART 中断服务函数1 J- b2 Y3 s( q" Y- ?- B" f
void UARTIsr(UArg arg)" T0 S$ i! O# s0 _3 g
{- J2 E: s2 T% p
static unsigned int length = sizeof(Send);
2 K- l; l# c) }4 V static unsigned int count = 0;. c1 r& M1 s. @9 t( Q6 G3 y' ]
unsigned char rxData = 0;
" X. X# |( I5 {' \) ~ unsigned int int_id = 0;
. A' E. ^0 J: J+ j, f // 确定中断源
7 r: K3 t* H5 `" T int_id = UARTIntStatus(SOC_UART_1_REGS);
3 S& Y+ J# Q! J, s, b3 k // 清除 UART1 系统中断
0 _1 e/ _# { [; \( w1 ]7 I2 f IntEventClear(SYS_INT_UART1_INT);7 X; E" P; u$ t) K1 j9 Y( [# j
// 发送中断
- t$ o, G2 _: Z/ u! Z) m, i if(UART_INTID_TX_EMPTY == int_id)
" N2 W( f7 S1 C q2 _& b {
, w0 ^, ` T" I! W% F if(0 < length)6 p) m4 p$ v8 y" j7 ?
{
6 R* ~, a6 T: z; d ]& b // 写一个字节到 THR
- Z& R( @. U* B4 F UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);4 i' ]) T5 P M; B5 x1 h* A; m0 g# n
length--;) h, g8 _1 A U$ X4 \- p
count++;
" e1 W- q$ [1 g }( N8 n ?1 P4 v8 |* \" ]
if(0 == length) Y3 a1 B4 [2 n1 I
{
! I# A |7 T8 d0 ?4 v; p+ x5 l // 禁用发送中断! k& ?% X1 U) X8 w n8 m
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);# K; r/ z! j% z t7 m5 t- o1 T$ l
}
& [0 E `& P: ^( f) S' _/ I }
; D; _. {: D% \* k7 P% ~. D; { // 接收中断) \ h% c( ]; Q. _
if(UART_INTID_RX_DATA == int_id)
3 h( k B7 I( e% o+ s {/ h2 r8 X, F* E8 ^9 r! O
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);5 s7 C/ s# H& ]+ L2 m* z" S
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);5 y% G6 k2 y5 S* R
}' \% `( @( t, o
// 接收错误6 S* [4 ]3 W$ \, {1 h) f
if(UART_INTID_RX_LINE_STAT == int_id)+ G1 C7 j$ s0 |! j
{% V( G1 t; n7 k( ]) |" ~6 V
while(UARTRxErrorGet(SOC_UART_1_REGS))
* ]& b, D, V/ j6 X2 W' g7 G; ^ {% y# t5 U2 ?: P9 ]* X
// 从 RBR 读一个字节
8 o r" t! K: j$ V UARTCharGetNonBlocking(SOC_UART_1_REGS);
, ^6 g# Y' [( s9 Y/ Z; E3 ^3 ~ }' n, l; H) H/ {4 o7 `. v
}! I! O! \7 U8 t! `. @' W5 n
return;0 K& R! o3 w4 x- q, y: e# h
}0 o7 F) q) A" m: Z
Int main()
# Q' T4 j4 B+ y7 g8 {/ D- H7 o- c{ $ U6 A% N% \1 n& b8 x
UARTconfig();//uart 配置9 ?; v7 @- W$ I$ C ^1 j; \* X
Error_Block eb;5 S& [5 \, S+ l# h
System_printf("enter main()\n");
Q y5 ~4 }& F( A2 H Error_init(&eb);
+ |5 B) B6 H: _. l8 ^1 R4 I6 T // 动态创建硬件中断. y, l" e2 K& [. d& \# F3 x6 A
Hwi_Handle hwi1;3 h" |7 o w1 @ I4 d
Hwi_Params hwiParams;
+ Q& R& u) v9 Y% | // 使用默认值初始化参数
8 f9 U& ~# C1 }- V Hwi_Params_init(&hwiParams);" Z4 o2 \1 F4 h3 ?! P/ f
// 中断事件$ a& A: b9 a b8 `5 A o: T
hwiParams.eventId = SYS_INT_UART1_INT;) x- P% m& o: l- b( _
// 传递到中断服务函数的参数
& B" `3 P2 W Z- O+ q+ m hwiParams.arg = 0;. V" W: n: s! L$ k
// 不允许该中断自身嵌套
1 e& Z- J1 K& f hwiParams.maskSetting = Hwi_MaskingOption_SELF;
/ F: g) s5 X$ R. y7 ?% P // 使能中断
$ l6 E( c: ~+ g6 S- a3 h hwiParams.enableInt = true;, w; ?; M% Y6 f2 N/ U8 p3 g
// 可屏蔽中断 4
6 c1 j" {' ^- ]& C4 [ // 中断服务函数 hwiMain$ D) n, C6 f' i$ P' G1 m
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);1 R* q7 t& K$ l l8 c# b, `
if (hwi1 == NULL)
" q5 n- R& K" U System_abort("Hwi1 create failed");/ h# _# u4 Z/ C7 k% q
BIOS_start(); /* does not return */
6 r( o% N, s1 r8 {. Z return(0);& D9 Z Z! g' E7 T
}
, Z% i$ n' c2 T a2 Z& p
# _ q ]1 \0 f* y) s# x |
|