嵌入式开发者社区
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
[打印本页]
作者:
Greatwang
时间:
2014-12-1 14:52
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
5 F& o; `+ f E6 i, x% t: n
// 发送缓存
; {, ~4 ]) M- \
char Send[] = "UART1 test......\n\r";
% z& i8 M! r% {: J$ n
, o4 T9 e) M0 t. m3 E0 n$ y
extern void UARTconfig()
0 q4 \, |7 C+ V! f; g, ~- Q) z
{
& f' W- E% l' _1 e
//使能Uart1
- Z9 K" ?2 R' X
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, F: P7 q( q0 a4 p5 n/ k' S9 P
) b- Z- P ]# V. y7 }" i9 Q i/ U
// 使能 UART1禁用流控
: i* n# I7 K+ b! A0 O4 q% _
UARTPinMuxSetup(1, 0);
9 }7 q- g( j& h$ S1 X
$ t# l. x$ {8 H2 [* I; ^* P! x
// 波特率 115200 数据位 8 停止位 1 无校验位
5 s% m: J* s" O- P/ l
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
) v$ `* F) ]: h6 z1 O
) f! V4 M8 V9 f8 a2 b {, I, t7 @; \
// 使能 UART1
' r. D( u r' f k/ ?4 p' u
UARTEnable(SOC_UART_1_REGS);
2 L% \: v% R# C9 L2 ?
// 使能接收 / 发送 FIFO
# i' A: m v/ i+ D! ^4 Q8 d1 x" g' J
UARTFIFOEnable(SOC_UART_1_REGS);
# @. g( E7 [1 v* s- K6 I: q
// 设置 FIFO 级别
: m9 v, b# H2 Y* x# O6 @# K
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
9 L2 V/ l( S5 S" J. j+ n
//Uart1中断使能
4 l$ B2 F4 ^7 h, d5 N8 |* ~" Q' q, `
unsigned int intFlags = 0;
8 i5 {$ r4 X3 D2 l/ N/ z$ r* `
intFlags |= (UART_INT_LINE_STAT | \
& B M; C. W7 p9 r# O
UART_INT_TX_EMPTY | \
0 b2 t( q8 H2 a G2 ~2 N3 y1 p
UART_INT_RXDATA_CTI);
* A# n" K1 M& A) V& C
* ?, q& N# p" V2 O9 k
UARTIntEnable(SOC_UART_1_REGS, intFlags);
6 y4 b0 _$ C( Z9 H* u
}
! z' Q# A+ i: \, ^1 s, o
//UART 中断服务函数
: {( Q$ n5 {3 i" I% G
void UARTIsr(UArg arg)
+ \+ g( C, n" r9 v4 V& B; O n
{
5 k$ \! e% e4 b. h/ g
static unsigned int length = sizeof(Send);
( M1 \9 J& A, L2 o1 D
static unsigned int count = 0;
- u9 L5 T) M5 P
unsigned char rxData = 0;
# c9 V7 D6 ~& D/ j
unsigned int int_id = 0;
6 S! H: }+ F U3 Y# d
// 确定中断源
% m6 Z9 Z$ ~8 c# `' |
int_id = UARTIntStatus(SOC_UART_1_REGS);
. }% L$ g9 I# |& E7 \! O% m
// 清除 UART1 系统中断
+ r# @+ i- L$ G, X0 O) F$ |
IntEventClear(SYS_INT_UART1_INT);
4 K5 J$ ? m% v4 C; q
// 发送中断
7 v' P9 Q* k" M0 c
if(UART_INTID_TX_EMPTY == int_id)
; c+ W& G; ?6 h9 f2 A
{
8 I/ u, E/ ~8 u+ U+ Z! V
if(0 < length)
* w4 s# M$ w6 W5 g4 f, D" b |
{
" W- r; ~' o, }+ k; C
// 写一个字节到 THR
) p% M* G. U" `, i, c: b
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
. a* N4 s( b; @: F/ Z6 O5 @% ]
length--;
0 ]% v9 k+ G1 ^0 K% N
count++;
: C' Z/ u; k4 _
}
0 X; e6 M7 x( t* T
if(0 == length)
: Z; X/ ]' P8 S4 x* Z; V
{
) z& U/ g: q6 U9 Y8 `, H; _
// 禁用发送中断
7 P5 ?8 `" g* Q8 o! o- g
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
) b, G% X6 O) O3 C
}
- x0 Y" Y2 u6 B+ j; } ?4 N" b7 l
}
! ?; X$ B$ b8 }
// 接收中断
- l9 X/ m3 ~' I" @) z. A& U* R* |
if(UART_INTID_RX_DATA == int_id)
: b( [# }- m- z
{
, g, j: H% |3 y4 J- x
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
' ?. n$ u+ z$ l- C3 L4 W
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
- F( Y* X+ T \6 W& J
}
- g4 x) J# W4 u9 ~( V1 G! t) T
// 接收错误
& O, A7 k4 u; Q* _$ \% p7 y
if(UART_INTID_RX_LINE_STAT == int_id)
+ _3 ?0 f" C' r u: o3 [
{
+ f1 T- V" k6 c& I
while(UARTRxErrorGet(SOC_UART_1_REGS))
2 \3 S3 O% p3 R' @5 C
{
1 _/ ?4 Y* b- L% `" h4 X6 U" w E
// 从 RBR 读一个字节
7 q' H' w! X4 _
UARTCharGetNonBlocking(SOC_UART_1_REGS);
" b0 y0 a- u7 r. z% l& ]( ?0 g
}
, O. Z) Z3 y; [+ e/ c4 y
}
2 b% [/ J* u: f
return;
* u) v- v4 c! I0 @6 Z$ [" _
}
$ q+ d6 }4 `% B8 l
Int main()
" q3 ]) T# P/ M) w; c" Q
{
- v4 m3 M& `% n
UARTconfig();//uart 配置
' L: z; {; k! e9 S( P* Q
Error_Block eb;
6 r5 |+ {1 ~5 s1 K& H- ~$ ?
System_printf("enter main()\n");
9 s2 ]0 M$ u# p" F# B e8 F3 w# V
Error_init(&eb);
0 y7 G) g% E8 M$ O ^
// 动态创建硬件中断
$ ]! ~1 E# h/ @& |
Hwi_Handle hwi1;
+ w) F0 c6 t) a. P
Hwi_Params hwiParams;
5 D* A( G& S! S. @
// 使用默认值初始化参数
8 V$ L, }* Q. L' S
Hwi_Params_init(&hwiParams);
8 p. r) X: G c) Z/ p' ]
// 中断事件
4 s% `, J: }! a
hwiParams.eventId = SYS_INT_UART1_INT;
( f" S. K% C% k. K7 \
// 传递到中断服务函数的参数
o/ _( F& y( D" L5 ?0 W1 e
hwiParams.arg = 0;
4 p. r' \5 c) v2 @3 {3 K
// 不允许该中断自身嵌套
7 b- M7 D, w& X% g7 ]4 y% [
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
/ g6 J) q. U/ {4 t' T
// 使能中断
: V4 U% d+ [9 @( y$ R
hwiParams.enableInt = true;
6 Y3 L( r; `; |/ }
// 可屏蔽中断 4
* I( U) F$ e( W% h
// 中断服务函数 hwiMain
: k1 ]' D7 F7 b0 t; J5 l6 U7 D7 i4 D
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
6 Z9 [: g6 C" s
if (hwi1 == NULL)
; U3 n+ [9 F6 B. y0 @
System_abort("Hwi1 create failed");
5 }' j' m1 @; k
BIOS_start(); /* does not return */
, B; g. P5 N5 s) y1 l, j: k
return(0);
% g( b u4 Q+ a" d
}
z# Q( A9 ^* l
" _( `, p; E; {" f8 E
作者:
希望缄默
时间:
2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
/ j& b8 }- z) w( \" U1 ]+ [
作者:
Greatwang
时间:
2014-12-1 21:49
在中断服务函数里放置断点
' ]5 w% A7 ?9 q5 g# ^6 H
作者:
希望缄默
时间:
2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
?4 m1 Y3 J& w# O! o4 ]
在中断服务函数里放置断点
$ G; U6 t P- M. m# Q0 R6 b8 `
参考 GPIO_KEY
0 p) i* m$ }! m& u V- R
作者:
cchwhk
时间:
2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4