|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
) \6 o3 V- O3 V8 `: \: l// 发送缓存
2 m9 ]7 T' x" C' r6 w9 [6 ~char Send[] = "UART1 test......\n\r";* ]* \' R" r/ \; y0 S; M
- i: L( L5 F) m( y
extern void UARTconfig()! C2 \$ }" s$ h8 ]% g+ D
{
7 i* o( B' S& j* }7 U //使能Uart1
5 ~" M6 j5 D5 _ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& w5 C5 _, j0 Y# ~2 c; K; P. Y" O * h8 S: n! @5 W: M# t
// 使能 UART1禁用流控 H5 u( Z. b" K$ W: S: T% h2 J
UARTPinMuxSetup(1, 0); I/ U; x5 q9 z- e$ y0 N* M W9 p
. E! s$ L- x$ A( G" ] // 波特率 115200 数据位 8 停止位 1 无校验位3 |4 x+ A& ?' I p
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
n) B- c, V G3 q( N
6 p' E: | Q. T# ]$ m) e- p& y // 使能 UART1
9 J* s; J$ { p* T' m UARTEnable(SOC_UART_1_REGS);
' M% e i7 a7 X Q9 ?$ p+ }! e( z // 使能接收 / 发送 FIFO
9 g+ L3 {+ {' F2 N l& M/ F UARTFIFOEnable(SOC_UART_1_REGS);
# E0 x0 J4 O; a8 d // 设置 FIFO 级别
& ?& a6 W9 Z( D' U UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);, X N' F7 ~ p n6 k( V+ F
//Uart1中断使能
- O) s9 @$ z8 P& i3 a unsigned int intFlags = 0;% c; |- k5 z# v- q; h! V
intFlags |= (UART_INT_LINE_STAT | \
9 A! h# F' n" o% _0 D UART_INT_TX_EMPTY | \" T$ ~/ V f Q
UART_INT_RXDATA_CTI);
0 K2 o3 y" H( J: Y. Z( K 2 U) Q/ N O7 A5 Z1 Z% r4 _9 \
UARTIntEnable(SOC_UART_1_REGS, intFlags);5 j9 P) b9 S3 D3 B
}( d4 i, `$ C! W
//UART 中断服务函数/ S1 G. ^) ~% L% I1 {
void UARTIsr(UArg arg)) w% s' Y" p, i
{
% J: r7 Y( k- q8 s9 x static unsigned int length = sizeof(Send);
9 V7 f9 s$ ^$ v: e8 _) }% P& z static unsigned int count = 0;" [8 k% j/ k E1 i$ T" p m* K
unsigned char rxData = 0;: d$ x- P, d& o4 d) y! i& W1 {
unsigned int int_id = 0;
/ K+ P& F* P4 H( r1 \3 r0 K+ N/ B // 确定中断源4 d# u/ K1 t. y$ S9 x
int_id = UARTIntStatus(SOC_UART_1_REGS);
) c1 w/ g; g5 ^4 V // 清除 UART1 系统中断
: z* S1 O& \ \7 ^9 F% |% B3 w IntEventClear(SYS_INT_UART1_INT);
! N4 H* d5 T4 Q a4 |3 g; K // 发送中断
% i5 d; z5 b! ]8 v( g* M if(UART_INTID_TX_EMPTY == int_id)4 C3 _. H% f$ ]% T+ v8 p) K8 F1 ^
{
# p& u, ^) u- _2 r Y" C4 S+ L" c7 Z" w if(0 < length)7 a7 M# ]$ b- H* Z, J/ h
{
% ^3 X; m- x5 U$ N2 w7 ^ // 写一个字节到 THR
: Z2 R+ i4 x, D! o+ u" @- e1 b2 j UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);7 v3 X t6 u6 d! h0 U( I3 T# Q
length--;, Y, `1 P; [% b
count++;
2 |: z I2 `1 q }
+ W% n% @! j c' a# y% a8 |; P u4 B if(0 == length)
7 T1 Q+ O# }) A3 e% w {* X0 z4 O2 l9 P1 W( N; a) j5 }4 G4 S
// 禁用发送中断1 e' m5 o. |2 j* Q9 z- V5 R
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);, h# c! P2 z9 w/ c m
} A: Q6 e8 \& B; \& H. N
}! w4 j" u8 `: m [2 n9 e* Z
// 接收中断 m. V7 @/ z5 I3 x8 r
if(UART_INTID_RX_DATA == int_id)4 |. d; ]" z: _0 ~7 a/ E1 M
{
% r6 [8 T0 r8 B4 y+ B7 G rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);# a: J5 T' U% Z) S% x$ a( h
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);% }: K6 A" l4 b# \" U! d
}
/ ~; v, w8 b9 o // 接收错误* |" g/ `# `6 T) ~( N
if(UART_INTID_RX_LINE_STAT == int_id)
1 D# H* U- \. }. ^ {6 n( y! j/ n ^5 @4 C; n- U
while(UARTRxErrorGet(SOC_UART_1_REGS))" N8 ~" S" n. A7 h2 L* M( r
{ P- Z* v: N& g! Q1 H; ]" }
// 从 RBR 读一个字节/ {8 y0 z' p! a9 ~6 P' h5 ]
UARTCharGetNonBlocking(SOC_UART_1_REGS);- J1 G+ h5 x3 m. c# i- Y
}, v* q4 L+ t/ Q; O3 ]
}
3 e0 D& z( C* x& o( s return;; z% {: @3 ~" y# k' Z- k
}8 j9 W" g, q1 @* t0 q
Int main()& }# e8 I5 a9 S) D4 @. v
{
5 v, P/ t* [* s1 m( L' y UARTconfig();//uart 配置
3 T$ Z# z8 r" T: D5 @; l; \ Error_Block eb;
4 l& t4 |; J6 C8 m- o" r6 r P System_printf("enter main()\n");
0 `" k1 s) M) Z+ Y2 D' [ Error_init(&eb);/ e* Z: q. R% L) J$ L7 P
// 动态创建硬件中断
4 K/ V/ m. i: ?* { Hwi_Handle hwi1;
3 m. Q; | ~' o/ ~ Hwi_Params hwiParams;; c. T5 I% N" b! `7 G
// 使用默认值初始化参数
, s( W5 {5 o }2 r" h7 h Hwi_Params_init(&hwiParams);3 Z7 ?6 Y; j1 u9 F8 W i: f
// 中断事件
: m$ k O8 a8 V- r hwiParams.eventId = SYS_INT_UART1_INT;9 T) `5 j$ n: F: J, z+ ]1 n
// 传递到中断服务函数的参数. }: v4 ^8 E/ A( g; R! e: {7 Y. i
hwiParams.arg = 0;+ `9 a% v9 r" Q8 e7 E3 }; t
// 不允许该中断自身嵌套
6 Y/ m4 l) J. |* s hwiParams.maskSetting = Hwi_MaskingOption_SELF;
( g% l& V! e7 ]( o* U* t // 使能中断
" e& O2 y, e6 u hwiParams.enableInt = true;
' z% d# X, ?' {5 p# r2 v7 D // 可屏蔽中断 4' l+ e5 G; r# `" Y5 R( L2 B/ @
// 中断服务函数 hwiMain9 u4 `+ \/ e7 V
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
0 p, O3 C) a! P i. o% m4 ` if (hwi1 == NULL)! c- z5 m# S i/ G7 p! a* H3 K
System_abort("Hwi1 create failed");
" x+ | G# }, D1 }1 \2 ^# D9 O BIOS_start(); /* does not return */
3 S5 ^& ]2 ]5 s return(0);
5 {, {" {) w% D* i# _}7 i. v& Q# O% P2 V- G! p' ^) C
6 A+ B- ]0 G# b4 h: }; [: U* z
|
|