嵌入式开发者社区
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
[打印本页]
作者:
Greatwang
时间:
2014-12-1 14:52
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
/ e+ l* H) j( c% ^0 E1 C4 S% ^
// 发送缓存
1 i- ~3 l2 L2 P0 t9 V/ K7 |
char Send[] = "UART1 test......\n\r";
v5 V1 z# T+ a( l' v( r1 ~
& v6 K1 `5 O3 S9 G( P
extern void UARTconfig()
5 d) c3 u% u. ]7 h$ T
{
# M7 V. L) d5 s% b) D3 ]
//使能Uart1
6 a0 X) n% X3 z Y" _* n" E
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. q' E7 M5 d- F5 D
8 w2 u8 z5 [9 q! x# X
// 使能 UART1禁用流控
( `9 @4 Q3 `$ r# j, Z
UARTPinMuxSetup(1, 0);
0 p0 K, K5 ], H: h
. v& P' x, V4 A8 ]$ W+ g
// 波特率 115200 数据位 8 停止位 1 无校验位
1 ]6 ?# R6 s* G$ X l
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
" j5 w) W6 h! p7 ]. Y5 I0 \
1 D( ^ _3 h, z. y+ j
// 使能 UART1
0 K l# {& s' B
UARTEnable(SOC_UART_1_REGS);
4 r, T) z: w; e# I! p8 m3 B
// 使能接收 / 发送 FIFO
* P" n0 s) s8 q$ c- N4 Z
UARTFIFOEnable(SOC_UART_1_REGS);
* O. j7 ~6 i, G" C, u
// 设置 FIFO 级别
* @& ]9 y& J( b. c: I* w( `
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
( @* v& D; i6 s
//Uart1中断使能
) y* r1 ^0 T; A, Q. f+ I% Y
unsigned int intFlags = 0;
, X; [# c1 Y) J z5 k
intFlags |= (UART_INT_LINE_STAT | \
$ t6 ?7 s5 e/ c! ]0 p) N
UART_INT_TX_EMPTY | \
$ }% }6 r+ X& r ~5 A/ i, Y
UART_INT_RXDATA_CTI);
+ b, u3 ~' N. ?/ `
: O8 X9 R# n R4 d
UARTIntEnable(SOC_UART_1_REGS, intFlags);
4 w& M; R; r0 L w# v4 K( E+ j" F
}
1 b) J5 ~* T5 x
//UART 中断服务函数
/ \2 j6 Z6 Q8 z/ f
void UARTIsr(UArg arg)
6 B% P1 |+ T3 y2 }3 Z* P
{
/ p* M5 D* z( X+ L5 |
static unsigned int length = sizeof(Send);
/ I9 X& A! t. V, o5 ?+ L4 _& i
static unsigned int count = 0;
' @4 u/ K) x( b. ?; N8 A% t5 N2 P9 V
unsigned char rxData = 0;
- v$ ?+ ?# r! R$ T& u$ p+ S1 d
unsigned int int_id = 0;
1 L) g- `* L# h' Q' f
// 确定中断源
5 a P7 T! e6 e$ ^9 \
int_id = UARTIntStatus(SOC_UART_1_REGS);
6 N) d& U/ B% W2 y6 k [
// 清除 UART1 系统中断
# S @9 p+ I, z; ^. N. B
IntEventClear(SYS_INT_UART1_INT);
8 n: A% C/ V6 S2 a' E
// 发送中断
& H- E T5 u1 I$ {7 d0 d1 [# }9 Z6 t
if(UART_INTID_TX_EMPTY == int_id)
1 b4 C2 x9 _" P e# \
{
4 ?+ J/ ]* A; \- b3 e
if(0 < length)
0 c' \% Y' \; P% n# W! |1 l( L
{
' m: ?8 w8 Y/ l' r1 A
// 写一个字节到 THR
! f$ J3 ?8 D- X5 f+ H3 O7 g
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
/ z+ f% N+ I- x7 S3 z3 g% s& g# l G
length--;
" l& [$ D: j7 T5 Z
count++;
7 m) z2 I, w. B/ s, G/ A
}
" o6 b: Q2 ]* T8 F
if(0 == length)
" W; `7 J1 Z+ b2 A& v9 S
{
$ k2 v4 c9 Q, q4 C
// 禁用发送中断
; y' y& E* t# Z- O
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
% V0 x, ?1 v4 z0 I. Q
}
. Q9 l4 z9 e1 v( z9 H, s6 `& q
}
/ U6 j H2 o1 h' C1 Z
// 接收中断
, w# _* T# A' U( K% q p3 v4 {
if(UART_INTID_RX_DATA == int_id)
/ q: D* w9 W S9 U$ ]9 S2 v3 m+ Q
{
( B2 J. U7 R9 c' D7 g5 n
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
" I* x. a* V7 h" H. i% F: A
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
" Y" X( W |- y8 s% o3 S' M6 G5 p
}
# X# r. P$ b4 w$ B" {
// 接收错误
( _% `$ Q! w9 v
if(UART_INTID_RX_LINE_STAT == int_id)
+ i/ m. J+ x+ U
{
$ j* ~; q) Z. l7 V# l! {7 {
while(UARTRxErrorGet(SOC_UART_1_REGS))
4 L2 E/ i/ r: M8 k2 Q# U, Y" d4 ?
{
m; e3 O$ V& P5 u2 Y8 c+ {
// 从 RBR 读一个字节
% [$ h: S, L# g+ Q' Q; D3 Y% U
UARTCharGetNonBlocking(SOC_UART_1_REGS);
( h- @% `4 c$ M; M# x8 ~$ i
}
3 @0 ^. K- ~4 g
}
b8 V. r) k, ~1 ^% N
return;
* F; p# }: M& T# |, K
}
# i6 m/ ]# x$ y3 L( l0 v, M
Int main()
5 K" p& o9 R a( S/ o2 E& }) ~
{
$ k9 x5 h8 w6 T0 i! Q; f. t
UARTconfig();//uart 配置
5 s& V( {3 Q) w* m% \( S
Error_Block eb;
9 T, T1 D% o7 r/ @
System_printf("enter main()\n");
* O9 X: i1 o* ?) e1 B1 ]0 M
Error_init(&eb);
, c i4 c4 J) T' U6 N4 ?+ L; g
// 动态创建硬件中断
( i R1 @/ W+ f
Hwi_Handle hwi1;
% G# l$ F5 Y: b$ ]6 F# u9 Y/ d
Hwi_Params hwiParams;
% i7 q: n' k, S+ l' I
// 使用默认值初始化参数
5 R" q0 b$ j. W
Hwi_Params_init(&hwiParams);
4 t' f' ~6 k" d5 l4 H: u; R- e
// 中断事件
; ?( J/ l: u |8 b5 Q+ a" E: `
hwiParams.eventId = SYS_INT_UART1_INT;
& w8 \0 ]# C" o$ Y
// 传递到中断服务函数的参数
7 W* P& ~6 m2 m+ K3 K
hwiParams.arg = 0;
! D% o3 \% \ W6 o
// 不允许该中断自身嵌套
`2 N0 ~, B# u6 {
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
+ J7 @2 J2 h* W0 P2 O6 s9 K
// 使能中断
$ Y7 C% B& f# x @/ y) f7 i' M
hwiParams.enableInt = true;
, F/ l/ n1 _: a- b1 z+ x l" v
// 可屏蔽中断 4
' W% w2 d$ U5 v& |4 Q1 k
// 中断服务函数 hwiMain
' {: {3 I: F4 q2 B& y$ x
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
% k' Q- w/ W- c& s
if (hwi1 == NULL)
) S: a% W4 J! Y& p- ^! i
System_abort("Hwi1 create failed");
1 G1 D" {8 w; `; h5 Q
BIOS_start(); /* does not return */
* g4 l- r- x2 x$ H
return(0);
6 B9 }1 e; n3 Y" D0 Y
}
! q- {# u& z) q# H* c! R- l3 S
! Z0 u# Z& K; u% e0 p$ T
作者:
希望缄默
时间:
2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
2 ?6 F5 N9 D' W9 ?7 i+ j
作者:
Greatwang
时间:
2014-12-1 21:49
在中断服务函数里放置断点
@8 T% E! @! t3 W g9 p1 M/ B2 J
作者:
希望缄默
时间:
2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
- ~/ t' w2 J, O+ ]6 s, [/ C6 |
在中断服务函数里放置断点
3 s+ h1 t' t4 ~$ W
参考 GPIO_KEY
- f, `- B+ T3 t, ^, f* W9 l4 J
作者:
cchwhk
时间:
2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4