|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下) E% Y# c! r+ O$ W! W
// 发送缓存
) N3 J2 ^. }/ s* zchar Send[] = "UART1 test......\n\r";# V$ ^! O( `* f3 x! s) K
$ D" |6 e, j4 i7 Cextern void UARTconfig()7 X" [% A# ~! a' p; T: O; Z( r
{
! u$ P+ u/ ?( B5 d4 Q/ @ //使能Uart1
- Z: u* n4 X: O; r ^+ a- j6 H PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);& q! K: @; s( P/ D: M
. q3 [1 G5 M' f& }0 O6 Q( n, B( o2 r( | // 使能 UART1禁用流控4 I" T4 a( d# ^! Z5 Y
UARTPinMuxSetup(1, 0);4 a$ } y! _& V' h3 a% v
& D& Q% b; z% q. g9 |
// 波特率 115200 数据位 8 停止位 1 无校验位9 u+ J7 q* @# k2 `' F7 H4 M
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ e# h* U6 X' G- K- N9 x' \
w' U/ d( f4 D. m. U5 O // 使能 UART15 z9 t; g$ G I7 c$ E. M8 X
UARTEnable(SOC_UART_1_REGS);
& I O7 ?4 Y% D1 }$ b; g // 使能接收 / 发送 FIFO S( A1 w' \* Y9 U4 Y' G& @
UARTFIFOEnable(SOC_UART_1_REGS);' m8 K! c2 [3 X6 c5 Q7 J
// 设置 FIFO 级别
& Z$ G+ w5 g2 X/ c `: N% z UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);' B# K! a9 P. F. Y8 P
//Uart1中断使能
3 d6 ` i) Y& K r( ?& n+ {" E unsigned int intFlags = 0;
. Y9 t4 B# q. [( x1 F6 R5 X7 E intFlags |= (UART_INT_LINE_STAT | \5 \7 P) X1 k+ \7 G B
UART_INT_TX_EMPTY | \
8 W0 q7 w* w6 w; { UART_INT_RXDATA_CTI);
9 \8 D: P# m% T5 Y
% x! K2 w2 n, {. J UARTIntEnable(SOC_UART_1_REGS, intFlags);- i: b4 d. l& ~9 I
}
$ l/ o, B" A: @* Q! z7 G- I//UART 中断服务函数& V! x; K0 z1 k% y( B* k+ c8 o. E
void UARTIsr(UArg arg)) O4 {% ]5 D' ^7 I) I1 ?
{2 X4 W; d, R1 N" W3 Q8 W/ u
static unsigned int length = sizeof(Send); l6 L @2 E2 X/ i
static unsigned int count = 0;0 @' [ g1 [9 f3 \
unsigned char rxData = 0;: g1 j' V# k: k% H$ X
unsigned int int_id = 0;5 ~/ Y I' k% ?0 Q8 O7 W) \7 V
// 确定中断源
$ R+ W. r% W& O, L: Q+ ?* {, ?5 Y int_id = UARTIntStatus(SOC_UART_1_REGS);
% ~" ~) e7 S6 C* s7 E$ C // 清除 UART1 系统中断, i8 G; o2 t0 j* m( G
IntEventClear(SYS_INT_UART1_INT);
/ F }6 V8 K5 [ // 发送中断0 P l) k' j9 e' T( M4 p$ L7 w
if(UART_INTID_TX_EMPTY == int_id)
) s! s4 f$ I# o {
) _$ I) u7 @' U% j if(0 < length)2 |& K9 u5 F J0 _& d
{( k; r6 d9 \- s* K* x, }' }
// 写一个字节到 THR% o8 Z% o8 F4 b" n
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);% ~$ b, M" i3 e2 Z* Z$ S
length--;& }9 R) ? b6 d' V
count++;* X5 t5 T8 X: O& [
}+ E/ E) L9 Y7 X& n; u5 ^9 d& d: D
if(0 == length); i) c1 v+ G p, `3 T1 Y
{# f0 D, e- q7 G E2 }* j6 v, b
// 禁用发送中断3 W: u v+ L T( G- A
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
: b0 x+ U+ C) q5 { }
, A2 ^1 F! r n; L }
, k0 q4 v+ J7 f$ o // 接收中断% C ^7 ^5 }8 `
if(UART_INTID_RX_DATA == int_id)
$ |8 h/ h: ^, j- C4 Q" } {
Q* `9 |4 {0 Q+ O0 x3 j& q4 W0 u) s rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);6 ^! x* {2 p3 r/ U- v
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
6 t2 [: @% P" N: f }9 A& F |# Z0 f8 ^; X h
// 接收错误+ \8 M8 h1 c2 l' g2 p6 ?' f+ v
if(UART_INTID_RX_LINE_STAT == int_id)2 A: ~0 w4 s9 i# P- I) x" e
{
' Z" p& F, }5 I& v1 v while(UARTRxErrorGet(SOC_UART_1_REGS))
( I8 C$ `$ O% O1 U' @& a {
/ }( i0 t) t4 {/ \; c) w: R // 从 RBR 读一个字节
1 n* S4 I- j% @6 \9 J9 n UARTCharGetNonBlocking(SOC_UART_1_REGS);/ G3 P$ g& v3 k5 ^7 S1 a
}+ O7 [5 \& R# B+ e- Z
}7 R$ q" K5 v$ z7 G% ^2 A+ e
return;9 I5 N u: f3 N8 c
}: h6 d" w9 _6 m
Int main()' Y: C9 p5 E5 j; K! g* T( r9 }
{
/ U8 u; {' D4 p7 k2 z% S UARTconfig();//uart 配置
/ ~- |) k/ {1 d+ \5 g9 a% g3 p% Z Error_Block eb;3 ^) ?. W0 ^7 x( E6 F! o5 {/ r7 q* R
System_printf("enter main()\n");4 V( F( w7 O$ E. I9 K
Error_init(&eb);
( ? C$ a( N- ?+ B, Q; F/ [% p8 Q3 b // 动态创建硬件中断
6 {- b3 Y/ y. T& }2 F. ~ Hwi_Handle hwi1;
1 I' p' D7 p; t Hwi_Params hwiParams;
, ]+ i& ], h0 g. P) I // 使用默认值初始化参数5 y; r' K( N* c& U( s9 [8 \( j9 A1 w2 y
Hwi_Params_init(&hwiParams);7 E, h0 ~; X7 m- g/ L
// 中断事件
7 U' X" }6 |2 Q K2 l2 F* t1 O hwiParams.eventId = SYS_INT_UART1_INT;! k( A' m( P2 Z# M2 k
// 传递到中断服务函数的参数% V! f! p& j+ V+ L9 N- `
hwiParams.arg = 0;
- W6 p- q! `0 W# s8 T& I2 b // 不允许该中断自身嵌套
: b) ], {1 C% @. n F; p hwiParams.maskSetting = Hwi_MaskingOption_SELF;
) u7 {8 w# g) s // 使能中断1 L+ F% a M1 ]$ E
hwiParams.enableInt = true;
: m' M) q4 k1 L# d // 可屏蔽中断 4
- I* D6 b2 l" P) R // 中断服务函数 hwiMain( _7 r( t t( J- O& L
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
5 P3 ?3 z, N2 l$ n. C" Y8 \ if (hwi1 == NULL)5 [7 e1 Z6 r1 |! e: q( X- E
System_abort("Hwi1 create failed");. J- ]) x- l$ _0 {! |
BIOS_start(); /* does not return */1 L. \9 K+ T# k3 P; n# @1 s* ]4 p: F
return(0);
: Q; @/ _; `+ j* i% ]! V( X}! i7 m/ E4 Y+ y0 W+ H$ |
, K! {* U8 {0 J# a |
|