|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
( s* C7 m3 I) i' |9 I// 发送缓存+ @# b5 B) ]" P" z+ ]
char Send[] = "UART1 test......\n\r";$ }% c% Y* f, M, ?
) Y5 Z2 h; H' Hextern void UARTconfig()
& W: p5 P9 b% `$ \3 T% I0 ~{
% ~4 ]/ q2 t% ] //使能Uart1; N8 l, q: s7 i% v
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- R9 A4 R$ V" E! u U' ]9 ]5 A- C {8 ^/ ?% [6 b( o
// 使能 UART1禁用流控
- D ^) y) x! I _6 @; Q# L UARTPinMuxSetup(1, 0);- t* E) I0 x) m" Y. y1 @9 I, w
& ]7 V! M' I6 U/ R. o' {; }
// 波特率 115200 数据位 8 停止位 1 无校验位3 {. I$ Q1 S1 j0 P. a
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
5 e) V1 c8 ]' X: K) L6 G3 _8 S2 I. r
9 V' g! y) ?' z q% @: b // 使能 UART1
1 t# _! m" f( ^2 ]. K# t UARTEnable(SOC_UART_1_REGS);
1 S+ p7 k4 g1 l0 Y8 A( u" E // 使能接收 / 发送 FIFO* b" f; K: @7 a% ]/ Z" G
UARTFIFOEnable(SOC_UART_1_REGS);' o( g M: D8 ^1 V8 j+ E
// 设置 FIFO 级别# W7 g8 F7 [8 m+ e; G4 {; p( M
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);2 N1 U: z) I# N+ E- O v$ a8 A$ d0 C
//Uart1中断使能
! I2 r2 A' Z( f+ z, a8 k unsigned int intFlags = 0;8 c1 F4 m: j) i+ p
intFlags |= (UART_INT_LINE_STAT | \
6 \3 Q. {% G( v4 q" i% S UART_INT_TX_EMPTY | \
# Z2 {5 X" X# ] UART_INT_RXDATA_CTI);
. H. }% K; Y' S & S/ T9 B, b1 M! _/ } A
UARTIntEnable(SOC_UART_1_REGS, intFlags);3 w9 L7 L+ Z( a, M
}
! q3 Q: F( c' k1 u; ?% v//UART 中断服务函数
! ^3 j' | Y. S0 }# ^, Xvoid UARTIsr(UArg arg)- h; x' S) c. J+ I& y5 S
{
6 u/ j; P0 H' C- I static unsigned int length = sizeof(Send);
1 b/ L1 i" H) J. _! E! y static unsigned int count = 0;
4 i7 P- A0 {' i& M/ N unsigned char rxData = 0;
6 O# I2 k$ U3 T# I6 V+ @ unsigned int int_id = 0;
+ n+ L( R/ @# A // 确定中断源6 y( Y8 q! p) h
int_id = UARTIntStatus(SOC_UART_1_REGS);- ^! h$ y+ K( t4 h5 {
// 清除 UART1 系统中断
) Z- l% Y; j# m, ?- E1 z IntEventClear(SYS_INT_UART1_INT);+ H) a6 I9 X, a# c% z% ~2 p
// 发送中断
Q v( S* d( }( q% h0 B if(UART_INTID_TX_EMPTY == int_id)2 A" [* P# C' l/ A
{: y+ C& X& W" v8 c' W% @" o# C) b0 u
if(0 < length) u4 v2 g6 @- P% z( f9 d7 `# F7 [+ ^
{
8 f& g2 M& V6 E3 b; R0 d // 写一个字节到 THR! x- _. s& z$ U0 i$ Z$ E/ v
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
R u: c2 C) S length--;% W# [9 E8 k4 t; G4 R7 d8 M$ i n0 K
count++;
2 n) x" o- c" t4 a: J/ D }
! x9 U2 j# I" J' J0 O1 d8 ^ if(0 == length)
6 G! ?9 C9 M) S8 \9 a. U {
/ t5 e2 Q, d; D# e0 C // 禁用发送中断+ I" o1 U* [! _5 E% y4 w2 R$ W
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);( w2 o6 }. M) G0 O& H8 Y% d' A) A x
}9 N4 W! z. m% r; q" l9 J7 a% _
}# J5 U8 A0 `2 O3 [
// 接收中断
# ]+ z/ V3 n" J: z0 |5 m9 L if(UART_INTID_RX_DATA == int_id)
$ l2 R1 K7 E' x {' ]2 e$ r8 Q% L
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
" j: X4 l" N- Y9 v/ Y1 b UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);5 }! }% ?# J. g- \
}3 d) n( M6 t7 X: U
// 接收错误: t- o9 v/ @+ x# O1 q
if(UART_INTID_RX_LINE_STAT == int_id)- F' n0 R! T3 T7 z4 r
{5 I% b: s/ w" L1 Y7 A9 K) B
while(UARTRxErrorGet(SOC_UART_1_REGS))
5 T# e. O+ `9 ^' ~+ b& i: E {' `) v3 U# A; j. i6 H; f
// 从 RBR 读一个字节
6 [# K/ Y7 N9 [' ~ UARTCharGetNonBlocking(SOC_UART_1_REGS);
9 V! ^% Q1 n/ n4 _ d }
- \# b# o; O7 A) b# ]! n }
; I2 D/ R1 c- { return;4 u0 g: m6 ^/ q- y! |) i1 Y
}
4 B6 Q0 g- z4 F0 ZInt main()
; B9 P; Y4 ]0 Z9 D0 i; `{
3 z: ]* u9 }; d. i UARTconfig();//uart 配置, U% ]1 |8 L# E# d B+ ], q( Z
Error_Block eb;
+ y' _: S. U7 {6 y System_printf("enter main()\n");1 G; r/ O5 m' q2 c
Error_init(&eb);
0 `/ j j, A" L6 C // 动态创建硬件中断
5 B2 S% U/ l# M) t, S+ H f Hwi_Handle hwi1;" k6 Z" B$ F* P$ D
Hwi_Params hwiParams;3 S5 F4 {* S( N Y4 Z* S
// 使用默认值初始化参数
% U' o3 M; g2 P Hwi_Params_init(&hwiParams);
+ k2 E, ?) p6 `% P- \, ?- t // 中断事件1 E3 X2 k) r+ U. H7 p7 D( u
hwiParams.eventId = SYS_INT_UART1_INT;
6 O# T/ G: Z" c; r. I. ^7 T9 S // 传递到中断服务函数的参数2 M9 F) E. _$ ?- C5 L+ G
hwiParams.arg = 0;
- ]4 U7 B( f; z) e( I* r! c // 不允许该中断自身嵌套
, p+ D8 [' e; c' o hwiParams.maskSetting = Hwi_MaskingOption_SELF;
" g2 p# ~6 q o2 U( V5 p! C( [. Z // 使能中断: _; ^' m% b( ^" {7 k9 }
hwiParams.enableInt = true;9 R/ _9 X% W& s: F2 H
// 可屏蔽中断 49 `- A+ _+ N P ?9 W; S# P
// 中断服务函数 hwiMain
f9 Y/ B3 c0 n- I- p hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
& `) u) K+ j1 o1 _6 f if (hwi1 == NULL)
6 ~* n: t! c# b5 s( F1 N3 U System_abort("Hwi1 create failed");2 C; ]9 `& W h. l- N) }
BIOS_start(); /* does not return */
, p# ^# }0 e8 t$ H. r" b' C- l8 F' M return(0);
. P, j |9 e* v, [% B( o! F! C. R}
4 l+ s4 I5 N, H& T: H
0 I' N( X4 k' w1 g" M1 s |
|