嵌入式开发者社区
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
[打印本页]
作者:
Greatwang
时间:
2014-12-1 14:52
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
" f" E0 P/ O# }) S! ]+ j4 J3 T
// 发送缓存
9 V, W1 V# r7 F- Y6 t9 \
char Send[] = "UART1 test......\n\r";
! u! r' R; u. p- g' N6 I) N. A- E
3 T. ?! S, Y2 p0 ?9 s
extern void UARTconfig()
6 C5 |1 C: m0 ^8 f
{
5 c- T3 `( X2 P7 x) W
//使能Uart1
( M$ z, I4 [4 _) l4 [# k( M0 y$ f# e$ a2 U
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- d4 y+ F& |/ u9 a, P0 e& }
# I; v+ D$ V8 E5 K& m, J
// 使能 UART1禁用流控
: H3 ]! e; m$ V( y- z/ _! E0 }
UARTPinMuxSetup(1, 0);
; O4 G3 y _3 Q9 S' Z
1 T, F2 w: S# C% ?/ z: X) u' s
// 波特率 115200 数据位 8 停止位 1 无校验位
- h" X0 `' M6 t7 k
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ y/ ~4 l$ a2 E, O6 r: r7 P
& c" G8 N; @, k
// 使能 UART1
3 A+ C; s9 n% A% l1 c0 f3 q
UARTEnable(SOC_UART_1_REGS);
- g. e9 _. g! { h% z/ N
// 使能接收 / 发送 FIFO
$ E5 B( L& K2 H1 U! s1 a
UARTFIFOEnable(SOC_UART_1_REGS);
@' A' ]) t l G
// 设置 FIFO 级别
) G7 H/ K2 J7 d7 p; u% n
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
% a6 O% \1 X1 O6 ]. a& @+ N
//Uart1中断使能
W0 P- J6 h: o' a
unsigned int intFlags = 0;
& T" P1 r* q3 a1 \" l! F) c2 D7 z
intFlags |= (UART_INT_LINE_STAT | \
# P: x3 P7 _1 {! p) w+ v- d
UART_INT_TX_EMPTY | \
8 H q4 R' B4 U$ z, n) w
UART_INT_RXDATA_CTI);
3 R0 G' i' v! E+ ^. w5 A; R& l( @% N$ D
f' @% P$ ^# g$ s+ u. k# B
UARTIntEnable(SOC_UART_1_REGS, intFlags);
' k/ j" \6 P8 s
}
$ m) r! H1 P2 [2 D
//UART 中断服务函数
4 B1 ^8 X. Y. L9 J- V, \0 U4 g
void UARTIsr(UArg arg)
% U, K- P( R; [- B/ N) t
{
- A( \, Y8 [ D0 i
static unsigned int length = sizeof(Send);
3 y' U z! N2 |* ~) u
static unsigned int count = 0;
, K& H! ~! H8 u# M, s% M* p
unsigned char rxData = 0;
4 U5 f: x* I2 }2 t( C) A
unsigned int int_id = 0;
" A8 A2 ^4 B# a2 n
// 确定中断源
/ {( M/ [5 [* k, R" K5 y" ^# Q
int_id = UARTIntStatus(SOC_UART_1_REGS);
( e/ _/ [0 z) H# d! X
// 清除 UART1 系统中断
# [4 }! o3 t6 N& {7 N$ }- `
IntEventClear(SYS_INT_UART1_INT);
% E3 |7 N! Y. T, d
// 发送中断
/ E0 N$ B2 C2 s1 y' l6 j/ A
if(UART_INTID_TX_EMPTY == int_id)
( m$ ]* [' C! M3 w% m
{
5 H* F. P! B/ L4 m- F
if(0 < length)
6 q1 ~2 ?& w+ y5 M3 m
{
) T5 r+ c. H+ @+ X: R+ J
// 写一个字节到 THR
) u- [0 z7 O& O
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
" z* I: h4 f, @$ v' P
length--;
6 \3 P% n3 \: V) o/ a' j9 A9 m( O
count++;
; C6 J! @) k! N% q5 j# m. H
}
) b/ w. K L$ U
if(0 == length)
8 P: V. H; e9 A( d
{
# Y& `2 }% P) I7 k
// 禁用发送中断
& j( d5 V( f0 F1 {0 K Z8 J, H
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
6 R0 ^; }& m; w8 ^5 b% m
}
5 r& ^: R: L& d/ X0 f
}
" x% T; j9 y* J/ v) l
// 接收中断
) o b$ V8 ?4 ~: k
if(UART_INTID_RX_DATA == int_id)
|( N8 } r/ r4 v
{
4 a* d4 f* u* Y4 _1 K+ f3 O
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
9 S8 r0 z) B& g# x' Z+ o' h. d$ f2 i
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
5 B2 R9 H# A+ b
}
) o9 `2 h% Y$ V4 k* }! C; C
// 接收错误
# e3 g, d! P" e
if(UART_INTID_RX_LINE_STAT == int_id)
2 d0 p& L* B0 D4 C3 \, R: Y
{
& ?2 m& B" I' m0 a% m! D7 M8 C
while(UARTRxErrorGet(SOC_UART_1_REGS))
) X5 a' p/ S+ W I3 E2 ~! K1 s
{
* f( L5 E: J( B* [1 p( {
// 从 RBR 读一个字节
7 C6 U, d3 I+ f
UARTCharGetNonBlocking(SOC_UART_1_REGS);
0 p. [4 y7 y$ a: n
}
' h" S1 s. k* U% j
}
$ C8 e- M) D u& ~3 F! j
return;
( _' H q+ y! z2 y6 Q* h5 p
}
& X7 T4 A" B+ Z* h9 `4 l
Int main()
) `/ e7 ]2 k- {( B$ H
{
- ~* @4 B: z R" {4 p
UARTconfig();//uart 配置
: q: i6 f/ H) e q3 T" ?/ S7 j3 A
Error_Block eb;
3 L4 u* N: L7 @7 N e/ v
System_printf("enter main()\n");
% ^' f) l$ i% \ k) t
Error_init(&eb);
2 s3 |/ m! E; F! P
// 动态创建硬件中断
5 r6 y+ J% Z( l. i
Hwi_Handle hwi1;
- @ L: l/ G) r. ?2 U, w7 u
Hwi_Params hwiParams;
2 {2 b% O7 V0 m& m! P3 \# _2 L C& \
// 使用默认值初始化参数
1 G X; P4 ~- T) o$ Y
Hwi_Params_init(&hwiParams);
J( F/ b; t1 H3 r
// 中断事件
0 N3 c; u/ r: Y8 d! }* o( N
hwiParams.eventId = SYS_INT_UART1_INT;
# U. k! W; c% i7 `/ e# x
// 传递到中断服务函数的参数
2 n7 M) w5 J+ ~9 d7 u
hwiParams.arg = 0;
/ S2 U9 } v0 }* \$ L# n! P: M
// 不允许该中断自身嵌套
' c U3 v& A$ ]( S
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
0 D- H( p+ y5 B9 C/ p
// 使能中断
9 e5 e! Q# L4 f/ |+ b- A- J
hwiParams.enableInt = true;
+ h. x. Q& l/ ^' D
// 可屏蔽中断 4
6 O9 F8 S! }9 \( {2 V8 y
// 中断服务函数 hwiMain
9 m* V$ N2 O: Y2 t5 {0 l# }
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
1 k+ I2 l$ t) y$ z- k9 v
if (hwi1 == NULL)
6 _9 ]( b8 \8 Z+ T0 l8 ]9 T/ E
System_abort("Hwi1 create failed");
; i/ O! a( f) Z& r1 S' c% c$ U
BIOS_start(); /* does not return */
/ K: M1 Q' ~( |1 l( `
return(0);
. Q l/ ]# [: ?
}
* G1 L# h/ {4 }& w& Q4 ]
% k4 y8 Q( P, U+ X$ W6 E8 z# R( t+ |
作者:
希望缄默
时间:
2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
# w) L9 E4 {! d1 d/ D! q
作者:
Greatwang
时间:
2014-12-1 21:49
在中断服务函数里放置断点
8 T% a- u, `& d6 |
作者:
希望缄默
时间:
2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
. ^) r) ]5 u" n2 {6 G8 @& `" Y
在中断服务函数里放置断点
: X2 R0 W1 t$ }, C' M; w
参考 GPIO_KEY
5 L. G' a# H* M( J' S( |
作者:
cchwhk
时间:
2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4