嵌入式开发者社区
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
[打印本页]
作者:
Greatwang
时间:
2014-12-1 14:52
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
* j, A7 _) X" S% B6 v4 D% M4 P
// 发送缓存
3 i3 D% C8 z2 s* ?8 h
char Send[] = "UART1 test......\n\r";
7 I! ~9 g% G. W2 @0 q# ~6 m5 Q
: n# o+ B; T0 [6 ?
extern void UARTconfig()
8 j3 J4 [# Y3 n- `
{
2 J$ V+ ]. a2 r% A
//使能Uart1
7 ?! |0 ? d+ g7 d% Y7 y, S
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 {4 I p! O7 b7 b( n9 m {$ x
9 Y# Q5 d' [0 Z
// 使能 UART1禁用流控
' v: x' }5 F; _$ I: K! t, f$ o- h
UARTPinMuxSetup(1, 0);
1 e6 B' c, Q ^2 v
5 V. P2 e" h( ]; {
// 波特率 115200 数据位 8 停止位 1 无校验位
* r; i9 `- M: G+ q; ~3 r
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
% ?" d5 ?5 I9 B* c" c. X! M* S6 U6 e
- u& O/ [5 m' |, A$ l- {
// 使能 UART1
4 V. [- _8 h- W& |" r# @; ~" {: q
UARTEnable(SOC_UART_1_REGS);
- z& Y4 W) V7 o# ]- @2 J
// 使能接收 / 发送 FIFO
5 C1 i$ b% D% g7 `" s N) T2 u
UARTFIFOEnable(SOC_UART_1_REGS);
) E4 u$ }$ _5 f
// 设置 FIFO 级别
' v6 J: r- n2 P- M' z/ L N2 n, M' @
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
}( K o$ d+ L1 B3 y6 ]
//Uart1中断使能
6 T6 v. r! V2 J7 W) K: M
unsigned int intFlags = 0;
; e) n3 G" F" D1 Q
intFlags |= (UART_INT_LINE_STAT | \
! T1 H3 k7 M. ]
UART_INT_TX_EMPTY | \
4 u5 \2 \0 u/ Z
UART_INT_RXDATA_CTI);
0 f& i$ [! l9 Q3 t5 u4 g
* D3 e% F$ l, W" K0 n' r
UARTIntEnable(SOC_UART_1_REGS, intFlags);
9 L+ V6 _( S: e# t& y
}
, S7 u8 i) v T% ~$ A% J' I1 x
//UART 中断服务函数
# k/ R. ~. O" ] g: U0 j' Z" Z
void UARTIsr(UArg arg)
+ A2 q, l" o. J6 O3 K: g
{
# G! g8 W" j- O1 g: ^3 k( c) Q; f: q
static unsigned int length = sizeof(Send);
) _: X' S- h5 W4 J
static unsigned int count = 0;
( y* X. w; G% E4 H2 l1 M; u( {* H, W
unsigned char rxData = 0;
" T! O; B& v g3 G' p5 i: i
unsigned int int_id = 0;
0 f! C: q! {4 o4 e
// 确定中断源
; `/ S# [) T |/ ]' x! C- p
int_id = UARTIntStatus(SOC_UART_1_REGS);
# i, Q4 B; I* h2 g$ o* x. D
// 清除 UART1 系统中断
2 B; k" S, S5 e7 `+ j, L$ |
IntEventClear(SYS_INT_UART1_INT);
4 o9 @8 s/ g1 |* W, M1 O8 F: q
// 发送中断
/ V( y, L! m% Z$ h ?" s+ c
if(UART_INTID_TX_EMPTY == int_id)
4 ^+ Z7 w+ _* A" k* r8 v% L
{
" W: S# t" g: }' H, Y" _ d; Y
if(0 < length)
1 X6 U& h& S5 R9 h% j
{
% b a# ]$ K+ |& M9 z L
// 写一个字节到 THR
6 H2 Z: w, @. Y3 _0 n5 @8 A) l/ j; g& S Q
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
' B) P6 D+ U F& j) b/ F7 `
length--;
0 D+ A; ]0 H$ j. |- G; E
count++;
& C8 c& \! S9 k! _3 Y) _' K% S3 D
}
* p! A" T8 d' X }! X6 g
if(0 == length)
( E2 W5 F! z4 [. ?! A6 f! u
{
1 k. }! o. }7 I8 m
// 禁用发送中断
" Q$ ~& h z, O: B. E' i
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
, u+ j6 J3 u1 a/ u5 q
}
9 p. h6 p7 F& j; E& f& m0 r
}
% y; N; }6 U& j1 a7 O e, f
// 接收中断
; T$ \8 K6 l* s: m
if(UART_INTID_RX_DATA == int_id)
4 f. d; K7 B% N' q- q
{
. }7 m2 V9 M9 Q! t9 Q. E
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
) }2 W! r* U' j- q/ E# h9 x
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
7 @! C) {: c- H
}
$ Y; `) Q( l+ B8 e
// 接收错误
# ]5 u; T; L0 p8 F+ w
if(UART_INTID_RX_LINE_STAT == int_id)
5 w$ J& W) ~6 f: T9 L
{
. i# k5 Y4 G7 j) j
while(UARTRxErrorGet(SOC_UART_1_REGS))
7 i$ P w1 W2 U
{
/ F) \4 ]; N7 m! B9 A
// 从 RBR 读一个字节
7 r: Q8 ]# D. J, G) F
UARTCharGetNonBlocking(SOC_UART_1_REGS);
6 s6 r5 c S# w x6 M, m m0 r
}
8 F3 L$ F9 T6 E" U
}
6 @: S5 u# M* n* c5 y, e f
return;
- e4 l0 X8 C9 p' S: h# q
}
. }6 ?: G) }" U
Int main()
" V+ c8 d: A; k8 z
{
5 A: ~% P: h3 h+ b
UARTconfig();//uart 配置
/ E) S9 L& {: G$ q9 x: z2 e5 l$ c
Error_Block eb;
, e8 s; t, g. j5 I
System_printf("enter main()\n");
9 a7 H1 [' e; g. k0 I# [
Error_init(&eb);
' b$ x% l/ A) ~; |; m
// 动态创建硬件中断
4 ?/ G5 m( a1 } Z( b7 Z1 K6 C
Hwi_Handle hwi1;
7 E' X3 p' P9 m, w3 ^
Hwi_Params hwiParams;
$ K/ H; R+ E0 C d
// 使用默认值初始化参数
0 J m$ G& R8 d) N% d
Hwi_Params_init(&hwiParams);
% Z* Q) F# h1 q' N6 }
// 中断事件
. a) p# `) {# K; V, \
hwiParams.eventId = SYS_INT_UART1_INT;
7 l' r8 ?1 F" G7 t- F
// 传递到中断服务函数的参数
6 N$ Y) u. }" @0 j
hwiParams.arg = 0;
. }% V$ v4 n" P! M) c! s: A
// 不允许该中断自身嵌套
/ e5 Q/ d; u+ Y
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
2 n7 N. |8 q" _1 W+ ^: a6 T
// 使能中断
( n7 @! ]2 J- L% F) N; F
hwiParams.enableInt = true;
- k0 i# C3 E9 U
// 可屏蔽中断 4
7 M: i3 i7 `, k: L- v* a1 s8 ] P
// 中断服务函数 hwiMain
3 s8 |4 d! ?, l
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
. ?. R3 X4 o& C+ t- V) k# b0 Y
if (hwi1 == NULL)
% c7 {4 v6 \" V/ @
System_abort("Hwi1 create failed");
& E# f$ m* ]5 u3 ^! \1 N
BIOS_start(); /* does not return */
* B0 C, X6 m% A& W
return(0);
' W2 w/ E" ]' n" G
}
6 @1 \% ^# D' s
8 T2 x9 g- v4 }9 q& Z6 r
作者:
希望缄默
时间:
2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
0 B2 V, z* N/ W/ c# {; I$ C
作者:
Greatwang
时间:
2014-12-1 21:49
在中断服务函数里放置断点
' ^. H! k5 N& g3 U' C+ O
作者:
希望缄默
时间:
2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
5 b5 u8 b8 y& C* W
在中断服务函数里放置断点
1 f( t. t) |9 P/ l
参考 GPIO_KEY
, e2 k3 M3 C9 o/ L8 m' n* q
作者:
cchwhk
时间:
2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4