|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
# y8 j/ n' v% _1 G1 w0 H// 发送缓存
4 @6 ` z7 v% [5 _) f9 l& g1 Nchar Send[] = "UART1 test......\n\r";" N: v. ?; w. L) v6 W3 {! p; o. F
9 W4 q. x3 D' h9 g% W: M* Hextern void UARTconfig()
, d4 b: G. n* _$ V* K. v0 K{
* N* O. ]- [4 I9 ? //使能Uart1
: ?5 A# \( B- o" H) g( N& M( z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);1 p2 K3 g$ D1 u% r
( e) u; ]# @& g; X9 W- |% K // 使能 UART1禁用流控
+ _9 E$ S: K* o i: z+ ` UARTPinMuxSetup(1, 0);; |6 P+ }" C0 A% E" V
( b, |4 y+ n2 @. T/ H) j0 h // 波特率 115200 数据位 8 停止位 1 无校验位2 U$ m) \6 R2 v" [$ ]# R! v/ N0 E
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);- V) D/ ^0 c) x
/ m% G$ E* g6 Q5 c# U% A& t
// 使能 UART1
. a9 |8 \ `0 E' X" s! o UARTEnable(SOC_UART_1_REGS); ~ [ Q# T+ M* \) P
// 使能接收 / 发送 FIFO
; A) u" N2 ?* E+ j# h# [ UARTFIFOEnable(SOC_UART_1_REGS);* [- F, {5 r/ \( G. L
// 设置 FIFO 级别3 ?& S Q) N1 r
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);* l* G9 T* x' u4 d
//Uart1中断使能
$ { W+ L& E. K3 K# V* l, ?, g unsigned int intFlags = 0;
$ ^* C; U: x4 _0 _& S) v" v8 l intFlags |= (UART_INT_LINE_STAT | \
3 G. f9 R% l9 x* C" D7 ?2 @$ k9 l UART_INT_TX_EMPTY | \; c/ a9 [. d/ R( z' i* ^+ J6 S
UART_INT_RXDATA_CTI);
: d. u) k" K4 D
% [$ g3 t4 A- ?' z7 d' E UARTIntEnable(SOC_UART_1_REGS, intFlags);
( T W! |- A6 @+ G9 e}
6 P% f( S' Q1 i8 `) s: y2 V, [7 x( p//UART 中断服务函数
* x' s3 X: G6 u) dvoid UARTIsr(UArg arg)* x0 a/ R" J; ~& _+ J; }0 M
{4 l; G- _ B' o# K+ z; q1 P- c
static unsigned int length = sizeof(Send);
# U2 n4 v: y$ I6 r9 F& \2 c static unsigned int count = 0;
; I/ |$ B' J( w! Y% _ unsigned char rxData = 0;
, R8 v h6 `, A2 n; A unsigned int int_id = 0;
+ H) D: A0 n7 Y) y! M4 |* d // 确定中断源; Q# R+ w7 ^$ A* |% n$ k% O0 H
int_id = UARTIntStatus(SOC_UART_1_REGS);
* Y" A3 S) r5 L t; l: S& \ // 清除 UART1 系统中断
+ n9 q; g/ H& Q, T2 Z IntEventClear(SYS_INT_UART1_INT); y1 B9 i2 x& t' l8 Y, [
// 发送中断
. h7 B: \+ `6 w3 o if(UART_INTID_TX_EMPTY == int_id)+ U8 a8 n' e9 X: j( ?
{2 ?# C- W) Y, n, M$ ^% v5 B
if(0 < length); b% i+ u0 m. n( C! J( J& `
{
1 @$ f! d4 I. r2 B* d3 g1 I. Z9 Y // 写一个字节到 THR/ ]) [/ A) E" n. L3 @) H/ _5 _) k+ x
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);% h* m8 u$ p, n1 g4 U
length--;
/ U) Y/ P+ o* [2 ?) N count++;( k/ D" s- G/ |! F6 V
}: U& p0 N9 i$ V4 T* n1 o
if(0 == length)
. i/ s0 r; `" z* j- }, M; g8 A9 Q6 W {
, ]) @. a; d5 U7 a! b t // 禁用发送中断" H5 q q$ k2 u3 f+ C. b6 G2 W5 P( P
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
9 i! X0 `% T4 Z% E+ k }
# z- U. Q- B( J7 ]* _. ? }
; m5 G! y+ G7 X7 { // 接收中断6 g( h4 z3 D7 H! p% B: T+ E
if(UART_INTID_RX_DATA == int_id)
) G4 I5 o" f4 K$ P! Q {8 D( }9 j0 T/ ~: B6 F. u
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);/ X5 E# j, d6 l3 [" E3 f2 T4 \
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
) z: ?6 s/ i U4 W; J- g4 r6 A }
* X7 s2 w: d& I // 接收错误
4 O3 R2 O+ j! f) c if(UART_INTID_RX_LINE_STAT == int_id)
+ n: u3 F# Y. H {
; R( _4 M2 f$ U1 a. W1 h8 [' [2 Z while(UARTRxErrorGet(SOC_UART_1_REGS))
6 D3 A# U) P; n! k) T9 N {
8 ^+ W. m; `2 Q0 X7 a // 从 RBR 读一个字节3 Q5 Z3 x: P6 h" v
UARTCharGetNonBlocking(SOC_UART_1_REGS);9 x& x* D8 n0 W" V; d! X1 Y
}! N" Q) V. q$ _* r
}
% l% F9 ~& |. w return;7 ^( n. g1 M T% T) j
}' M, R" k' R) T. B6 F
Int main()( H7 q% P, y( I) d0 K: I3 X1 T% @
{
: O( C3 c! W% p3 ` \# n: R UARTconfig();//uart 配置
8 H; x/ H( D5 b8 p Error_Block eb;
3 t' k/ K, C0 W6 P$ I; _: h4 y System_printf("enter main()\n");" S4 q/ {' H, i0 d
Error_init(&eb);
9 d0 V6 Y& {# Y // 动态创建硬件中断
! ]4 c2 l" ?& V Hwi_Handle hwi1;* r' q/ k- m! T7 \$ M
Hwi_Params hwiParams; Q4 \ @' }2 z' M1 E
// 使用默认值初始化参数
; ~; a @& }* O- {4 l( ^- y* \ Hwi_Params_init(&hwiParams);
! I/ F1 a8 n2 a2 T // 中断事件0 d0 ~1 l$ D+ d% C3 S* ~1 o
hwiParams.eventId = SYS_INT_UART1_INT;1 x1 s, b. E" w# A' g
// 传递到中断服务函数的参数 |9 ~8 f& O) j
hwiParams.arg = 0;- O& M E2 v0 y- k5 t: W
// 不允许该中断自身嵌套
7 C' R4 t. G5 c5 A3 E& I1 C hwiParams.maskSetting = Hwi_MaskingOption_SELF;
& b" ~0 ^7 x5 s% |; Q5 Z* O // 使能中断
5 _ |1 M& [1 o hwiParams.enableInt = true;
$ l/ m0 J9 ^ N* @' v3 D // 可屏蔽中断 4
3 d" u R# B8 g" Q. S# x // 中断服务函数 hwiMain1 B# `4 P" r& c Y8 q* b1 O0 F$ A
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);2 X/ |0 \: g$ }
if (hwi1 == NULL)
, a, o% S# Z7 c; |* d" Z System_abort("Hwi1 create failed");
* P8 G% F+ ]1 f E BIOS_start(); /* does not return */
+ Y& t3 Y& d# ? return(0);# q) l2 }( ~/ a7 E( ~- K" U
}
8 n/ }3 v( W) Y4 T0 B- ` z9 A0 s5 e S, w i% Z
|
|