|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下2 P- Q3 X, n4 G" T
// 发送缓存0 n% H" v, t% i4 K0 P% d* F( f8 f- P. l
char Send[] = "UART1 test......\n\r";
8 S! a3 ?* R q. _
2 w8 u7 }- A) t s/ mextern void UARTconfig()
$ K* u, O) K0 m{
7 [* L5 P( I# i3 `/ L1 A" [) K3 _ //使能Uart1
3 ?8 O. c" w" N- |0 L$ @, P PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
8 j. W8 w0 E* j0 @ \- `* G ) V' h0 I+ h% ]3 N3 F
// 使能 UART1禁用流控9 G% z8 `. Z+ a4 R) g% ]$ t1 Z$ }
UARTPinMuxSetup(1, 0);
. [0 A, _2 R1 l8 z+ u 2 A* o% P2 ~) k0 @& P) s
// 波特率 115200 数据位 8 停止位 1 无校验位0 ^0 v$ G4 Z8 e: d$ q8 K$ ?6 s9 z
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
! N9 \( K x% h, V" r
. A- m8 s9 ?# u$ c$ o2 H // 使能 UART1
; t" }3 X% I4 Z: y' S7 M0 B6 [ UARTEnable(SOC_UART_1_REGS);
8 n& _3 @9 Y$ x) Y# y // 使能接收 / 发送 FIFO1 o+ O& U* q; x' h+ U$ G$ j$ X
UARTFIFOEnable(SOC_UART_1_REGS);
5 K& ^* J' |1 p+ |# z, U // 设置 FIFO 级别
2 I" ?: l, k5 G" q: w UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
+ P( k8 ~' E( \9 T( I //Uart1中断使能, S5 |& X" o. a- u+ K4 a1 Y X2 X
unsigned int intFlags = 0;$ S `: I5 O B7 g$ {: i2 d
intFlags |= (UART_INT_LINE_STAT | \
4 l- O* }# T& x7 d& D# k UART_INT_TX_EMPTY | \" n7 [ W( l7 Z* d% A
UART_INT_RXDATA_CTI);, @* a. F+ a+ k$ ~! a$ v3 Z" L( ]
) K4 |8 v( _4 G& t
UARTIntEnable(SOC_UART_1_REGS, intFlags);
% u* f, Y' k( F( [}
& B: C0 `6 S1 }& y' P//UART 中断服务函数3 V- ]# p. \5 B7 m
void UARTIsr(UArg arg)5 ?6 Z& m8 [) E- n
{
1 D$ T# y' ^' a* h( f/ ^# g static unsigned int length = sizeof(Send);
" e4 X0 Y1 e2 {: g" @0 ] static unsigned int count = 0;" X) h; M) [, A" _
unsigned char rxData = 0;: E" E# q/ N/ J% X- p
unsigned int int_id = 0;' i3 y. ]" r4 L* P y7 w' G/ P/ ^& J8 |
// 确定中断源! H4 s1 K1 Y+ R7 ~: N( K9 S% i
int_id = UARTIntStatus(SOC_UART_1_REGS);
$ k7 k: P. t! y8 j% |( G // 清除 UART1 系统中断
8 ~) a! l, q2 J P IntEventClear(SYS_INT_UART1_INT);
% X, ^4 R% v& h/ Y6 e // 发送中断+ G" E/ X- l4 B5 c* E& A& }& d
if(UART_INTID_TX_EMPTY == int_id)" P* e' U6 S- G" F
{$ p2 R/ `3 p; G5 m7 w$ ], R
if(0 < length)0 \* Y# e7 l7 u y
{8 {7 R" l' J3 ~3 H R$ t' h
// 写一个字节到 THR
$ w: Z- U9 v2 a, O5 }1 U UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
; O# f ?, R8 B# e, @1 o: ] length--;2 d( ^7 E o8 f( x7 H
count++;: ^- T$ n' I6 k; e$ j: X5 Q
}5 _$ e* s/ C) Z& T6 z+ r
if(0 == length)
, `1 B6 p% F. C, z7 X {
! H7 N) K* b# ]- G# R# d // 禁用发送中断6 @' c5 P- W8 U7 o4 i7 z( }
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);8 S, R( Z4 ~7 j) L$ m* s6 f% v
}1 o2 _0 Y0 E+ a
}
. L \0 F8 P' p! T+ C // 接收中断2 \+ i( f0 w7 e9 Z! n0 n4 g' b
if(UART_INTID_RX_DATA == int_id)
4 A1 y% v9 ^ i {( J+ W9 f; ^& P. Z2 `
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS); o( f, p. e4 i
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
7 v; M$ Z+ q( O. n6 X+ V }
2 \! ?+ F7 W- x // 接收错误
3 a: k g6 x8 z! t if(UART_INTID_RX_LINE_STAT == int_id)& U5 K, X e4 C, W
{
) r: i- M5 _1 B: h5 { while(UARTRxErrorGet(SOC_UART_1_REGS))
$ e6 T1 @2 g [7 F {, h [' J- g+ h% H+ V L( P
// 从 RBR 读一个字节
/ a" y% r$ S. f$ f UARTCharGetNonBlocking(SOC_UART_1_REGS);6 {+ k' a! U# t- h, m# p9 ~3 i
}- H5 C1 f; T7 }/ J5 a1 C# @
}
# Q: }0 H$ N. S# a( D: U1 P return;
! G1 N# L5 x2 `6 Y$ Z& G# Y}
6 J6 |, a' Y+ T0 p. ^Int main()
" F/ _; ?9 {7 \; h* D. Y- h( z{ ' _$ t. L+ L* D- b
UARTconfig();//uart 配置
7 v" f# s3 M7 S& v) F Error_Block eb;
1 I5 E! l) Y$ c3 G A System_printf("enter main()\n");) ]" T7 k; P' I3 N. t6 N: v! C5 H' i
Error_init(&eb);
; v' q6 o, e' y. @2 k; ^ // 动态创建硬件中断
0 k1 A3 w5 A2 O/ f7 p0 k9 V Hwi_Handle hwi1;
) a/ u! n; J; E, W7 @ Hwi_Params hwiParams;* E+ `" m2 W' r/ ] c4 N
// 使用默认值初始化参数
\- v, j$ a& r C" k Hwi_Params_init(&hwiParams);& [3 Z( _9 V2 j: |" Q) I
// 中断事件
! @% U8 ]) c8 l hwiParams.eventId = SYS_INT_UART1_INT;& p; ~' Q: }5 O* N( G3 Y
// 传递到中断服务函数的参数* M( p# w1 f& @; z' x# E& l |- h" }
hwiParams.arg = 0;6 L ^( G* h3 A- E+ I# j2 p
// 不允许该中断自身嵌套
* N4 w: I% d" j. t5 G hwiParams.maskSetting = Hwi_MaskingOption_SELF;
- K6 v5 ~1 ~5 I // 使能中断
: \# N; p5 q! J( x `% i. ? hwiParams.enableInt = true;
+ m) Q @$ x, ], A4 K$ J: X // 可屏蔽中断 4
" y% _2 x. P3 E5 W' K2 Q // 中断服务函数 hwiMain
; f! a4 r' G T& n hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
* `9 V3 ^/ ]4 s6 Q* Z8 S3 F- F if (hwi1 == NULL), n2 R8 S" m% @/ v5 h
System_abort("Hwi1 create failed");4 `" s5 R3 D/ g1 c* Y' s# U
BIOS_start(); /* does not return */% M P, W' M0 }% X. j6 G
return(0);
; P& `0 }, |0 \0 r0 w* g, S$ N& Z}
! `' r i; [; U6 o0 J* k( z, g, ]* J) E% _6 C
|
|