嵌入式开发者社区
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
[打印本页]
作者:
Greatwang
时间:
2014-12-1 14:52
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
0 M& g. A( Q) o9 j4 w& Y H
// 发送缓存
6 a7 W+ d) p& V
char Send[] = "UART1 test......\n\r";
. m! T% |8 _1 a& L
4 j. K" g/ o' l4 H9 }
extern void UARTconfig()
1 I, \1 O5 v9 D* E# o" A6 J4 F
{
4 d# i- @& h# n; O) X1 B o
//使能Uart1
6 r) D# x8 L0 T& G
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 |. D7 I6 i7 F
, L" F. Q# e1 n5 e) l3 |
// 使能 UART1禁用流控
; _1 n7 C# V, t+ x
UARTPinMuxSetup(1, 0);
& U7 c5 M( x# E2 _( D3 l7 a& I
- [; ~ d2 H, P
// 波特率 115200 数据位 8 停止位 1 无校验位
* }# D* ?3 |& S; S8 G' f; l4 c4 i
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
" J4 a3 V4 t9 N( e4 m0 p ^
; l4 c0 s: R% F/ l: m* L
// 使能 UART1
7 S- W# N6 M/ O3 l% s$ l* P
UARTEnable(SOC_UART_1_REGS);
" C9 r; k/ Q0 k: E
// 使能接收 / 发送 FIFO
: x/ @$ G! D- w+ e0 {
UARTFIFOEnable(SOC_UART_1_REGS);
, y& u- d- h% p
// 设置 FIFO 级别
+ W! I( f3 I4 k' O6 C5 D
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
* b8 D$ |5 A8 n9 C: t, E2 e
//Uart1中断使能
' M) `! ` b8 A$ P0 U9 o- I! m
unsigned int intFlags = 0;
5 \! X5 d% f; r& [
intFlags |= (UART_INT_LINE_STAT | \
) _! q# m/ ]" [2 p- [/ `) _
UART_INT_TX_EMPTY | \
9 [0 b/ b1 K+ V6 K7 M$ |1 _/ m/ Z1 @6 {
UART_INT_RXDATA_CTI);
* K0 P) I" G- J. J: [$ H H. z
. H$ T3 W- b- o3 Q
UARTIntEnable(SOC_UART_1_REGS, intFlags);
% k5 k; Y- T+ |
}
0 x: E% l5 J! \* {
//UART 中断服务函数
7 F% t. l0 h2 u* S! [7 E# j
void UARTIsr(UArg arg)
4 |' V( m1 A8 I! Z) l; W
{
' X1 I2 ` K: q( k( d$ E
static unsigned int length = sizeof(Send);
" M4 }# ^2 L @3 l/ |5 k
static unsigned int count = 0;
' U8 m; v, W4 k) C2 H0 ~. z
unsigned char rxData = 0;
4 o1 ?/ p8 y, t) _ i
unsigned int int_id = 0;
# y- Z) m9 m' L) t& T }7 a
// 确定中断源
: w7 q' l) ~- u! I% }
int_id = UARTIntStatus(SOC_UART_1_REGS);
8 |! Q% Y, p: P# H7 T; R
// 清除 UART1 系统中断
) J# o. x) O" m8 ]: Q
IntEventClear(SYS_INT_UART1_INT);
5 Z" \, L0 W" h4 V2 v
// 发送中断
$ {& M6 \* w' B$ x! n
if(UART_INTID_TX_EMPTY == int_id)
) ?6 N3 @% I: |6 Y
{
; K" K( @& Y9 _# S; e
if(0 < length)
u: {/ w" v: U
{
/ i% A* B, n' W* x
// 写一个字节到 THR
# v% a5 w' }" \. {+ ]: k4 V/ M! @$ ^9 ^
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
. F- x0 i( G7 y% d b: d
length--;
$ `7 O4 z# E$ J" w
count++;
' V# L: c$ W4 f. T U4 Q; d
}
7 z3 L- }! [: b& {7 i- F( ^, {
if(0 == length)
4 @! v$ S+ ~) l2 [
{
' }) O& _ @- w, G& e
// 禁用发送中断
% [: `4 ]8 N- r$ q: m% p
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
. a5 d- W$ o; \/ s
}
1 l. u) B) L* K9 k4 g4 X6 Y
}
( q6 }8 ~( Q) q, s; V. _
// 接收中断
, |8 |1 w+ B) q5 \* ] a
if(UART_INTID_RX_DATA == int_id)
# F9 T1 A% c" C# s- _6 o3 @+ K
{
& D) X! P8 ^$ T1 p, X" I
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
, ^/ \8 L$ O* G! N! h% D- ]' N
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
; x: N, d& H! y- e$ z- J
}
& z3 p4 a1 U" G
// 接收错误
, p/ ]3 P, s- m6 W
if(UART_INTID_RX_LINE_STAT == int_id)
) X4 s. n! K$ |6 Z! I Y
{
& Z* ?$ R* x5 e3 z2 D! O7 Q
while(UARTRxErrorGet(SOC_UART_1_REGS))
. K6 H6 W3 U, | `
{
! q; i5 d8 S" d- C+ I
// 从 RBR 读一个字节
* U' L1 U+ U) F. i. t3 A% q
UARTCharGetNonBlocking(SOC_UART_1_REGS);
. O% X- p% x3 |. [/ `& N
}
; a, S4 X& _0 ^4 i
}
# l: }3 E7 e* V; p, d
return;
( f# |$ y) l. c, ?# G" ?2 Y) A4 b+ r
}
' ^( y# I7 @, V' ^% d6 d8 B" E- a
Int main()
' A5 d3 f) U/ C1 Y, g/ z$ [. M
{
( p0 E4 M6 A% [# B: }) }( m7 o8 X
UARTconfig();//uart 配置
4 [+ N5 s, ~$ y( ]4 w" A
Error_Block eb;
/ f% S, c' g0 F$ n
System_printf("enter main()\n");
" m0 R1 K5 i% h- g
Error_init(&eb);
" o0 M, o) x: |8 A
// 动态创建硬件中断
5 F2 W1 \1 I7 l# ]8 H4 r$ l
Hwi_Handle hwi1;
! n9 M8 H) x" f7 x$ y' ]
Hwi_Params hwiParams;
& s7 \9 f" B* R" D
// 使用默认值初始化参数
- F8 N4 J: I) d
Hwi_Params_init(&hwiParams);
, W" n B, F4 ~9 y
// 中断事件
9 z& @' _3 A0 M) ^0 ~8 ]
hwiParams.eventId = SYS_INT_UART1_INT;
+ f/ ]) G' N. J: }( k% A# O
// 传递到中断服务函数的参数
! B& C% x/ N# M2 O: c
hwiParams.arg = 0;
: j3 I$ \. ^% y! f+ j j0 ]4 I, Y! u# _
// 不允许该中断自身嵌套
0 N1 w: s+ X7 i
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
5 i3 G$ x2 z' n# ?9 ~5 ?- Q" R
// 使能中断
& T6 Y) o6 V* C8 A1 n* I0 \
hwiParams.enableInt = true;
" q/ ^0 `: }* w& N/ ~1 r
// 可屏蔽中断 4
* t% R$ O" f4 w- ]5 d, `6 o7 Z
// 中断服务函数 hwiMain
. G+ f/ |; v* q( w1 ]- C3 o6 B1 C) z
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
2 m1 b7 q' |" B4 S6 G a& n
if (hwi1 == NULL)
; I: r- M3 N5 j" V8 d
System_abort("Hwi1 create failed");
' `3 y1 E0 w8 m6 k
BIOS_start(); /* does not return */
1 V( s' {9 s& P: K* U) t% m+ M
return(0);
. R7 h: ~8 j+ v4 v; i
}
3 r9 P! G$ |: M: r( t3 q5 V7 ]
4 R2 h9 n4 P" F4 O3 g8 J
作者:
希望缄默
时间:
2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
; D2 e4 s9 V( p4 D( P4 H
作者:
Greatwang
时间:
2014-12-1 21:49
在中断服务函数里放置断点
, O) e: a+ y5 |, r* h
作者:
希望缄默
时间:
2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
1 z/ Y; O: m) L b, `9 H
在中断服务函数里放置断点
: j+ c$ J9 _( F& n$ f: e& W9 _
参考 GPIO_KEY
0 t5 ~8 s9 x+ C+ i/ ?0 A( o
作者:
cchwhk
时间:
2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4