嵌入式开发者社区
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
[打印本页]
作者:
Greatwang
时间:
2014-12-1 14:52
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
3 p, z, d( u/ I5 d Q) ^+ b& d
// 发送缓存
1 W9 E, ~; k9 b! O, n# r
char Send[] = "UART1 test......\n\r";
4 |' [5 b+ G2 J) Y5 u. ?7 p M0 ]& J
7 M8 Y4 a. A2 ~( h( C9 l
extern void UARTconfig()
$ V% i% I# X( k( E- p
{
( G9 r* X+ g# B1 I/ I b! x9 j
//使能Uart1
# P4 P7 w8 c& i
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
& `3 O- g: `% J
! K! y. }$ x4 G P' e
// 使能 UART1禁用流控
0 ~; ?+ Y/ @2 _ J J$ b6 q7 t
UARTPinMuxSetup(1, 0);
X; ? D6 S( T/ a- G$ g0 m( O8 \
! ^# m9 M4 o; I
// 波特率 115200 数据位 8 停止位 1 无校验位
) b. z4 R _0 `9 D. F
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
/ O S) u; p9 h9 h _, w0 J g5 m6 l
( F; z+ g/ z% P _% r. f5 N6 @
// 使能 UART1
8 L) t* f2 I7 d2 {1 g
UARTEnable(SOC_UART_1_REGS);
/ u7 L% V% T0 B5 J- {# v. S) G
// 使能接收 / 发送 FIFO
) f$ k' y$ ?9 e" d/ [" G9 e, [
UARTFIFOEnable(SOC_UART_1_REGS);
( F$ P* _5 l* ^" ?) a$ F
// 设置 FIFO 级别
: v' E! N5 A, K! \1 g9 H/ y6 Q
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
) ^3 |: K( k. b6 y9 u! L" b* d
//Uart1中断使能
# O7 t0 w4 d- A
unsigned int intFlags = 0;
' o+ r' Z: Y+ @+ H/ P! F
intFlags |= (UART_INT_LINE_STAT | \
1 e# [2 P; e) I7 M# F$ B
UART_INT_TX_EMPTY | \
+ |$ G% I' m) q
UART_INT_RXDATA_CTI);
: d# S8 d/ U1 W8 [
5 M8 ~& M3 p: |9 i) g$ s
UARTIntEnable(SOC_UART_1_REGS, intFlags);
& b0 ?( f% H7 r0 e
}
) c& F* a) ?$ _4 C2 M2 O, ~6 y4 A ]& m5 j
//UART 中断服务函数
4 N: d& B$ S; ?+ D2 x( M: i' f5 _
void UARTIsr(UArg arg)
, \! h2 }) A% s/ M# M. M
{
& D+ \) m: M/ S9 |: z
static unsigned int length = sizeof(Send);
M$ c& \. L2 ?" h0 z6 _
static unsigned int count = 0;
1 W' J8 O3 D6 x" y( b2 k# M
unsigned char rxData = 0;
8 M3 B4 p" y' z8 T
unsigned int int_id = 0;
7 l# e3 F, B, e0 U) W
// 确定中断源
) j# ]6 p, v b0 H F& T
int_id = UARTIntStatus(SOC_UART_1_REGS);
) `5 L' j n- S( M0 u# [4 ?
// 清除 UART1 系统中断
h2 G% C% S: |: ^2 _, E
IntEventClear(SYS_INT_UART1_INT);
7 B) Z0 T' v% o5 D& _$ G
// 发送中断
7 c/ r+ f" i# t b! v
if(UART_INTID_TX_EMPTY == int_id)
! A& N6 B4 V! T. P/ {" m
{
4 }: R6 j) S6 y: ^, v
if(0 < length)
+ W6 c9 j* D" B6 ?7 }4 B& Z
{
9 s3 p6 p3 h: ]
// 写一个字节到 THR
7 Z; S: X; f* N; u; }3 `5 O
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
. @5 @1 M# h( o1 h' l6 P o
length--;
7 |! l8 `1 p, n
count++;
- X; O9 B1 x( Y* G: s
}
& o, w6 I, d. Q, ]% E% Q0 N0 t0 d
if(0 == length)
/ F3 l" \$ v9 t3 N6 l. f7 L
{
' R7 U6 x. U/ z' ^% n; ~
// 禁用发送中断
3 M M8 m6 `' \9 `% {
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
; {- d Q6 M6 M, \# o/ [ d
}
+ b% `3 b! { |
}
. s7 o1 T7 @ e
// 接收中断
% X7 t3 h4 l' }5 P+ f, F: \1 j* u, K
if(UART_INTID_RX_DATA == int_id)
@4 p) N/ n2 h( X$ B) k( ?% f
{
+ z$ G' _% v) n
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
: o# x& p8 }' y5 E5 g& H
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
0 p+ |- u+ N, x5 d# b& s
}
& f1 o) r& q. x0 s9 w% r: @
// 接收错误
6 W8 J7 E3 d5 Y/ [5 e' @* e0 i/ s
if(UART_INTID_RX_LINE_STAT == int_id)
% `9 R. B8 T N+ n* a
{
2 P' E) o0 `: v; _5 v* I$ w( S3 U
while(UARTRxErrorGet(SOC_UART_1_REGS))
" A& E h( E, H5 I. `" X
{
- d$ Z( a) e' G; L
// 从 RBR 读一个字节
7 i, b2 t: C7 {9 v( r! L
UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 D/ l' i* x- E0 L3 N4 M4 M
}
0 L; t$ J/ g( @
}
( Y+ ~, }0 ? A) x/ T2 o0 I% @0 U3 ?
return;
9 h; m# s, T) A& p
}
( K* X t1 v ~" D0 o, x
Int main()
* `3 c" i" S, P( q
{
) ?! r, v2 S! E
UARTconfig();//uart 配置
( Z2 n p* _+ Z, ~& n" k9 |
Error_Block eb;
2 W& v# ]* a5 H2 o2 a' L
System_printf("enter main()\n");
3 n' c7 v1 ~; c
Error_init(&eb);
! b3 a/ y' B1 L$ E3 f) w8 e% j
// 动态创建硬件中断
8 v1 W2 R0 I5 R g& e
Hwi_Handle hwi1;
( ?- A5 s4 a. S5 W& v- p
Hwi_Params hwiParams;
. Y$ _( j+ Y* \4 N% e& ]
// 使用默认值初始化参数
" w, x7 Y# } Y
Hwi_Params_init(&hwiParams);
7 E% `/ T# G- q% E3 ]' F
// 中断事件
6 U3 `- D# a* L
hwiParams.eventId = SYS_INT_UART1_INT;
8 { ^# J2 c8 O
// 传递到中断服务函数的参数
. r7 t; }: Z( N4 m- \
hwiParams.arg = 0;
% R2 V! W2 \$ r$ _% \+ ?8 X5 A
// 不允许该中断自身嵌套
0 e" o, C5 u% R/ Q4 u2 m
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
" f& P: I* ?! S$ R0 d; M0 c4 [
// 使能中断
6 ^# I |3 p) b* D
hwiParams.enableInt = true;
( V; |7 Z/ ]* q' ?; {
// 可屏蔽中断 4
1 ~5 t$ X+ q$ a# y0 f7 d; P
// 中断服务函数 hwiMain
0 k, i0 T" {; p1 T P
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
2 E; A5 w" T. @
if (hwi1 == NULL)
" I* D9 T, l( R1 k! W2 a
System_abort("Hwi1 create failed");
( A( L# f8 ^" S: g$ Y9 r
BIOS_start(); /* does not return */
* C; d( ]% f* ^/ D8 O
return(0);
; s6 q( N7 X& Y/ r4 @
}
9 j- W2 Q0 [! i% B9 H
& d/ U8 L# R+ B7 j3 O ~4 d
作者:
希望缄默
时间:
2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
3 f' |8 {8 M* Q
作者:
Greatwang
时间:
2014-12-1 21:49
在中断服务函数里放置断点
! H9 R* W5 p+ y9 `, o. m
作者:
希望缄默
时间:
2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
6 Y% k! F2 J- [' J7 E( ^& f2 S
在中断服务函数里放置断点
2 h! ?6 z: d3 }+ n* e2 i" x
参考 GPIO_KEY
4 k' v! G+ S% a! ?) T
作者:
cchwhk
时间:
2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4