|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
0 q# v+ m. {* [' z2 |- z* ~// 发送缓存& X8 l( l# p/ h0 I
char Send[] = "UART1 test......\n\r";
S; [: `/ c- p o6 q, M( R7 J+ i4 j7 U7 P7 h/ Z6 Q* Y" R
extern void UARTconfig()( i$ U- p* [3 b; y7 F. P5 r
{
+ k+ u7 i( ~0 U- s8 t //使能Uart1
i+ H$ o, U0 x( ] R: R' r' j PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);, p( J$ m5 t6 ]$ {4 c1 e% H
* Z$ b% n! |2 O7 F
// 使能 UART1禁用流控/ \( j9 a/ N8 Y8 }4 D* p5 ^
UARTPinMuxSetup(1, 0);
4 x( F; q; o9 ^' v+ x/ N / G& c& D3 K' N$ d) w1 D7 v' S
// 波特率 115200 数据位 8 停止位 1 无校验位) O- q- K* E5 M% W' @- p
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);6 H. r$ }5 ]; Z: ?7 S# o% s% g
T3 _* l+ K7 B; c/ Z; }6 j
// 使能 UART1) n& q- f% r! M! L) `6 N' M; n) k
UARTEnable(SOC_UART_1_REGS);' l. \1 u* d( X( \
// 使能接收 / 发送 FIFO I: k! w# P- X6 `
UARTFIFOEnable(SOC_UART_1_REGS);- T H; Y, P+ r
// 设置 FIFO 级别
. \- x* a" v5 j9 B( i UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);5 l2 t- Z! Z- N
//Uart1中断使能
5 {+ t' q5 f @! |% m unsigned int intFlags = 0;5 C4 ?2 N! D0 N9 |( D
intFlags |= (UART_INT_LINE_STAT | \8 t4 C# j( I' u8 d
UART_INT_TX_EMPTY | \+ v) F: y6 H& j6 G2 H" r
UART_INT_RXDATA_CTI);& s7 [4 _7 d3 S
1 E- b' A. q. |9 Y4 H m+ I
UARTIntEnable(SOC_UART_1_REGS, intFlags);
) G* i. q7 f$ ^" c! J& i1 I8 ]1 M}
; K) G4 i* \+ o# }. n+ {//UART 中断服务函数
/ T% G5 y# k2 A6 u" Ivoid UARTIsr(UArg arg)
% L8 A& g+ q/ j8 `{, N* }) O8 b! |9 o7 h5 e: @
static unsigned int length = sizeof(Send);
: n9 v" ^1 i9 x7 g- S) k static unsigned int count = 0;
! G+ r& q7 T7 h" w- ~4 Z- \ unsigned char rxData = 0;
' Y5 V8 n8 o$ v( p) N f unsigned int int_id = 0;
5 E) |: n1 e2 [. Z. @ ~ // 确定中断源
4 H W3 l0 b: \ int_id = UARTIntStatus(SOC_UART_1_REGS);1 ]' v) V1 y& i( j; Y! G) s _ y
// 清除 UART1 系统中断
6 s1 H5 }, ~; t" Y& h7 G IntEventClear(SYS_INT_UART1_INT);7 S9 {; U }" k) a! K& [7 n
// 发送中断
2 T+ i; C1 i* X if(UART_INTID_TX_EMPTY == int_id)8 R" {" o$ o& Y& ]! E; X9 `. G% `/ t
{
& ^/ L3 M C/ {! ~; G) n! c if(0 < length)
3 q' L$ M5 |. ^0 S. `& f ~# J {
5 Y5 p8 l; O" v9 ?- c! O* S1 b2 L // 写一个字节到 THR$ Q2 T( V4 I* e) u9 h: r3 w6 Q
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
$ q+ }) z6 X# { W! } length--;9 D2 ^3 t8 s7 ]: B2 L: S6 r% }
count++;5 Z* F7 |. Q5 k: b! a) v3 K x$ E+ Z
}
" @" g! h8 d8 T4 {5 O. {4 F if(0 == length)7 n B1 ^; W) P8 x/ u7 d
{
+ r' M" f/ N/ Q* l2 r+ u // 禁用发送中断
# a# z5 t1 |" N- \; D UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);/ v1 p# d0 y2 ]. }3 H2 Y0 \
}- E7 T z7 `+ `/ h* N' O
}
0 X4 C( n: o. K! j: N# v) P, A // 接收中断; l$ G0 g3 m# E9 f4 c. M
if(UART_INTID_RX_DATA == int_id); X4 I$ \6 A1 t0 A8 J
{
8 m/ U" U# J0 ^8 Y: } rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
z/ G# Y/ D, W0 A+ i7 Z6 S+ r9 ~ UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
# |9 R x, _3 G! l' h% R } u; {) j. _8 L
// 接收错误
3 G5 [3 c. x+ w& J; O if(UART_INTID_RX_LINE_STAT == int_id)2 {+ S( C9 s4 J3 H+ J4 g% U
{
# P7 m. Y- F! y4 n6 L9 { while(UARTRxErrorGet(SOC_UART_1_REGS))" v# W& q) u, p4 W7 _
{
, m( j. |- J$ U3 u3 o" i1 j% B! K // 从 RBR 读一个字节! O& ]5 B& X& T1 a1 d7 {$ B: Z& O
UARTCharGetNonBlocking(SOC_UART_1_REGS);
5 ]' X& k! |! C4 j1 s9 o; R6 D }' W2 [$ ~: }- g& E' e4 _" {) z
}
! D6 Y5 v' L1 n+ y- {+ Z9 j+ T return; L8 I, u, y @9 H. B" @
}
5 M U: }/ m6 iInt main()
% g- F$ q4 ?5 b# ]+ ~{ ! ^- s9 a$ X* }9 m+ W
UARTconfig();//uart 配置# g. Y6 v, F6 h# A* Q
Error_Block eb;
: D% T+ W: c/ h" b$ S% S System_printf("enter main()\n");. V# p# O0 s$ \! M/ e! R
Error_init(&eb); Y4 q; Z( q6 A1 |
// 动态创建硬件中断0 }* [- x+ A2 b% D0 d3 m& l
Hwi_Handle hwi1;" E8 T6 w5 o' N7 y$ [% P
Hwi_Params hwiParams;
3 r( |9 ?: [/ v$ t/ x. I // 使用默认值初始化参数
& G k" l+ s6 [' i9 T/ i$ c" P Hwi_Params_init(&hwiParams);
, e1 O1 y! @; A* p // 中断事件
1 w( y7 m8 [9 N2 D ] hwiParams.eventId = SYS_INT_UART1_INT;
3 M& w( P" S: S; } // 传递到中断服务函数的参数, M1 n7 q0 J Q U- `* g \) K
hwiParams.arg = 0;
% }/ S: b/ u. k5 L; Q' d // 不允许该中断自身嵌套
( _1 ^# [$ K# ` J F hwiParams.maskSetting = Hwi_MaskingOption_SELF;
' q/ ~, O) Q- A; e' V7 w0 o // 使能中断; M; q' {$ i! w0 {. W( I
hwiParams.enableInt = true;
. W4 k: t* v$ S // 可屏蔽中断 4( J* `# m! ^* q& d
// 中断服务函数 hwiMain ~6 q4 w( |) y' w' h+ `
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);+ p- H U2 G! H4 s0 @
if (hwi1 == NULL)
& l2 q0 ?7 m: d) U" j System_abort("Hwi1 create failed");& B2 X6 K6 X( s: k9 m) J
BIOS_start(); /* does not return */& Z2 M x) Q& A, O% Z
return(0);3 c& m: f, p6 T4 F. A) s- h& n0 w
}( W/ V4 n7 {- \5 g
6 o4 h3 z" S/ I$ [) f \% P$ { |
|