|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
5 u/ b% k9 a$ k' [( i' b// 发送缓存
g: k, Y/ m: m" u8 Rchar Send[] = "UART1 test......\n\r";
( V8 U: W9 Z/ W+ e' |' ]1 ?$ j9 D4 @( X1 I$ m
extern void UARTconfig()* U: H9 x- I4 N+ X& c) x: V
{+ [9 k1 W0 B; a8 m& d( x+ ~
//使能Uart1
# c5 m" x0 q7 K, Q. t& C PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);; r# |1 J9 Z- T9 T; W
8 j1 {) o2 j/ Q2 T% } // 使能 UART1禁用流控
# W/ A2 }1 D4 T UARTPinMuxSetup(1, 0);& N" d) z) O& c$ \6 h
p! S: A f d/ s3 y. k$ q
// 波特率 115200 数据位 8 停止位 1 无校验位* v+ R3 L7 Y+ r; j& C: t: {
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# E1 H. E# N! N( e% x
' z9 l) Q' E+ e0 c% C$ R0 ^+ _ // 使能 UART1
$ V5 K# z+ h. _( R J1 R UARTEnable(SOC_UART_1_REGS);) f4 ~3 M7 X# `. _; Y( L. Z
// 使能接收 / 发送 FIFO
& ]% ]( ?. D0 I& j9 E9 X UARTFIFOEnable(SOC_UART_1_REGS);! Y7 Q e* L9 u- t( }! Y
// 设置 FIFO 级别
$ J( Y5 [+ m0 ^. b# S" u UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
+ a+ k! I! R( H3 C+ `7 n# Q //Uart1中断使能$ `9 n, x4 j& _& o
unsigned int intFlags = 0;( e" x3 }- F" d8 k# s1 s
intFlags |= (UART_INT_LINE_STAT | \
; \8 {1 f) _7 b5 @- f7 g UART_INT_TX_EMPTY | \: Z& J8 k" G; n
UART_INT_RXDATA_CTI);
8 ~9 ?6 P! Q' s 9 U! _, D. X f
UARTIntEnable(SOC_UART_1_REGS, intFlags);
$ g5 h0 j \6 h- S+ k}
" ?1 Z% G* T+ F$ \8 Z//UART 中断服务函数& T+ j1 }! J! w1 _
void UARTIsr(UArg arg)
- O6 u4 M4 t3 G9 O/ G6 Q; B; U( l5 W{/ v4 w7 Y0 V7 j$ p$ s4 N
static unsigned int length = sizeof(Send);
) a8 z- j* J% @& f3 e" q7 M static unsigned int count = 0;
! f0 @; S) E" p unsigned char rxData = 0;: h" d$ T* ^, p0 \1 @
unsigned int int_id = 0;. U9 f" V' |+ o3 c6 r4 p: h9 m
// 确定中断源# N0 Z" u2 {- Q: L% j7 ~
int_id = UARTIntStatus(SOC_UART_1_REGS);
) P+ e. x. Z! X! l: H% m a // 清除 UART1 系统中断
9 D( ^. C9 r# u) ^! }9 a IntEventClear(SYS_INT_UART1_INT);
: W: o; |; V% S; J* w // 发送中断1 C C% F& d" ~5 x! Q, W/ N
if(UART_INTID_TX_EMPTY == int_id)
" ?. M& k6 Y3 `7 S& |7 q6 { {$ N0 S5 P; q1 D6 f p7 p% [, t
if(0 < length)
2 E! G1 I) n) i% S5 u {) l6 f# _; D7 z9 A9 M
// 写一个字节到 THR8 }+ w% \* M. A4 s
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);$ ~* }7 A9 P! G1 ^/ Q8 R+ G! i
length--;! z$ j# O2 f1 j9 w# {$ o9 Q
count++;; j8 q' W n+ g$ z$ h; c$ v
}
0 c, ~( y5 {. N" g( Y, @& d if(0 == length)
$ F$ p4 W+ g# H8 [. \& R1 } {3 l7 b, P' }& k1 m! @. N9 K5 \( E
// 禁用发送中断
, k3 X4 _2 ~* Z! T UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);1 a; r, y B) p, o1 u0 @, t7 Z
}
- P- Q% k' Z- \% Y1 l }) `' a! s, d( p- L
// 接收中断! J9 F! w+ Q! \
if(UART_INTID_RX_DATA == int_id)
) n) |. G% a8 k( W5 F; G& ?8 ` {8 l1 p+ f6 ^9 }" u+ ~5 f
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
/ j: n! b6 N. l1 r UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);. v& v6 F- h' Z f9 k
}
( z, O& `7 @: n3 Y, y // 接收错误- O a9 f& k$ U8 I
if(UART_INTID_RX_LINE_STAT == int_id)- X. u) j4 ^4 E. t, G8 y z8 `* i4 ^5 {( w
{
% v( [* ~9 G) p3 x while(UARTRxErrorGet(SOC_UART_1_REGS))
% w, p/ X n4 o) j1 J0 M5 s( |4 O2 ^ {. k$ W8 S- H) [ F
// 从 RBR 读一个字节) ?; M# ? _& V8 g! }7 w5 S+ ^9 M
UARTCharGetNonBlocking(SOC_UART_1_REGS);$ D" ~% b! m" Z5 \
}
- \8 Z- t: |9 S, z: _3 u }
, g! ~" q0 p9 L q7 U* y return;1 ?5 s% H! ^+ P) H% ]8 \" U
}
+ K1 b6 g4 Y9 [' Q% c$ O7 OInt main()4 E3 L" U# C% H# {, c1 Y9 b
{ % {) a3 I& c$ g+ c7 K
UARTconfig();//uart 配置
; @; p Z% O% M. M8 T0 x% B5 b6 C* o3 f Error_Block eb;$ w, M1 V/ _! D1 S( s( N. @" g
System_printf("enter main()\n");! ~, o2 N$ W' z. x
Error_init(&eb);
9 l, i: l# P: \3 N) } // 动态创建硬件中断
/ D* m6 h8 r; @' S5 Q Hwi_Handle hwi1;8 l1 A2 o2 P+ A9 [, q+ O5 U) j
Hwi_Params hwiParams;
9 _2 M2 C5 @7 ^4 ] // 使用默认值初始化参数
- |& Q. C @+ }4 P Hwi_Params_init(&hwiParams);
6 U/ \$ }5 { S* n' q // 中断事件
+ {1 D% K& W# a/ [% ^. L/ g2 o hwiParams.eventId = SYS_INT_UART1_INT;
1 s# u. Q1 E* { i2 i9 w // 传递到中断服务函数的参数9 N% N1 _1 Y6 _
hwiParams.arg = 0;
2 P5 J4 O, ^7 o r // 不允许该中断自身嵌套
0 K. G, B' p2 i& o7 G2 ? hwiParams.maskSetting = Hwi_MaskingOption_SELF;6 ?) t# u. f7 e( u
// 使能中断3 n$ S2 h1 B7 Z- J0 c
hwiParams.enableInt = true;/ Z1 B1 Q" E0 H5 G8 S% j6 W$ m
// 可屏蔽中断 42 B/ a- n: Z9 e( n. L+ {: L2 v+ b# Z
// 中断服务函数 hwiMain
7 i# J: O" r: z' ~) Z# e9 D hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
9 e& `1 c5 X" w% p: j: j- D if (hwi1 == NULL)/ L k! `6 J6 h
System_abort("Hwi1 create failed");
2 R. ^, n" g) J [ BIOS_start(); /* does not return */
8 _5 j# l g/ u; u+ g1 B return(0);
/ N( D1 \1 c3 w. }* K) V7 ~4 ~, b}' f. I9 ^& I9 o3 |& f' d8 o
4 |$ j' \ s, G( `6 R |
|