|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下- D) y, A+ L, C3 v) c& @- r
// 发送缓存- n) L I- A7 f0 w: \
char Send[] = "UART1 test......\n\r";. j) j# O. g! S% X# x [. ]
% n! S0 f, g/ M+ |extern void UARTconfig()1 p2 W; j$ K- k
{& p. c' b! \2 ]
//使能Uart1" R K$ X p0 H+ w s/ \- y2 Y& r D; P
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 H' T9 r, W, L1 [
Z R+ _, w; R6 ~! P8 h \
// 使能 UART1禁用流控
8 P* Y e" t9 |- ` UARTPinMuxSetup(1, 0);0 r/ j" _& f6 j. f
/ q" V0 U0 m$ z* g3 f' ^/ q# I
// 波特率 115200 数据位 8 停止位 1 无校验位
+ ]- |, t, B6 n UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);. ~ c7 L y, x8 ]9 K6 N2 I
3 h% N. m2 O, G E( a9 z( w4 N2 N$ ?
// 使能 UART1/ X; Z( P& [+ ?
UARTEnable(SOC_UART_1_REGS); @3 E$ b" a/ p* V' }* j, ]
// 使能接收 / 发送 FIFO; \# w- d l( ]) B
UARTFIFOEnable(SOC_UART_1_REGS);
7 r) g+ x+ e, ^; G% b7 [ // 设置 FIFO 级别
7 O* C5 o( x8 x" I( | UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);2 f$ H( W+ d* O: ?* m1 L& W
//Uart1中断使能
0 a# i4 _5 o# t+ J! q* J' i( m$ ~ unsigned int intFlags = 0;
3 ^, x+ C( J' q- v intFlags |= (UART_INT_LINE_STAT | \
9 p% P) i$ {) L0 l2 j; ?: Q4 W UART_INT_TX_EMPTY | \
! A6 n8 v6 N/ ?# t. e# c UART_INT_RXDATA_CTI);# k, v# A5 V- @6 p0 R+ @
$ y. j3 V: Y C' R0 q" S# S5 w" M
UARTIntEnable(SOC_UART_1_REGS, intFlags);
9 B3 e" D4 a4 `/ y e: X}
6 e5 n1 k$ i- b7 a: [; E//UART 中断服务函数' `1 p9 o" @( y1 c
void UARTIsr(UArg arg)
. ]8 C$ ?3 X4 S! C% e1 r{% M$ h) V+ |& L4 N7 n0 _+ W
static unsigned int length = sizeof(Send);
6 k9 b* M0 e* b" `7 l& s6 u static unsigned int count = 0;1 @; P& V$ t$ S1 _; I4 d; @
unsigned char rxData = 0;
( z1 u3 ~' \6 X* n2 L! d3 i unsigned int int_id = 0;' F) }% C) ~2 r& [
// 确定中断源
, f; l4 p+ ?7 H6 u ?0 X int_id = UARTIntStatus(SOC_UART_1_REGS);$ O2 m D* Y* o0 R' t
// 清除 UART1 系统中断7 [6 q& e1 L+ \4 q4 _* a; \
IntEventClear(SYS_INT_UART1_INT);
4 I. Q7 R) C/ ~" K // 发送中断2 W- M2 y: G7 `5 ?: O! J; p
if(UART_INTID_TX_EMPTY == int_id)
( {" l- T8 B0 B3 m, I; r# h; l8 V {
, `2 O, r! z: @% s9 w if(0 < length)' a% r: t) {/ ~# y
{5 m7 K( V/ A" Q& N2 m% L3 O, J
// 写一个字节到 THR
* A# Q$ p T0 q. s1 z UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
, Y( g! s8 k" c$ e length--;
' o- P) R, ~* L: L( T9 W( ?4 d count++;* f4 P4 j l. U% O
}6 ]' D3 y6 E' F' I
if(0 == length) Z% l2 l/ R7 A1 a, O
{
; C3 a- R/ ]" e, a: o // 禁用发送中断
5 ^, O: q! `9 J; r; S& s UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
2 \; O- E' B0 P4 M }* Q6 f: Q7 R4 v: `( d1 @
}
2 Z% G: k6 {; k& k // 接收中断
& `( _% ?. O( w& f1 w4 w! R+ } if(UART_INTID_RX_DATA == int_id)
1 m0 v# |) j, {' V. k V# D {' C, ~: j" F2 X/ N* H5 s
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
8 m7 s1 @0 p8 i; L: g- F UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);: _- h, r8 D- t$ g/ M
}7 f1 v+ l, B- U
// 接收错误
$ J9 x* w7 ?# P- v- L- I if(UART_INTID_RX_LINE_STAT == int_id)+ y2 N4 P) C& X9 M
{
, S: z( j. V. _ while(UARTRxErrorGet(SOC_UART_1_REGS))
m) c# H" O6 \; n' J6 k {
. V% g3 A, m9 L& X) R+ l // 从 RBR 读一个字节
6 p f, b! ~) i4 u4 \. w" O UARTCharGetNonBlocking(SOC_UART_1_REGS);. I/ ^3 Y6 w4 j- C! Y" D
}
, k$ u1 S' h- I. a }2 ]4 }% {( N" ?7 c
return;$ d) t/ j8 A3 X" @) ^6 V
}
: Y @$ D2 z9 `. e. I1 X8 @Int main()6 o# `1 q& v' @6 ]$ O# t* ~0 v! e
{ - I7 |$ @: q$ Y$ T+ ~0 V) J) W
UARTconfig();//uart 配置7 s2 Z. q1 e# S! s* X4 l
Error_Block eb;% Q" M# I' F$ K$ |4 X8 K- T
System_printf("enter main()\n");
. `1 I1 ^/ S6 Q* h( }% w7 r Error_init(&eb);# |- {% p' v$ |) _7 z; w
// 动态创建硬件中断, O$ j$ ?* F: g; t' e! K% K
Hwi_Handle hwi1;
% E3 c/ B6 ?4 A7 P" S3 F Hwi_Params hwiParams;
: Z4 b. F# i2 V // 使用默认值初始化参数
, z% @) V& }4 v3 j5 ~, W' U2 L Hwi_Params_init(&hwiParams);3 F* i, h3 ~5 t3 J5 A8 Q1 K
// 中断事件5 I% N5 g8 \, g( I$ x3 n
hwiParams.eventId = SYS_INT_UART1_INT;
5 |) h2 I- C L% d/ ]8 J% K // 传递到中断服务函数的参数( A% @' ~& j+ b4 P2 I8 y: N
hwiParams.arg = 0;
+ k+ F7 |" i. z- I // 不允许该中断自身嵌套 A3 o& T: t& y" f: R
hwiParams.maskSetting = Hwi_MaskingOption_SELF;* `3 l2 T" x2 a( S' ` y
// 使能中断
# I+ A( T; M5 W% X2 Y9 V hwiParams.enableInt = true;
) f1 n* v# i- |8 R2 Y/ A4 p- y // 可屏蔽中断 4
( a3 r9 n% R' t/ i) t; b, ~ // 中断服务函数 hwiMain
$ Y3 l6 ?+ e0 C$ S B: u2 ~ hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);: l3 `! b& v; ?& ^; i
if (hwi1 == NULL)+ P5 x4 o) |2 u5 P5 U' E
System_abort("Hwi1 create failed");) W- V' M w8 x+ c6 e
BIOS_start(); /* does not return */2 |/ J! e5 U! {% k. n q
return(0);
2 N/ z% ~# j$ U}
( N0 ^% s, |9 e* E( g; @; O6 \! p2 W2 c
|
|