嵌入式开发者社区
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
[打印本页]
作者:
Greatwang
时间:
2014-12-1 14:52
标题:
在sysbios下,uart中断收发数据,程序无法进入中断
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
" \7 n! _% s9 ?; A2 E' p( w
// 发送缓存
% X0 O: }1 W5 @+ v3 u$ e3 P. p
char Send[] = "UART1 test......\n\r";
& z( K8 S. A8 S4 k8 ~+ R
: X+ e0 u! E7 U$ r* G
extern void UARTconfig()
, w, c) o% \: K/ ?
{
0 @" L2 V! L" U4 f# Q' X, T% N+ p
//使能Uart1
$ K8 ]0 N1 d, g' @- s* w
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ q1 v) W1 o$ l/ O+ K$ T
; H; O% F0 W* j, J$ S; F( ^
// 使能 UART1禁用流控
) R" t+ G1 Z& X( B2 G/ A- {
UARTPinMuxSetup(1, 0);
, F4 L ?! P6 U/ H: I+ b! ?
4 M8 e. w4 l+ j# @% T+ z" Z
// 波特率 115200 数据位 8 停止位 1 无校验位
+ h$ n" B) @$ D
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* y8 B/ H' G* Q {7 ^3 F" ]
( f4 a3 ~' l D3 s
// 使能 UART1
% {; q- x7 j* A, F; \$ l
UARTEnable(SOC_UART_1_REGS);
5 @4 I* ]& _' D$ r) ]7 Y7 D
// 使能接收 / 发送 FIFO
8 q, k/ _8 C% j8 S. g" ] e
UARTFIFOEnable(SOC_UART_1_REGS);
7 e' s. Y* ]& T% n3 E' J
// 设置 FIFO 级别
- S6 D2 T; G# e+ \6 ~7 t: V
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
4 l: C2 _4 P/ X
//Uart1中断使能
6 I+ c* E$ p' j: I' L9 B6 _( e
unsigned int intFlags = 0;
1 ?8 s5 f. ?6 f6 R# V+ ^% x" [" f
intFlags |= (UART_INT_LINE_STAT | \
p5 v; v" v" N7 x& k
UART_INT_TX_EMPTY | \
( W a: I# x+ S. I
UART_INT_RXDATA_CTI);
* W e( @) t7 T+ R
# I X1 ]# h5 `$ ~3 k3 E/ E B% i" D
UARTIntEnable(SOC_UART_1_REGS, intFlags);
, l) G. B1 u2 G3 V( ]1 m/ \
}
: ^# a0 B T8 F# k/ Q; O
//UART 中断服务函数
& e5 E: P- P5 V' G# d4 w
void UARTIsr(UArg arg)
& m2 S- A- V1 o$ `' o6 I0 [
{
' f% w, H( M% t& j7 _) A! z
static unsigned int length = sizeof(Send);
6 [# T- z! {+ S9 E+ U# j& m
static unsigned int count = 0;
. U" U; s! C) F' C6 A
unsigned char rxData = 0;
7 Z/ A$ h/ z8 V. P! A. H9 h1 Q
unsigned int int_id = 0;
) L1 P3 i& w w" }- d
// 确定中断源
7 O4 n* V$ w3 j. [
int_id = UARTIntStatus(SOC_UART_1_REGS);
l2 Z/ O3 L5 Y, _, L) J( H
// 清除 UART1 系统中断
( ^9 ~2 Q4 H/ y s( Z
IntEventClear(SYS_INT_UART1_INT);
: T0 k+ ^6 w+ A% R, \- w4 L
// 发送中断
2 A- u& C: L7 _+ M) b' E
if(UART_INTID_TX_EMPTY == int_id)
$ d, s3 I$ N' Z+ v! T
{
. {8 Z& h1 a/ D0 [- g0 Q* s
if(0 < length)
+ C8 W4 d- t5 _7 t9 r$ u
{
/ ~6 F- e+ j: M9 h& }" X( A
// 写一个字节到 THR
/ Z- m+ f; c( i1 _1 a" R
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
6 \) B$ {! U; N7 @! `( h2 {$ J
length--;
9 _6 P$ u" c) c$ W
count++;
' d K) d, y# c- T
}
) S3 q, h |' }& ? @9 t
if(0 == length)
/ o$ C' q p8 M) r/ A& S/ v
{
2 m5 `( X; a% k1 }8 [3 H; `
// 禁用发送中断
+ A5 b! M; r1 u; U8 v
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
" }9 r6 Y# H5 g$ X
}
: V0 C5 y, x0 d/ P7 o6 a* e* z2 B
}
: s' }8 O( }3 E2 \% V8 U
// 接收中断
7 z% x7 M- B* i$ a
if(UART_INTID_RX_DATA == int_id)
n7 }' ^: x% d8 ~1 l9 ]
{
" e0 W/ \1 n3 u( R! e
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
* I1 j1 X" V- P; v8 ?* {, y
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
( ~: F7 x- R8 }# a8 z- ^
}
. f8 o H1 n+ l% G7 g- t3 g& ^1 t
// 接收错误
6 }, j! W) Q1 s7 V5 t
if(UART_INTID_RX_LINE_STAT == int_id)
) H' ~9 B. [3 U& v8 h
{
3 T( q* C" \8 ]/ P& g4 P
while(UARTRxErrorGet(SOC_UART_1_REGS))
8 b" l7 |/ o' Q% ~- U- A7 O
{
8 J- { f; `$ u: @4 {5 k
// 从 RBR 读一个字节
; t" V B7 ?6 g W! ?% |
UARTCharGetNonBlocking(SOC_UART_1_REGS);
& V( e+ ^" d8 V3 |+ w* K! y
}
- S3 @4 Q5 r4 H4 ~; `' ?% h
}
- @, m' ^* O( \" a
return;
, r5 v7 D. t6 [+ O0 e) a
}
) k3 C! \- g$ V
Int main()
$ e! j' z' ]! W$ ~* g
{
+ i+ N( x2 J- |/ E
UARTconfig();//uart 配置
" t' D! p% @ G6 U6 z' g
Error_Block eb;
$ O" O6 K0 E% g' e' d3 E1 A
System_printf("enter main()\n");
) f* Y+ Q2 \0 \1 }
Error_init(&eb);
% M0 F, [' u' c* @8 U
// 动态创建硬件中断
% N p p4 A! J
Hwi_Handle hwi1;
! x$ k" W! a; ^0 Y! |, b; q
Hwi_Params hwiParams;
/ T2 }% O1 d/ T* N+ A5 p2 C' Q- e
// 使用默认值初始化参数
0 V. Z# q( g; ?# b* c* g; m
Hwi_Params_init(&hwiParams);
P. l5 U; T2 w' m( e8 v
// 中断事件
/ q6 s8 U7 t! X) X2 t3 P) o' U7 X
hwiParams.eventId = SYS_INT_UART1_INT;
6 t$ g1 G2 U* Y' H" H5 s
// 传递到中断服务函数的参数
1 D( e6 [- A: E) U+ w, |- I) R
hwiParams.arg = 0;
* s0 U' q5 ~6 n
// 不允许该中断自身嵌套
" @1 o: h8 m3 v/ S' |0 t
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
$ V6 }# `3 n% l; _7 r( i" _
// 使能中断
7 u0 m6 U* ?* W* b$ S
hwiParams.enableInt = true;
4 Q I* {1 Y! z+ Y) d2 B+ y0 ?
// 可屏蔽中断 4
3 g" Y! c7 Q, O4 a G
// 中断服务函数 hwiMain
' [% S, b1 U2 \$ L! j8 K
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
) P. f- D5 A: k9 C4 y: O! h
if (hwi1 == NULL)
o2 X' f8 b( |9 g1 M( d+ c
System_abort("Hwi1 create failed");
! O( V5 ~' v+ ?' ~
BIOS_start(); /* does not return */
7 |0 E; ^$ j. e% [& C2 a W
return(0);
- \% @3 m( R8 [- a {+ X
}
: o- Z! u/ x. o) N
' n9 I' ]0 w. `
作者:
希望缄默
时间:
2014-12-1 16:21
你是怎么判断没有进入中断服务函数的?
5 c4 u3 Z# {" G, S
作者:
Greatwang
时间:
2014-12-1 21:49
在中断服务函数里放置断点
, \# ]4 T) u7 J; ~6 g/ n0 n1 H
作者:
希望缄默
时间:
2014-12-2 11:11
Greatwang 发表于 2014-12-1 21:49
; n/ K' H4 Q+ o. D
在中断服务函数里放置断点
) c. o6 U. ]/ j% h" [
参考 GPIO_KEY
6 t/ r% |: i/ Y2 Q6 v& U. {
作者:
cchwhk
时间:
2016-8-1 21:05
请问你解决没,我现在也遇到这个问题了
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4