嵌入式开发者社区
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
[打印本页]
作者:
Greatwang
时间:
2014-12-1 14:52
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
" m J4 z$ l. t) ]# s$ N( \3 H
// 发送缓存
0 R1 ]6 ?- X* [% X, @* U1 Q; ]
char Send[] = "UART1 test......\n\r";
$ Q$ ?4 [8 d9 ` B
: M: }1 ^9 q3 T
extern void UARTconfig()
3 b' _, N1 j( ?# w+ Z
{
_# ~) P$ s9 Q! Z6 `; r
//使能Uart1
J7 E, L8 ?2 R' x a: i) [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 H- S) B+ Y5 F" ?4 P4 L) Y
K7 P4 y! ^; r& F, K+ s; y
// 使能 UART1禁用流控
3 }& ^8 e3 }( G, c2 ]3 q( m7 z
UARTPinMuxSetup(1, 0);
5 J) C" V, A3 _' H
( q. Z' w' E5 A$ K9 |+ p2 r) i; ?
// 波特率 115200 数据位 8 停止位 1 无校验位
6 v' ] P3 b, u& e
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
- s% _; t- t2 i- n0 i- r
$ F1 N8 L% E" @) U
// 使能 UART1
" d' n; @$ j* J. E: e' j# j3 k9 \
UARTEnable(SOC_UART_1_REGS);
8 I' P5 f( c q% `
// 使能接收 / 发送 FIFO
1 {( l& j" F9 A* ?( I5 A
UARTFIFOEnable(SOC_UART_1_REGS);
! i8 _5 c" T& I5 b" H: G
// 设置 FIFO 级别
4 r, o% e3 Z( g- y3 _! I
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
. H1 k3 l- c! Q; y+ b4 c
//Uart1中断使能
0 t- d- y) L4 G8 K1 k% O
unsigned int intFlags = 0;
4 l# C c$ M: s" T# s
intFlags |= (UART_INT_LINE_STAT | \
7 t2 Q6 w7 T' P' F
UART_INT_TX_EMPTY | \
9 G" S1 o2 x. ~) W9 c( }
UART_INT_RXDATA_CTI);
0 H0 V) N$ i$ w% `& m7 p. i5 l' b
+ J; p0 j: P4 D A" N% E" ?& B( Q8 b
UARTIntEnable(SOC_UART_1_REGS, intFlags);
( g4 a8 H4 r+ k8 x
}
* a: X1 @! ]# S
//UART 中断服务函数
( c) }8 I0 S9 {( x* L
void UARTIsr(UArg arg)
: h8 s# ?. i! d5 `
{
% n$ n4 _5 c3 K
static unsigned int length = sizeof(Send);
2 \. p" I1 V6 c, _* C
static unsigned int count = 0;
" T" K9 Q0 \8 n3 Q# H6 Y$ E6 I7 _9 {
unsigned char rxData = 0;
9 Q3 P8 M V# _0 i- q) y0 ]
unsigned int int_id = 0;
* r4 w+ X [$ q! B6 O
// 确定中断源
6 Y2 K5 s5 b' o, T. Y8 K, g; V
int_id = UARTIntStatus(SOC_UART_1_REGS);
1 N/ {5 q/ T. [+ w; R+ J
// 清除 UART1 系统中断
* e! |0 [4 e4 P# ]/ T; S6 J
IntEventClear(SYS_INT_UART1_INT);
' b7 C' s4 @1 Z' k% E8 i C
// 发送中断
. J/ u5 `" ^; }
if(UART_INTID_TX_EMPTY == int_id)
- h. T2 l: |3 }3 i5 T
{
7 b6 K1 U; L/ k/ i; k( H1 s0 u
if(0 < length)
) t% k9 ]5 ~- _% @' m+ |% T7 v
{
# J4 g- S$ F* s) L" o/ c8 k6 O
// 写一个字节到 THR
) H/ q) }5 X6 N
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
3 `; t# M& Y5 E- s; L+ J
length--;
, f* J# l: N/ \4 o3 C3 }1 r
count++;
2 z& X) |8 G) @" V5 R# x. {
}
8 }' q& H" R1 z/ P9 m: Q( L6 `
if(0 == length)
% D, E3 S- S+ ?, g$ A+ W/ [7 U7 V
{
; z; c8 Z5 B9 d7 S2 q; c7 R
// 禁用发送中断
. E/ o6 R- e% U* s) p, K# Y
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
! T0 s. Y2 l7 ?" A; S( D. Y& r7 q
}
* O; h" Y+ g; ~6 k, ? ^+ g; ~3 _
}
- O+ F8 V; A. M( V$ T4 W5 m0 x' H
// 接收中断
% t( \# W. n: N1 S
if(UART_INTID_RX_DATA == int_id)
, ?5 L& D6 v* K
{
0 u }/ V1 T. K- q+ f) A
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
* y6 E; X5 q( h3 \ \0 x) `
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
) z/ |8 c" S6 r$ J/ r
}
* e, x' ?! D4 {% |& g
// 接收错误
4 o; ?$ q- n3 ?8 h' X
if(UART_INTID_RX_LINE_STAT == int_id)
y- L3 u( @! [4 w. t
{
/ c U: t! ~; k
while(UARTRxErrorGet(SOC_UART_1_REGS))
$ [$ e+ A8 w t7 g
{
1 p2 J8 n& x1 L8 Y% ?
// 从 RBR 读一个字节
. G) _: v% ?& X' H5 n/ P0 X
UARTCharGetNonBlocking(SOC_UART_1_REGS);
. K& C) l' g2 j5 z
}
* e6 {; i$ G" Q# E9 [7 A6 ^
}
6 M0 f2 R4 K5 z' M5 {
return;
4 s9 y/ T; }+ F! J* c
}
" f/ D3 T7 N8 w4 H
Int main()
5 Z, @; k6 w0 V7 O
{
1 Y: w4 k# |; H z# B* T
UARTconfig();//uart 配置
7 c$ f6 i( c# E) U9 N& x* |
Error_Block eb;
% q/ N# c* B7 T0 ^8 i( a# {
System_printf("enter main()\n");
3 h+ O5 C" [: {+ q# |3 m- h) s
Error_init(&eb);
: e9 ?. u' A" h; m! `3 {# p% K: K( L$ [
// 动态创建硬件中断
5 x# w9 o2 S& |4 a/ [4 G
Hwi_Handle hwi1;
6 H7 x3 S6 a5 p' C
Hwi_Params hwiParams;
" x% m: r* s- ]- O) y* ]+ _/ U9 M; D
// 使用默认值初始化参数
+ A% F% X' G$ F, i
Hwi_Params_init(&hwiParams);
4 A2 S- P! d. V+ l3 J V n: j2 Y
// 中断事件
. `/ l* f* a# s, G1 A& O ]
hwiParams.eventId = SYS_INT_UART1_INT;
& m# K1 r, [/ g4 [3 w, `- |' H
// 传递到中断服务函数的参数
% P2 \5 E$ X4 f
hwiParams.arg = 0;
0 ~' n" n }& v4 ~ R
// 不允许该中断自身嵌套
* I1 E: Z( j* j5 B' h
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
- r! Y6 s' c% ]- l% L1 r, N
// 使能中断
' ^9 q5 J/ Q( ^( W& ~1 d
hwiParams.enableInt = true;
$ m2 b2 E( y3 b) o9 O: o" s
// 可屏蔽中断 4
, f4 a$ w8 z5 ~. L1 p9 i' U2 P X, ?
// 中断服务函数 hwiMain
$ E: ~5 V! G- e% }9 {6 B
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
' p* ]$ x6 t. ~; P* w% p5 z
if (hwi1 == NULL)
4 P: t% C u! h! N( s
System_abort("Hwi1 create failed");
1 |2 r5 r% ~, P% k0 q
BIOS_start(); /* does not return */
2 {! R" |# c: z! P+ w- t
return(0);
9 T6 F' i- k( y4 p1 _ [* ~; @5 ?
}
" q" P& X: n- `+ Q' f
' U4 q |+ S& m( c* `
作者:
希望缄默
时间:
2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
6 S! [/ s- ^/ B0 J. \! X
作者:
Greatwang
时间:
2014-12-1 21:49
在中断服务函数里放置断点
1 s' W" \* x3 r$ j8 A; m
作者:
希望缄默
时间:
2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
6 T, ?! ^4 |4 j9 R3 G
在中断服务函数里放置断点
8 I8 J1 Y# `. Y9 m" w [( ~
参考 GPIO_KEY
8 p7 j( q9 K& j( [
作者:
cchwhk
时间:
2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4