嵌入式开发者社区
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
[打印本页]
作者:
Greatwang
时间:
2014-12-1 14:52
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
& ~6 l* O8 b. b o& `7 k9 U D6 s2 O
// 发送缓存
9 ~/ r/ i& U$ G& p M5 r
char Send[] = "UART1 test......\n\r";
% j2 _2 P7 L1 R" `5 M% k9 p
) l1 x/ p5 y r5 D N
extern void UARTconfig()
Z9 }0 O f* M) \
{
; {, ~; a" \: v' ^
//使能Uart1
7 }3 w0 R% g0 ~( h
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( x1 ~; e* y0 o% @, e3 L/ h
* o, ]9 A" d7 }6 h5 s5 ?
// 使能 UART1禁用流控
/ u: X4 p, M$ ^) t
UARTPinMuxSetup(1, 0);
' L/ g/ t' q/ @ I
4 Y2 t! |# m" k+ O$ F6 `) u
// 波特率 115200 数据位 8 停止位 1 无校验位
" V; b) c2 K1 a) A
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
, F: k1 d8 e# j6 A4 V$ S q# Z& D
! v- k; T+ t3 M! j; C( i1 l
// 使能 UART1
3 G* [2 ~7 U' j7 a
UARTEnable(SOC_UART_1_REGS);
6 d o2 q4 Z- Z3 z
// 使能接收 / 发送 FIFO
/ R, Q' O5 x+ N% s- |- [1 z/ m3 I
UARTFIFOEnable(SOC_UART_1_REGS);
8 N [; R7 T! V
// 设置 FIFO 级别
9 y5 s |/ P$ t' @
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
0 l( K2 G' J6 q7 w& n8 a( X
//Uart1中断使能
" T6 ?- Q* D) Z$ v: r
unsigned int intFlags = 0;
y1 u# X& k) f1 x2 I- d7 M1 Y$ o
intFlags |= (UART_INT_LINE_STAT | \
; F* V! F1 r6 m+ ?. B* e" ]% X8 j
UART_INT_TX_EMPTY | \
+ B& y3 F$ |6 x9 u3 m7 \/ I
UART_INT_RXDATA_CTI);
6 A: x4 u( a) _
7 x4 \! U2 h {6 k' ^
UARTIntEnable(SOC_UART_1_REGS, intFlags);
+ P5 N. Z- }8 y( x3 ?3 [% V" u
}
: ~( @* E. g" U# c4 Q" G# O- y: ~
//UART 中断服务函数
9 ?' n5 z8 p' ^4 v
void UARTIsr(UArg arg)
) @8 N6 t% X3 l' Y# G7 r! o% r
{
- j1 p& W( J; Q) F; V+ }" ^' D
static unsigned int length = sizeof(Send);
8 L0 U1 f$ x, m. R- z3 N
static unsigned int count = 0;
- R4 |3 u% f8 [' A# J6 N3 p
unsigned char rxData = 0;
4 L9 M3 P) ?+ e+ ?$ r, R
unsigned int int_id = 0;
# K" \( W+ o2 d( U" ^
// 确定中断源
) q% ^0 w1 M; A, ]! J$ x8 V, ]2 R
int_id = UARTIntStatus(SOC_UART_1_REGS);
! ?! R$ O/ Q2 F& l" \2 N6 W
// 清除 UART1 系统中断
. l6 M- `- e$ Q) w1 I
IntEventClear(SYS_INT_UART1_INT);
- }& `8 B" M- Q8 \
// 发送中断
/ c. C5 X+ o/ {2 _: Z6 f% u' r
if(UART_INTID_TX_EMPTY == int_id)
9 G P' |: N- `
{
4 m9 d$ L1 p0 @1 _- \# _/ A
if(0 < length)
1 X0 s' l* p0 k
{
" `0 G+ ?/ T, |. B( j
// 写一个字节到 THR
9 s5 n* {; t& e
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
" U% {/ l; {5 k6 y. ?* u
length--;
& b+ o! `5 r' C; A4 z' N
count++;
" K+ ]' W) B9 V) t. P5 r' ~
}
3 \; V$ x. Q) A) c: m: E7 v! [& \
if(0 == length)
2 b- X- \/ o. A
{
7 E' O5 _! t: \/ S9 ?9 e
// 禁用发送中断
7 g! ^' d) B k; D
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
9 N* ?! |8 V3 C6 s7 w1 K
}
8 G( z. V- P: {8 j$ d3 `
}
l% Q# Y6 j. @7 c7 N1 Y
// 接收中断
1 w6 P n0 R& p5 ?$ J" k ^
if(UART_INTID_RX_DATA == int_id)
; x3 z4 N( m. _ [! e
{
, |, S' c" ]6 e
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
( a4 e( g5 f* l: L8 i5 N" ?
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
: z+ [, }- @- w( ]# I
}
% c) i! @0 z8 M0 w6 t: m
// 接收错误
% |/ o' i8 s1 e! b) G. h: O# i
if(UART_INTID_RX_LINE_STAT == int_id)
% L+ @ ~5 G; d
{
) Z, |# y* |) }' m
while(UARTRxErrorGet(SOC_UART_1_REGS))
7 [9 I W, f) \1 y* t: K2 H1 r7 t
{
& H% _' R# v1 O/ `
// 从 RBR 读一个字节
) X. b$ s1 D2 G# e! k0 E- u
UARTCharGetNonBlocking(SOC_UART_1_REGS);
& D- I% @! s0 e5 W( h. G
}
/ A; A1 H( Z) j4 s- R5 g; K
}
1 T t0 ?/ f! d* _5 Z2 P! G. s: H
return;
! a/ S$ l5 ~! O ]) B; r6 ~
}
6 m( H: @- A2 k( @ k% n
Int main()
& P8 @, B/ o! s; }
{
; {" Z# O0 L8 I4 @/ y
UARTconfig();//uart 配置
" d# Q: h* i. o' z" m
Error_Block eb;
5 S6 E2 Q' W$ A: t$ u1 a3 t9 F; e
System_printf("enter main()\n");
1 n- s, `( b0 V/ X: S, h5 W0 n
Error_init(&eb);
" {6 n- ]! g( C, V8 R
// 动态创建硬件中断
/ [2 Y* D, k# F1 U- W
Hwi_Handle hwi1;
8 C f! u, c2 z1 S0 X: @% A2 d1 w
Hwi_Params hwiParams;
, \: R6 `# ^2 o3 ?/ S; H0 {
// 使用默认值初始化参数
0 K% \8 K0 K1 S3 e, O% Z2 h$ O: w
Hwi_Params_init(&hwiParams);
, K$ b" N% w0 I8 m' N H( u$ z5 u* O
// 中断事件
0 e7 f% n* q9 s8 a
hwiParams.eventId = SYS_INT_UART1_INT;
- q' Y. b, x* A' u
// 传递到中断服务函数的参数
4 W7 h8 i4 C6 j7 l# ^+ w, U+ I
hwiParams.arg = 0;
' t+ t. @/ `3 M* ]( c; B2 X) F
// 不允许该中断自身嵌套
( F4 I! z" w; y2 D! p
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
5 D1 `' Q5 M7 R1 S8 C6 X
// 使能中断
: e% I; J0 v1 y7 a) H9 I
hwiParams.enableInt = true;
0 S% H4 f' n' a4 h7 r% f
// 可屏蔽中断 4
\# W* }: Z8 i0 l1 D% o
// 中断服务函数 hwiMain
* x- Q; {* W1 a. _
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
* d/ i6 y2 |" K( h1 N
if (hwi1 == NULL)
4 M9 t/ h x* L; H2 X; H
System_abort("Hwi1 create failed");
( _9 N* ^7 {' B' N% K4 K
BIOS_start(); /* does not return */
+ \$ I, V0 c9 z1 m$ Q1 u$ @4 h6 F
return(0);
. I4 n4 I, c) W/ `; L8 q
}
% Y: h% \- E- q* e
) e) l" C( \+ F, R
作者:
希望缄默
时间:
2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
: Y1 ^. @) Z! s1 t8 h& r
作者:
Greatwang
时间:
2014-12-1 21:49
在中断服务函数里放置断点
! J8 b& t$ S* x1 }1 o7 j& U( N# q/ s7 F
作者:
希望缄默
时间:
2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
( o9 N: D2 t: w; c0 U
在中断服务函数里放置断点
~/ A$ W1 B/ l+ |! B# f2 e
参考 GPIO_KEY
" g& k- O, Y0 W2 n5 T
作者:
cchwhk
时间:
2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4