嵌入式开发者社区
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
[打印本页]
作者:
Greatwang
时间:
2014-12-1 14:52
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
$ T5 e- L) c/ Q* d# W# s
// 发送缓存
& ?9 G g* J6 c# V
char Send[] = "UART1 test......\n\r";
7 y1 _ J8 Y; T4 e0 V6 Q+ @
% Y; M" {4 a5 a$ I
extern void UARTconfig()
: x2 P9 i- Y- |& I/ _7 U
{
) i9 I! _1 m4 h v
//使能Uart1
7 f( Q; I/ v, N* D0 M& X
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# V' h( {( P, P2 I
# @6 S% s& z L
// 使能 UART1禁用流控
% i, f4 M3 I9 N/ Y+ n
UARTPinMuxSetup(1, 0);
2 A/ P+ @+ A* q7 m/ m, v9 G
. y) K1 `# i! O# C7 I
// 波特率 115200 数据位 8 停止位 1 无校验位
: ]" c* T2 u6 B
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
% ?. l% W3 W" v# \2 g+ n
3 u4 x8 M3 C' }0 F. G# r
// 使能 UART1
& f' \" C" J1 \, h9 x! c) P& G
UARTEnable(SOC_UART_1_REGS);
7 _# o- u! r) P3 ^$ b$ u
// 使能接收 / 发送 FIFO
b# r, O5 q' m) x6 m
UARTFIFOEnable(SOC_UART_1_REGS);
9 e: Q6 d/ i, f. u8 i6 Q- P8 S
// 设置 FIFO 级别
) R, u: m+ N* p' H h0 C; { a
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
8 r6 {$ n: ?: ]9 U% V2 e0 ~# d
//Uart1中断使能
; m: j7 p) Q9 C' j) g- g
unsigned int intFlags = 0;
, K. t; X s# | i3 H6 j
intFlags |= (UART_INT_LINE_STAT | \
" X* G, a: [9 ]: W
UART_INT_TX_EMPTY | \
$ p4 M6 I" f# w5 u5 \4 `
UART_INT_RXDATA_CTI);
$ w5 |) o& b6 i l& b" r
* ^1 @) F5 _2 [1 d% @3 J+ F
UARTIntEnable(SOC_UART_1_REGS, intFlags);
/ X9 }, k9 V6 O9 p, i
}
5 R# ?7 n0 M$ L+ l3 R
//UART 中断服务函数
% t! l8 G5 p. `, i$ O
void UARTIsr(UArg arg)
: o/ J; Z; I( w/ _/ u
{
1 \. I* j2 `9 f5 z
static unsigned int length = sizeof(Send);
0 v7 Q# ?/ z3 i
static unsigned int count = 0;
1 Z) j- u( h8 ^
unsigned char rxData = 0;
5 t4 V' }2 E: ~$ J; W0 m" P: u
unsigned int int_id = 0;
9 y1 b5 U0 t2 _1 D9 y
// 确定中断源
# K8 u7 Y# r' i+ X
int_id = UARTIntStatus(SOC_UART_1_REGS);
: n9 S3 W1 H/ G
// 清除 UART1 系统中断
9 e& I9 Y) y5 f5 {" T7 e+ L
IntEventClear(SYS_INT_UART1_INT);
" Y# ^$ f9 k+ ]0 h
// 发送中断
* n2 d) ]5 L) M b
if(UART_INTID_TX_EMPTY == int_id)
/ L& U. c1 _- |' x: j
{
9 N+ L! ?+ O5 y" w
if(0 < length)
! C. u: |1 S7 T. `1 P* M
{
# F$ @" Y, F& C, H0 D
// 写一个字节到 THR
% v$ H6 `/ W% t- d2 f: r5 p, A- Z
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
: I* H# ^% y) x/ R* \ p
length--;
5 y3 R+ y" `# r1 X
count++;
+ j! K( Q' ^$ `" X4 ?/ z
}
3 o. |. K* w9 a0 W3 y
if(0 == length)
" T* l) h- y j7 [4 p/ d
{
8 O$ H4 x" C, ]
// 禁用发送中断
# C h! [: e2 M. |( M; V. k3 i
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
2 q+ f% T L7 H* f' z- ]
}
5 g- B2 r2 l- L0 w' H( b
}
) C& E- P( C h$ n6 s6 a& d1 g
// 接收中断
6 u0 \* h3 I% W- N8 @' W
if(UART_INTID_RX_DATA == int_id)
+ g# X2 `, s! x3 M4 L
{
# i: H5 Y# Y1 a
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
* J/ d; ?4 N! _) j0 G2 F
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
- ]# M/ E' |+ |7 l% {4 C8 j) \
}
5 O7 f8 o: W' y
// 接收错误
: c0 l X6 s" v5 x
if(UART_INTID_RX_LINE_STAT == int_id)
+ H( j0 }- @( b3 f$ x' s" E
{
$ s' ?, b" J) x; l- G
while(UARTRxErrorGet(SOC_UART_1_REGS))
; K8 S6 v' I4 X; v) q* y6 A# ]
{
$ a* |. t# O/ \$ A% m
// 从 RBR 读一个字节
6 `/ n2 G' ~6 S1 t6 v& S4 d
UARTCharGetNonBlocking(SOC_UART_1_REGS);
( z/ ?% W. h$ E; V3 G# G
}
0 C8 q' e: @3 a9 L5 }+ b! J
}
4 [. G8 o% s0 u O
return;
# k/ L4 I) S6 E H) O
}
P6 l' r! G0 b
Int main()
7 L; R6 H3 W. R1 b8 d
{
2 N9 o& l: U1 V
UARTconfig();//uart 配置
+ s2 g9 g$ u0 D; m
Error_Block eb;
, Q# q5 [/ u7 c3 Q; b ~
System_printf("enter main()\n");
3 s) H% q: g6 R
Error_init(&eb);
0 O9 v3 E! R5 Y; B: y: e/ r
// 动态创建硬件中断
& J- J- O; X+ m; S' c
Hwi_Handle hwi1;
4 b9 s- X) l5 F) j
Hwi_Params hwiParams;
9 P5 B+ A: ], ]
// 使用默认值初始化参数
+ M/ z9 d I# @6 ]3 ?' T. S
Hwi_Params_init(&hwiParams);
+ `2 a* a6 {' @: @+ _7 }; t
// 中断事件
& M- O& k [- t& W- t+ d6 T% B
hwiParams.eventId = SYS_INT_UART1_INT;
, x# E) O0 v ?8 F
// 传递到中断服务函数的参数
) m; z1 B- W+ H7 j. P4 R
hwiParams.arg = 0;
1 }9 N2 h6 y. B
// 不允许该中断自身嵌套
* Y5 h" Y4 K- E
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
5 U$ l7 z# E9 A' F% ^8 C) Y; F
// 使能中断
9 X- o f7 P+ z/ M/ Y6 w
hwiParams.enableInt = true;
- j' ]. Q/ U% `( D( x2 C- t
// 可屏蔽中断 4
3 {* U0 G* e- O- b2 E. z. h3 i1 A/ M
// 中断服务函数 hwiMain
/ M/ |5 |! h8 W! e
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
) C9 ^, s2 t5 U: ?4 x: T$ C
if (hwi1 == NULL)
$ l: R, ~ {# v
System_abort("Hwi1 create failed");
* ?+ s m6 p. C) R" c# M4 C& M) F
BIOS_start(); /* does not return */
# J% u2 v. E. g2 R( _; c( o- b
return(0);
$ L% X( a7 V- D6 g$ h, D4 j
}
: X: {7 s! H) }
% F& s. `" b V. M4 ^( o; Y
作者:
希望缄默
时间:
2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
q! {" R& f+ k: k/ y* N1 G$ p
作者:
Greatwang
时间:
2014-12-1 21:49
在中断服务函数里放置断点
4 F6 H8 a; _, h
作者:
希望缄默
时间:
2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
- O" X6 m4 m5 e6 W# S: s
在中断服务函数里放置断点
+ T1 W/ P* @/ U. P, ^
参考 GPIO_KEY
: x- W2 e! |9 h6 x& M5 O
作者:
cchwhk
时间:
2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4