嵌入式开发者社区
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
[打印本页]
作者:
Greatwang
时间:
2014-12-1 14:52
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
& H5 R& O% |5 Q$ \# u' s
// 发送缓存
5 `& P! I! c) I; y
char Send[] = "UART1 test......\n\r";
" ?) W& w9 M a
$ N# T h! Q) |) Z" j) t$ }
extern void UARTconfig()
5 A. ]2 q9 g& i: m
{
. Y1 H7 n, a& n: e! g
//使能Uart1
& j: i0 R8 A) }: R" C2 f
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' A/ b, p" u8 d' p; p" ]1 c4 D& ~% o6 j
8 a& { E6 i: x* h. f. A
// 使能 UART1禁用流控
" e( x3 z; K$ U: p0 t
UARTPinMuxSetup(1, 0);
/ j" U1 g3 L0 T2 O- Z& ?, t6 l! t
$ S6 e" o5 j0 C0 ^8 L6 |
// 波特率 115200 数据位 8 停止位 1 无校验位
0 O N$ i( I* h% U( p3 S/ i
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
) I4 a6 l. D# ]! N) @
, {- R6 V: _- y- u3 P7 {
// 使能 UART1
; R& J4 s. V1 [8 i6 w; Y4 k
UARTEnable(SOC_UART_1_REGS);
; R% @5 W1 l) E5 ]! d/ g
// 使能接收 / 发送 FIFO
+ ]4 [ l* W+ @/ y- b1 _* G4 O
UARTFIFOEnable(SOC_UART_1_REGS);
! K9 I* `9 S6 @$ p4 L% k$ Q& }
// 设置 FIFO 级别
1 |6 ^3 u- i1 g7 A- y
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
! A: U, y/ M0 q' p# Z% H
//Uart1中断使能
y r$ _+ @: Y# L
unsigned int intFlags = 0;
6 S( k$ ^5 N% q( c
intFlags |= (UART_INT_LINE_STAT | \
3 M/ ]8 h! G) k0 @ N! p$ q
UART_INT_TX_EMPTY | \
3 a `: M$ P! v) {6 ?* Z* v
UART_INT_RXDATA_CTI);
$ S9 f% `& {. w
% @$ \3 y/ q: h6 a3 D
UARTIntEnable(SOC_UART_1_REGS, intFlags);
3 q( E$ q9 O2 K% n; t; X) d
}
! j: A& n. m$ K1 u1 P e* o
//UART 中断服务函数
' `7 B( @# @* {$ ?/ F. ?% ^
void UARTIsr(UArg arg)
m, o: z, F/ G1 R2 p" O5 h9 }& ~
{
1 N" I" B; \8 k2 w, c
static unsigned int length = sizeof(Send);
/ r4 C0 r, k t
static unsigned int count = 0;
# y( t+ I% Q1 m! X6 h# |3 V) X# b
unsigned char rxData = 0;
. v4 L/ U. q( U2 A8 s
unsigned int int_id = 0;
# T5 P" x# \' J5 p6 t2 p7 T9 o5 G7 y' W
// 确定中断源
) W0 g- u }6 P+ G* k, C" F
int_id = UARTIntStatus(SOC_UART_1_REGS);
2 i7 P5 c7 F. V, n N3 w. q
// 清除 UART1 系统中断
9 q; x7 f5 J) ?
IntEventClear(SYS_INT_UART1_INT);
) g4 {5 `, j j
// 发送中断
0 v& w( {- w& K y5 t8 R, V
if(UART_INTID_TX_EMPTY == int_id)
# W- i. S$ h0 M) R0 n
{
! w/ @6 }. ?8 m; ]7 N. C0 y
if(0 < length)
. t! w2 G; E% j3 Y& x
{
# p. w5 H4 o% x* q C, M1 g
// 写一个字节到 THR
% L) B/ T! X: R( G% N. [/ O) l
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
. N; {3 k( I0 {' m1 G
length--;
$ {$ `1 O2 v$ ]3 l* u% B+ N
count++;
# o2 \# P& {7 T; f0 @$ x
}
0 e W$ x; J4 Q# C$ C0 }4 `% r M
if(0 == length)
7 C$ d! s9 f0 Y
{
: D+ z! z3 W( e$ N) L6 f; ~
// 禁用发送中断
( E8 S" f1 \. A" G7 [. z: O* }
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
y8 {5 R* f' z
}
. F3 z9 w' r( I( F' O* ]
}
: H1 b" k0 `* h# n+ W
// 接收中断
/ m" U/ @8 k4 c% {6 Q
if(UART_INTID_RX_DATA == int_id)
" @- A' l" S; D9 j
{
7 ]; B5 Z( R8 X7 S4 o
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
! f& |* ?& O0 W) w/ J, t
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
$ J* Z% Y' s/ J
}
+ R A2 W' ?% S. A7 s# @; D
// 接收错误
4 ~. s: ?' S0 I* `
if(UART_INTID_RX_LINE_STAT == int_id)
5 w* d) S6 e e' H8 z e! ^
{
3 @% v0 m0 g2 B3 p$ x- b9 s& o
while(UARTRxErrorGet(SOC_UART_1_REGS))
, s; H6 f, p V. {. W4 l- Z- r- C* C
{
+ N' t A7 ~5 D" |
// 从 RBR 读一个字节
% U* X0 ]7 ]4 l& ]9 Z( u
UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 A" L; z% I; B( C$ J0 G) C
}
E* G; [+ G' e# r0 y
}
" i. B I$ N: a/ ^- o+ m
return;
- V/ R$ `; B& N1 A
}
3 Z2 r2 n5 [* T) W
Int main()
4 ]/ k3 Q) ]! {# V: V8 ?9 G0 y. V; J( }1 B
{
~/ D; u# W1 Y2 R& ~7 }
UARTconfig();//uart 配置
' L$ Y# g4 d) e* I
Error_Block eb;
2 \8 [- {* I" k0 F/ R3 E: i
System_printf("enter main()\n");
' P& R0 _2 ^1 @' l# X0 L$ b' F1 B
Error_init(&eb);
' w4 s) j; G* U# {% w
// 动态创建硬件中断
8 s# d' {! [- f# d" K
Hwi_Handle hwi1;
- ~8 p' F$ n( F: Q- O8 X0 f
Hwi_Params hwiParams;
# ?1 n( N; U9 m2 e$ L. r3 b7 P
// 使用默认值初始化参数
* a1 Q5 |' d! t
Hwi_Params_init(&hwiParams);
: d% T/ Z- t; j5 L" Q7 }$ z* J& L
// 中断事件
" d+ |, a. v9 Q- k$ ~# J7 |1 B
hwiParams.eventId = SYS_INT_UART1_INT;
1 ~/ p& n3 Q6 S! V# }: l
// 传递到中断服务函数的参数
& T& Y* W3 ]7 b$ `
hwiParams.arg = 0;
8 L5 e: _3 D D4 L, u# w# b
// 不允许该中断自身嵌套
8 e+ J, L6 S: ^- k2 S0 z2 J1 f
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
$ Y1 d- w8 ?! k4 u* w
// 使能中断
% Q9 ^2 F" e, g& n: I2 P
hwiParams.enableInt = true;
: d( k5 g' X2 V9 N4 e
// 可屏蔽中断 4
! v; f' _5 F1 f: @3 d T
// 中断服务函数 hwiMain
& v! C9 T9 B+ ]; j$ _$ c3 \
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
& Z/ a \& B. r6 q4 J
if (hwi1 == NULL)
* N' _9 s) R$ V$ X
System_abort("Hwi1 create failed");
! E3 ^: b* v: a5 S, {* {& j# s
BIOS_start(); /* does not return */
0 I& m/ q9 {6 b G3 }. I) }
return(0);
3 N. e' z* k5 S& v1 ^7 Z, ] J
}
( A v! i' u: H% g8 a8 H
* W q0 E6 S: b! L
作者:
希望缄默
时间:
2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
- D3 T r- |" u" E, F: P6 b
作者:
Greatwang
时间:
2014-12-1 21:49
在中断服务函数里放置断点
1 @9 _$ B( Q4 L- F. E' i
作者:
希望缄默
时间:
2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
: t) P) |, A* r& P
在中断服务函数里放置断点
i1 y5 q" B% j H: o
参考 GPIO_KEY
0 X6 _$ p$ ^! D7 Q5 B: N3 z0 ]
作者:
cchwhk
时间:
2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4