|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
' {: D Y( J& ]5 P3 X: Z8 ?4 i// 发送缓存
+ d& Z# [' c5 F( m+ V5 @7 {char Send[] = "UART1 test......\n\r";
6 k8 z" n! ]8 Y% @* y1 e
: o7 f# m5 Z& ~% Kextern void UARTconfig()0 A9 J9 D6 A& B/ y' h8 N1 V+ ]
{& P% H9 o/ U& Z( {, G1 ~
//使能Uart1% }0 D+ P% _5 O0 k4 F" ~
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; h2 r! Z5 A& y& }" o 2 Q8 u* @5 u! n5 p$ V
// 使能 UART1禁用流控
& Q- r7 E. y2 u1 W UARTPinMuxSetup(1, 0);! q' ]; I% t3 M& A) s2 @9 v
$ ?& [ O4 J/ F* y- A% }( U/ \9 V // 波特率 115200 数据位 8 停止位 1 无校验位
( [; Q( s2 ^$ h# k1 X UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
" N& h, k! I( P b1 @& P
0 ^8 l' l# a- P; I4 G // 使能 UART1. g, }3 l2 L! B+ ~
UARTEnable(SOC_UART_1_REGS);
8 b# j4 Y3 u0 ` // 使能接收 / 发送 FIFO/ d/ L; m& X4 R) }6 r, z* G
UARTFIFOEnable(SOC_UART_1_REGS);
; V2 y1 c. J" b0 W, y // 设置 FIFO 级别
' z* ^" Y( ^% h# I UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
8 g. ]4 `8 o' g6 V9 l/ f) y6 o //Uart1中断使能' Q r+ @: g' b3 Z
unsigned int intFlags = 0;
9 w) f& K3 H6 }2 s5 H' z0 |. [8 E intFlags |= (UART_INT_LINE_STAT | \/ A$ ?) r0 L. h* p6 x, I/ m' K
UART_INT_TX_EMPTY | \% f2 W. |- e- V" r7 H* D
UART_INT_RXDATA_CTI);7 n! c6 C4 c7 L ~, e. u
: ?4 N2 F9 _0 u% t0 O- R
UARTIntEnable(SOC_UART_1_REGS, intFlags);
: B& U( ~; }/ `; K9 U9 @ A6 w}
- r$ N4 d+ H; d3 E1 K8 V" }//UART 中断服务函数( v6 X- p T/ {# C$ d$ c
void UARTIsr(UArg arg)3 `+ w' n2 c- \8 m1 r, K3 a* l
{
1 q* j. g7 o: h% p static unsigned int length = sizeof(Send);% {! S3 U0 c% z" m/ N9 H2 g
static unsigned int count = 0;- H' L3 V! Z# M" z G1 g
unsigned char rxData = 0;
( K* o' k* A: E' Y/ h9 p$ t0 Z7 A unsigned int int_id = 0;
5 B7 B" m5 ^3 S u* w2 P7 d // 确定中断源
) ~" u' j9 P7 Q: i+ I4 t int_id = UARTIntStatus(SOC_UART_1_REGS);4 P1 `: H' r6 H* M1 Z @. |
// 清除 UART1 系统中断; e% f: ~5 V e/ H6 |, Y7 s" G- W
IntEventClear(SYS_INT_UART1_INT);
0 b& i8 z; H0 D$ \ // 发送中断
2 G8 l8 U7 U2 @, r if(UART_INTID_TX_EMPTY == int_id)
; w& [8 X$ ?4 R6 ]7 g) w9 ] {! h: Q: ~ V4 v" T
if(0 < length)
& v1 g" p& l& O: w% g q {6 S# l0 y9 _. r! X& P0 e6 Y" A( c
// 写一个字节到 THR8 p5 L# L* s- B1 c
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
; v) j6 Z) n) |0 H9 m' C9 S. G length--;
& ~4 M! k/ N5 R count++;: _8 D8 V( {1 {, x; z, u
}$ n" @+ V$ v8 P' h! [ T) I
if(0 == length)
' P! I1 \$ N; s7 _3 t" V {. ~8 T, `6 ^( ], D
// 禁用发送中断
- L j7 V: ^2 C. ]; P( I1 Y- S UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
( [* S3 @$ c7 j1 k* G% ^' r0 ^ }% W5 M" ^: |& y$ u
}3 H2 g: ?- ?' N. x
// 接收中断/ N& y m# h; a3 g8 P1 m+ x; q6 n
if(UART_INTID_RX_DATA == int_id)
% n. y8 g, W$ U$ O {
_3 D# q2 O2 I9 A+ ^0 R5 ~ rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
. x0 z$ G/ k! k# Z/ V! D UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);% n( x- Q/ w; }' B2 z
}! z$ L+ ~& \- K( a
// 接收错误
7 y7 [( u( c% s% V. e* K/ u if(UART_INTID_RX_LINE_STAT == int_id)
* Z7 C2 _. {0 K, z3 x+ Z/ J {
! K* [/ V0 a1 Z& v( h" P5 m7 }! n while(UARTRxErrorGet(SOC_UART_1_REGS))( R: Z" e/ m/ S
{
% N4 P, e) U3 t // 从 RBR 读一个字节
4 B7 X( ^7 s" O3 j UARTCharGetNonBlocking(SOC_UART_1_REGS);7 Q2 b3 ?# f u8 a
}
$ i" C# ]* D! C5 a% P }8 F/ w6 K( _5 M1 W% ~8 Y( E( J- p
return;
! a7 H- f+ @, P$ v! |. H6 L}% X- f E. {& A1 O% P. y2 n
Int main()$ s4 W+ L; J6 |" x: l- y
{
5 k) @% F+ ]0 d. u4 S" |8 V, H2 | UARTconfig();//uart 配置
5 B( W" _5 T6 a Error_Block eb;
) u k/ F4 p+ g: S# X: ^' b- q, e System_printf("enter main()\n");
B/ Y1 K a7 H2 @" g Error_init(&eb);) X9 l) f. u, @/ o) z
// 动态创建硬件中断
3 Y! `2 L5 s1 m. j$ r* T4 F Hwi_Handle hwi1;
( x4 ~* u( q& h/ i) Q Hwi_Params hwiParams;& n4 T j, Q6 z( \
// 使用默认值初始化参数, }; s& N2 O7 H9 Z7 E
Hwi_Params_init(&hwiParams);% O9 b, f" R$ E9 c3 E; _9 u8 j
// 中断事件
& s5 ^5 Y [* K k2 I6 Z8 U& r0 u5 o hwiParams.eventId = SYS_INT_UART1_INT;: ?3 J! u& K/ N3 f' I
// 传递到中断服务函数的参数 f5 ~& F* h: M
hwiParams.arg = 0;1 z5 I: A& P$ F0 b3 W/ y% [- A
// 不允许该中断自身嵌套
& Y; z J3 o1 j, J S9 o hwiParams.maskSetting = Hwi_MaskingOption_SELF;
: v0 }5 K& t# W! q6 {. V // 使能中断
3 H1 B/ L- V9 c6 R; Z hwiParams.enableInt = true;% h0 C8 y5 b5 M) V
// 可屏蔽中断 4
) Q' m- X% @$ D x // 中断服务函数 hwiMain
, b+ x. u; w- z, A; @6 p hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
_& O/ Z, l% z5 n% f if (hwi1 == NULL)* k7 _- ]! P+ b
System_abort("Hwi1 create failed");
6 P; ], J) m, B5 v BIOS_start(); /* does not return */
! q! b0 I. F# B, Z/ i* X return(0);7 x0 }" y" B7 J, P
}
1 l# r! R4 `9 r8 T5 q; A1 ~& m' ?% N! I: ~1 N( U7 R- S+ O
|
|