|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
8 s: O: Y9 N5 d$ M// 发送缓存$ U4 |3 [& m( O6 Z) g" X, B7 f* g
char Send[] = "UART1 test......\n\r";
, f4 s# A" W0 |4 H* b0 t( U
, i K, ~7 T5 }7 V4 m' q/ h" @2 Sextern void UARTconfig(), P5 @& Y9 ~5 @8 p
{
- Z: E5 h# M7 v# V5 Z4 B3 J //使能Uart1
+ C. f& p+ L' k6 v( T0 v- s1 b: n PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
K. T- L' _5 c5 Y' E7 A* Z, ~ 1 O3 P7 u+ E' T
// 使能 UART1禁用流控
+ u: C! u+ Q" l( w n( Z- l0 r! M I UARTPinMuxSetup(1, 0);1 i$ O- k( M e$ M1 t
' q3 d; q2 A% s, Q- o& k. Z8 |
// 波特率 115200 数据位 8 停止位 1 无校验位
$ ]( s. I! v0 K7 {: V8 i5 b UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);4 _, O# ]. A# W4 F9 j5 i% Z
, K4 Y1 o: G. i$ B
// 使能 UART1
8 O1 {8 s, j/ {( N# {. I+ u- E UARTEnable(SOC_UART_1_REGS);
7 `8 q' O4 g' K! h // 使能接收 / 发送 FIFO( ~3 p( b, d$ g
UARTFIFOEnable(SOC_UART_1_REGS);
3 d- c' G7 f7 K/ | // 设置 FIFO 级别
2 L+ n8 H1 C6 |9 t. P8 { UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);0 c/ R' o# C. s4 ?- V9 d
//Uart1中断使能5 N& s* m: { U+ l; k1 W
unsigned int intFlags = 0;0 z' H; ]0 I- y9 q* y6 f
intFlags |= (UART_INT_LINE_STAT | \: j$ H. o( M0 ?( q3 {5 a
UART_INT_TX_EMPTY | \
0 v& l" ]- B# C z& D+ [, b UART_INT_RXDATA_CTI);4 ^2 E- D. m9 s0 t+ ~' I
( Q; Z% b( N$ G9 |! [1 x* }' f UARTIntEnable(SOC_UART_1_REGS, intFlags);
% y% P8 b5 D/ Z2 b# H}
& @) M& |% e/ L4 f, e//UART 中断服务函数# ~; N9 w6 f8 Y
void UARTIsr(UArg arg)
/ Z- x B, Q6 I: I5 T! C) N{& O+ P* J, b% g* d
static unsigned int length = sizeof(Send);1 l" b1 @ \1 H$ V7 m
static unsigned int count = 0;
. N: ` Z- b( _ @: ? unsigned char rxData = 0;
! m$ O3 L& u ? unsigned int int_id = 0;8 y5 v% j" C7 a! `
// 确定中断源
$ N0 b) C# Q; d D" @ int_id = UARTIntStatus(SOC_UART_1_REGS);
! X* U) _0 G c! y) _, N // 清除 UART1 系统中断
6 Y7 `7 e; Y- X7 Q, ^4 `1 k8 w IntEventClear(SYS_INT_UART1_INT);9 j; m' ^% Z, u5 W0 G) C
// 发送中断7 p( ?: r% b5 u5 A
if(UART_INTID_TX_EMPTY == int_id)
2 u) N5 u8 ?& F# |( Y x" n {
/ l S. |: B- q if(0 < length), b1 `1 E$ d" c' _, m; ]% Q
{/ x# @$ L1 s& A% L5 U
// 写一个字节到 THR3 a! i3 E0 Z1 {
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);( t2 X1 _/ z" U9 g4 I2 o" |8 {& M
length--;
W2 ?7 v# @: { count++;
% Z- D( [: a2 z; l( T2 d }1 t3 ~/ K0 [/ l, N9 \& B
if(0 == length)
4 [: \$ r% I! d {7 \5 `9 B! I l, S+ z
// 禁用发送中断1 f+ G7 ] [7 {
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
! s( x2 d/ x" }" G9 T. a& n; J }
+ m! t. \! p+ Y2 l: q3 h) f }5 H: i! | P2 |6 H* `& t4 x
// 接收中断# ^6 }% h( _9 S' o9 W7 T
if(UART_INTID_RX_DATA == int_id)% E7 K$ _8 B) j
{% e& S: {/ ?) r! N! a; O6 }. g5 s
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);$ s. S' k* I* z
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);' t. M" T: l: `$ n D g
}
. R; X; D- C9 z( N8 g // 接收错误
4 f* E: T0 c5 v' K, D, Y7 x( _ u if(UART_INTID_RX_LINE_STAT == int_id)6 e6 b' j. A9 R1 e: W6 s
{
+ p6 _/ _6 n/ g+ L) _ while(UARTRxErrorGet(SOC_UART_1_REGS))- i3 g, r/ D; `2 {% v9 \7 L
{
: i$ @, A- Z6 T! N; {9 Y // 从 RBR 读一个字节- T& p1 F n: H5 r8 M* k
UARTCharGetNonBlocking(SOC_UART_1_REGS);
3 q! p, s' V2 t- z: O }* N) b; L1 y& Y9 g$ |# n4 H0 b
}: T( j ] w k! o3 m1 e
return;" ]/ d' T) c3 Y; l
}
0 ^! ? F8 W! Q& |% {7 S- ~$ GInt main()
2 g4 j9 K# ~" H( \0 e{ 0 m0 d2 P1 Q/ E8 k
UARTconfig();//uart 配置 M+ g" V8 e" E% z7 g5 Z4 T
Error_Block eb;
/ x. `- v2 @# I. d. Y- i1 a2 F System_printf("enter main()\n");
3 o; N- s3 A8 k" d( s& w4 u9 q Error_init(&eb);8 B/ x* v" _% e; X$ k
// 动态创建硬件中断
$ e' @$ `! S3 }4 J$ W Hwi_Handle hwi1;/ N+ b9 p9 j1 z5 @
Hwi_Params hwiParams;
1 c% n# ?8 A, @! {2 [3 x0 O, a // 使用默认值初始化参数
2 [% @. \ ]9 c/ l Hwi_Params_init(&hwiParams);3 n2 T* ]6 o% N- v7 _
// 中断事件
) H) ^* t+ q7 A6 r( Q hwiParams.eventId = SYS_INT_UART1_INT;$ i0 H5 s( A1 h; T* }* Z
// 传递到中断服务函数的参数
' U8 M F! D6 g' _/ _) | hwiParams.arg = 0;* E* k9 a+ G* A+ b
// 不允许该中断自身嵌套% ~. `2 X- }) y+ q$ O* D
hwiParams.maskSetting = Hwi_MaskingOption_SELF;( {! @! p( ^% G9 {$ h
// 使能中断
! O/ H1 k/ |0 Q/ B& c hwiParams.enableInt = true;
' }& t) [8 {& Q7 E+ m& `$ {* |7 k // 可屏蔽中断 48 e1 k8 {0 D- g. M0 L1 S0 ^
// 中断服务函数 hwiMain
% F& i- R/ n# p7 _3 P5 v hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);. o" V4 Y) O, @- P# s
if (hwi1 == NULL)# J( R( G) A) h& q
System_abort("Hwi1 create failed");
b+ S% Z: a& c2 L BIOS_start(); /* does not return */
6 j W5 o+ @4 `+ D5 U6 o return(0);0 u, z# z5 C5 e. m* `
}
8 l( @' |- a" w6 U5 [0 I z7 `, D* ^8 Z$ E/ ^! e+ F* Y
|
|