|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
0 j: S1 i: w+ ?2 n// 发送缓存
, @5 V1 ~0 f" y- [! V) K5 xchar Send[] = "UART1 test......\n\r";
' d2 { Y& v- B( l1 J& {& j( E/ q" R) M: d* j8 ~" y, i
extern void UARTconfig()
% N' K ]7 n! l5 Z2 A{' @) d9 Y4 b% b2 m) j% A' ~
//使能Uart1$ A: R4 L$ A; K5 W1 F: k( _. a
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 E+ S" g a E + x( k7 [% n! X" i5 P& E0 e* `
// 使能 UART1禁用流控. Q0 S& G! [: E: a- Z" Z d; _
UARTPinMuxSetup(1, 0);
) k& H7 E( ^5 ^$ z# H& I$ ]& v % q: N& ?2 [# I9 _8 R7 K
// 波特率 115200 数据位 8 停止位 1 无校验位
# J' L% n8 @+ e' Y, H! Q: r UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
0 y! C t! x5 d7 K; Z
/ c }0 p( V/ h5 E0 V6 U8 |% F // 使能 UART1
0 W, l s; W+ h UARTEnable(SOC_UART_1_REGS);
: a' ]/ m3 J) O' A9 _* B, p. t // 使能接收 / 发送 FIFO# G3 D% W" S7 o( G1 }+ h, M
UARTFIFOEnable(SOC_UART_1_REGS);
+ p6 d7 u6 Z. A2 ` // 设置 FIFO 级别' w8 S6 z, c- E$ a6 N2 ~5 E
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);; g/ V4 ~; I9 m1 |* N. N
//Uart1中断使能
; s) {1 m; m- P; q/ r unsigned int intFlags = 0;0 S6 @* W- f1 X* C
intFlags |= (UART_INT_LINE_STAT | \2 W) v/ o% a# K5 ~
UART_INT_TX_EMPTY | \
4 L; H+ i; j/ {9 w UART_INT_RXDATA_CTI);9 Y, ?' q0 N7 S7 ?7 K1 X9 e
1 F0 z$ w) k3 B# Q( u$ b; G$ |
UARTIntEnable(SOC_UART_1_REGS, intFlags);6 A, P) B9 b! ]. A2 |, n% S8 h
}
& V0 G: x! O0 o" B# |2 f//UART 中断服务函数
6 B2 K9 k3 G% I- |: t- w9 `* @void UARTIsr(UArg arg)
" ^7 T0 d/ {) ~* }# e; K A{
# Y5 ]! \; H" `# J% q static unsigned int length = sizeof(Send);* i% r" z9 p5 Z/ p
static unsigned int count = 0;
; `0 J* K2 I" f& X. y. k unsigned char rxData = 0;) o6 ?# F5 Q7 P1 K) r0 `
unsigned int int_id = 0;5 c3 E, L% v( t; \* |3 |
// 确定中断源
; O' ~& I! y, \' N: H6 H int_id = UARTIntStatus(SOC_UART_1_REGS);1 A: M5 y! w8 y! K0 y& P/ V
// 清除 UART1 系统中断
3 G& A1 O- _0 G Y5 q5 B0 z# A ] IntEventClear(SYS_INT_UART1_INT);
4 t" I w4 J6 F: w6 V- U6 n // 发送中断- P5 T- b2 A" Y% _! W
if(UART_INTID_TX_EMPTY == int_id)' L# T3 t7 j$ C2 |/ {5 S9 s
{
: h. w3 f3 ^# l5 M. r$ y if(0 < length)
$ ~1 C+ X/ E3 w; T1 ~ {& k( H4 o& {8 H
// 写一个字节到 THR+ F. `! }9 I% ]/ t) w7 s
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
% l' Q- Z" ~; s; ]. F- z: C length--;
. d8 t" A2 j6 R% O, f1 s0 W3 H2 w count++;8 N: O5 E& f! R4 Q" c* ?9 d
}& M. v( K& d7 i' a3 D6 J
if(0 == length)9 A1 ]0 v7 a9 b
{
- {' I1 P! \7 e, ]; V3 Q/ w0 d // 禁用发送中断# V* n5 w: y# x0 L' b! C9 R& O
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);5 f' A) x, |% ?9 D# h7 X( V
}* l: R* X$ r- {9 T: g( W
}5 H4 @" M. I' a' R2 Z
// 接收中断
4 |8 W+ k# d$ u; ^ if(UART_INTID_RX_DATA == int_id)2 b. {) O" a5 N! d. K
{& s' k$ j( h, ~2 A2 ~* h
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
2 Y3 C$ [" |0 \2 B UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);2 p! G8 U% j1 v9 B
}
9 \! B' D9 Z4 w" j0 T$ U // 接收错误
" X8 X9 I* S3 i/ B! }5 ^3 n; C/ ` if(UART_INTID_RX_LINE_STAT == int_id)& A/ U- E: b- A w$ J$ Q# X
{1 U1 Y6 h( x! N
while(UARTRxErrorGet(SOC_UART_1_REGS))# V- b1 G. x4 R, j
{
# R/ p! S4 v' T$ D // 从 RBR 读一个字节5 W) j% B8 V$ s7 G1 F+ ~* _8 {
UARTCharGetNonBlocking(SOC_UART_1_REGS);' P8 A) K9 t0 z0 X0 s8 W3 u
}- l3 g& G/ r! F+ B3 o) U
}
, v& F; X1 d7 I! G/ \' R/ ]. s. V return;
* |: X# Z% T/ N}* V/ m8 G' J4 _3 Y4 Z
Int main()- m8 N0 _ n% c; G( O6 q
{ $ L# A0 g) g4 c
UARTconfig();//uart 配置
, L4 \9 ~. R. G7 d Error_Block eb;1 j5 z6 ?" N7 P I5 t9 {
System_printf("enter main()\n");1 ?" u9 b" c, x3 c, [
Error_init(&eb);" W( m+ D5 R( `: P- H- c8 n3 ~
// 动态创建硬件中断" G) m# z/ U! E. R9 C& }) y
Hwi_Handle hwi1;
, M; J; U& `. U$ F M w Hwi_Params hwiParams;) i) |) J* O4 o, B$ O' h4 _* i
// 使用默认值初始化参数
Q1 A, s |2 T a Hwi_Params_init(&hwiParams);
, ?1 E- T; I2 T0 b1 t4 Q // 中断事件
8 d4 C. G/ M! A' f. z9 e/ r hwiParams.eventId = SYS_INT_UART1_INT;
% D! ]! ^$ \2 K // 传递到中断服务函数的参数7 b. L( C1 J# ?+ V! u) E U5 M* `
hwiParams.arg = 0;
' p/ D( R) a3 {! v; }: k, _2 e // 不允许该中断自身嵌套
! `0 r- Z- Q- L hwiParams.maskSetting = Hwi_MaskingOption_SELF;
6 j7 [- X& o6 h& X // 使能中断5 w j, o. [9 [5 F; u
hwiParams.enableInt = true;
' u4 W( \2 l5 L1 A: C8 S9 _ // 可屏蔽中断 4
/ c$ t$ @, B& @: j, {% H8 f9 N // 中断服务函数 hwiMain, X. @# p) o8 k1 ^- i8 q
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
" _% D8 S$ b6 w) m H Z O if (hwi1 == NULL); G- R* v; ~% K8 y
System_abort("Hwi1 create failed");
, a6 O, [/ k5 }% \ BIOS_start(); /* does not return */# u- {7 D) W5 Z4 m
return(0);
& Y4 R0 a7 x7 g. |; F0 N}% | V. w( w9 j) i
$ A; [" J3 ?' p7 Z i, Y
|
|