|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下0 N* z1 g' U# x6 d
// 发送缓存. e# t) Z d8 e5 z
char Send[] = "UART1 test......\n\r";
0 d% c: Z4 z- g& M, l2 M
+ g* C: u2 G) ^( s: yextern void UARTconfig()
$ G- e$ A; I6 `9 c{
: B/ m$ r; Z1 |: B- [ //使能Uart1" r: ] |1 ~0 W& @; I! u
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);9 U0 u7 O( k& ^% H( _
/ D9 z) V* u/ F
// 使能 UART1禁用流控
g3 U' ~4 B+ Z8 k- s, V/ K( x& {% s UARTPinMuxSetup(1, 0);
& f. s# h' I& Z/ n) t 7 o9 k" o* m) t' m: h [
// 波特率 115200 数据位 8 停止位 1 无校验位
: m$ E" V. `& Q9 c2 y- K: G UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);" Z, ?, h7 j: b5 O& s
; d9 @" l, Z( Y( Q5 U
// 使能 UART12 Z+ |$ u6 O5 Y, l, c
UARTEnable(SOC_UART_1_REGS);- G+ _- q" `' j7 o2 z( j
// 使能接收 / 发送 FIFO
: a% O; N/ ^; q e: _9 d4 j UARTFIFOEnable(SOC_UART_1_REGS);
3 R) H8 C; { |. H) W# T6 q // 设置 FIFO 级别
! M0 O1 v; l7 G) S UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);, Z& K1 {2 @) c# w4 [
//Uart1中断使能
& y, }! w1 i" |1 } unsigned int intFlags = 0;; G8 |+ k8 v p ] r
intFlags |= (UART_INT_LINE_STAT | \
! j- Y: f% b6 W' Z2 a# d UART_INT_TX_EMPTY | \; y* @; @+ }% f7 p3 m" m
UART_INT_RXDATA_CTI);
% F1 R8 @4 x8 S# D# b% D* ^
; I+ ^3 `, w! z UARTIntEnable(SOC_UART_1_REGS, intFlags);7 L4 b1 K& O& E; J7 R9 U" m7 q
}
' x0 N2 f" e3 I8 T) e4 I//UART 中断服务函数2 g/ I) g' O$ U
void UARTIsr(UArg arg)1 d/ L1 K* U; A' i. }& Q) S
{
' l. @$ Z( F1 I4 S' q static unsigned int length = sizeof(Send);7 k3 Z, l6 v9 V. A. J W1 T
static unsigned int count = 0;! z: a( o9 d% S+ V. |8 u" ^7 B9 d0 w
unsigned char rxData = 0;
+ y8 {6 w; _- t" t unsigned int int_id = 0;
: C( c7 ^6 ], F; ? // 确定中断源+ o/ U$ ]7 u8 x* A: n. E
int_id = UARTIntStatus(SOC_UART_1_REGS);
1 J8 ?" z2 q9 e8 d, {& S // 清除 UART1 系统中断
$ z [9 L3 ^2 @# v3 y- c* d IntEventClear(SYS_INT_UART1_INT);
, I r) k; I" v( g2 V" [& i // 发送中断
& C4 @* ?! ]6 r" B8 o if(UART_INTID_TX_EMPTY == int_id)
1 E* O* b& T0 E9 |; s {
( _, f( \6 k) ^: l$ w1 f0 J6 O if(0 < length)
: @4 e9 `" p" D2 s% N4 t. p* C {/ E6 i! ~* t3 t9 e4 P
// 写一个字节到 THR% a" L/ D+ O* u' L" V
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
3 l$ q) w( R, l/ G1 H length--;
: x0 c. m2 B$ I5 { z. ?+ B& |% ]7 R count++;
6 ?1 D e1 g" l& C3 ]. I# s& b }& C5 x, N5 B6 O* M
if(0 == length)' L$ ^5 Y: `! q' S6 a' F4 {9 v9 W
{/ M T2 R1 i0 e B
// 禁用发送中断
/ [3 k9 y* K3 N6 B3 g UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);, p/ Q. b. W( Q4 K3 ]& V
}
e9 h% n! s2 f; v6 ` }
5 S6 O2 _& v: B+ t. B& G // 接收中断& q. W: `% k V0 b" N7 F# ?8 v
if(UART_INTID_RX_DATA == int_id). M. d, E2 r3 H8 U8 n
{. I2 Y7 h8 I, ^) N$ C& o) s
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
( ]' [+ X4 F0 j UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);) b4 ^6 w( [( @ p5 v
}
: q$ r; Y( F7 x7 _ // 接收错误 a; |# H& l) T9 L9 i
if(UART_INTID_RX_LINE_STAT == int_id)
% T! W. u" ]2 R" H { ?' C3 E, [) D) z' M1 e5 K
while(UARTRxErrorGet(SOC_UART_1_REGS))
4 I+ f# [) s9 ], {3 E8 a1 G {/ c+ {' L5 o- N3 _2 \8 ]! Z y! F! R
// 从 RBR 读一个字节6 l/ H g8 R9 l2 f- v9 ^/ i
UARTCharGetNonBlocking(SOC_UART_1_REGS); c% O2 `' [, x" B) t: Z& s
}
: m L; M+ h8 Q6 N" k" u. D: H7 A }* {# D& E. m; D2 k) \2 u
return;
8 |* c% n' K5 i}
; i- q- E6 D# N& _$ j7 BInt main()
8 l' b5 ?" P# T4 S U0 Z{ 6 V/ `/ s! ~6 ]2 B$ P/ o! F
UARTconfig();//uart 配置: s5 A* {" L' U% U1 B e
Error_Block eb;2 O' u/ X7 c9 J, a
System_printf("enter main()\n");
, o/ i: D4 E8 P4 A( j Error_init(&eb);
3 u& j0 z1 M, U i' x$ ^ // 动态创建硬件中断$ K. M! x- x4 `- u8 p8 F+ f
Hwi_Handle hwi1;
, c! q l0 M) [8 M$ g, O Hwi_Params hwiParams;# s, Z | r4 p1 Y( s- i
// 使用默认值初始化参数$ u) t+ Y8 e' Q) W* n s6 T" g
Hwi_Params_init(&hwiParams);% i K. l0 R/ V4 L' O
// 中断事件
: l: l8 B& a/ d+ h9 }& w) c hwiParams.eventId = SYS_INT_UART1_INT;
' L) X- R) V. @4 J3 }1 ~ // 传递到中断服务函数的参数# }5 L( w2 I% r' o
hwiParams.arg = 0;
8 a; x, \& u9 u' Q# }4 o // 不允许该中断自身嵌套3 t* D. q- D5 X4 b6 r* R4 b$ F
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
* Y4 d' Z* y: X% R8 u // 使能中断
% |/ R9 T3 g0 z4 @1 {1 q, _ hwiParams.enableInt = true;# ]5 ~& A+ I. g% S7 [ p4 u
// 可屏蔽中断 4
( J/ Q- i; E9 ~0 w) z8 X2 q; C // 中断服务函数 hwiMain- w2 g4 ~ y2 v6 d! i
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
U/ T' f8 D" s1 z* b if (hwi1 == NULL)
7 _+ i! {2 G# a9 J System_abort("Hwi1 create failed");) X1 F0 p7 |7 Y# E5 a
BIOS_start(); /* does not return */
, Z! c Z3 U7 p. K- R& @' b return(0);: e/ G. ^3 d; F0 H8 A
}8 h+ K( F/ i1 z L2 D
0 D$ v$ u( Z$ l |
|