|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
; f4 I# L) {- X8 q9 Y" ]/ l// 发送缓存: v$ c% I) k2 }9 r3 M$ T) I
char Send[] = "UART1 test......\n\r";
* j6 _2 [: Q \, G6 s0 `
4 m( f* W$ i) p/ Z& Zextern void UARTconfig(), ~0 W( n S* S, s+ v
{
9 j- s* I! l+ t8 H //使能Uart1: g# m' w( I+ Q7 S
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ G: `9 K! @% W$ C& s' | , Y4 |. o/ E5 P/ Q
// 使能 UART1禁用流控. p/ S" }% ]8 i: `4 \6 M
UARTPinMuxSetup(1, 0);
2 L* j; x+ F' S# |: p* E
. d* \) m8 n9 c) ?: d // 波特率 115200 数据位 8 停止位 1 无校验位0 M- n6 h" V& d% v$ X
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
+ e% V* P, Z- ?# N, f' f8 u4 b% ^ 6 A( Y2 l, l' E0 W9 @
// 使能 UART1
8 \& [" q/ r+ R) t9 M$ z UARTEnable(SOC_UART_1_REGS);* n2 y% _" S3 }1 O F
// 使能接收 / 发送 FIFO ?! k- ?7 X9 L% ?$ f- I4 `1 @
UARTFIFOEnable(SOC_UART_1_REGS);
. x$ z q. w7 Y' t% e- o( T5 r // 设置 FIFO 级别2 D+ f% ^# o- z+ h9 M( H
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
. g; \4 Y8 H1 A5 m4 W4 j //Uart1中断使能+ L, A( @! m$ t: v
unsigned int intFlags = 0;4 |4 o# c4 u1 N. A, z4 ~5 g
intFlags |= (UART_INT_LINE_STAT | \
( F* T @- P& K- E& D) ?/ h7 { UART_INT_TX_EMPTY | \$ u; }- b3 X3 K9 \
UART_INT_RXDATA_CTI);1 Q6 u1 w7 \- s8 |, I# B9 K
$ {) L3 D0 \( \- A6 @ UARTIntEnable(SOC_UART_1_REGS, intFlags);
/ I9 ~6 A0 E- ]4 V}' I4 ^' v8 ^- c$ }
//UART 中断服务函数
0 @' J' A( h; O( W- l, c3 I6 |& tvoid UARTIsr(UArg arg)
% s3 L: c3 Y8 h$ {{
& W7 |3 P6 a0 q: p( Q static unsigned int length = sizeof(Send);
6 x& j/ L2 e. r- e' V, z3 q! ~ r0 [ static unsigned int count = 0;
V4 R: u0 X2 ~; Z unsigned char rxData = 0;" D C& _) J. P1 i$ z" L4 D
unsigned int int_id = 0;; z! Y( ^- }2 I5 ^
// 确定中断源3 P, e! _! T6 w E& Z) U# E. h3 {
int_id = UARTIntStatus(SOC_UART_1_REGS);
1 t. ?6 P3 [% ^5 R) B4 ` // 清除 UART1 系统中断' S" f% j7 o( b- {! X) H/ H
IntEventClear(SYS_INT_UART1_INT);1 Z( y, `5 T4 J) z# s" a
// 发送中断
2 x$ u3 }( p% H2 e1 ~0 e) Y if(UART_INTID_TX_EMPTY == int_id)
2 V0 S0 `+ E6 p8 X/ Z9 k {( \" o L8 B: `/ D ?
if(0 < length)
0 z$ J4 n6 l- ?. l$ g {
9 J. N; U# d ]5 s% ~; q // 写一个字节到 THR* n7 ]6 }3 D. Z c5 P) u* J0 p
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
( ~6 _! t& M# m1 c ^1 A9 O length--;9 |+ ]5 w4 Y. k; e
count++;
* r1 `$ L; M/ C" d" t. h }
- W) h# T" ]9 { if(0 == length)2 _/ E- c6 H* [ F4 l
{9 N9 H8 n5 f6 m1 v. x
// 禁用发送中断
4 A( G& ^! D2 f1 Y0 f UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);8 Y: G( j5 `8 T( j
}2 _, r- O/ M/ a- T, t: M8 _
}6 V$ G6 D! T. {6 e
// 接收中断
5 h+ L5 D# a4 m3 f3 r3 ] if(UART_INTID_RX_DATA == int_id)% Q4 E8 j A5 m! d
{2 g# e1 @8 i% D3 a
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
' q3 \! Q* j: U0 r UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
~ x5 m& T) D6 P4 P8 r2 } }$ c: I6 V9 ~ L9 A
// 接收错误
7 q8 G! Q6 A ^. o- {! G if(UART_INTID_RX_LINE_STAT == int_id)3 p/ r# `9 P) o/ R
{
6 \3 }/ f' ^9 w) {* @) N while(UARTRxErrorGet(SOC_UART_1_REGS))
6 l9 @+ w$ B( k5 l {4 ?3 E6 h& V5 ~9 Y0 p' ?* b" P
// 从 RBR 读一个字节
3 z; I& K: C0 G( W UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 Q' _( ?- \" w9 S+ Y9 w }( @, V3 u5 c: C2 _* t6 A" S/ R7 ?
}
2 Z' F i$ e) ]6 J return;
) e0 @" M. Z' D- v- [5 Z}' _9 ^: X5 Z H% L( z$ m3 }
Int main()/ \$ |; l8 {6 M3 s8 }3 m* o: X
{
Q, f+ x k9 I7 w1 c6 E UARTconfig();//uart 配置
. c6 F$ ]# W3 j. x/ a Error_Block eb;% t2 C/ \2 r1 D
System_printf("enter main()\n");
! H. i4 T, K; x3 i( w$ q Error_init(&eb);
# e, R+ b% ?7 ]! s% O0 K! } // 动态创建硬件中断
, U: `8 a+ r$ { e$ W8 {2 }# ]; _ Hwi_Handle hwi1;8 i7 c- O5 H+ x
Hwi_Params hwiParams;
0 O7 B) Q) a. e. y- {: g3 [! R* V // 使用默认值初始化参数
$ [% g! q% i6 V) j* d! O Hwi_Params_init(&hwiParams); b$ m( i9 U% u& W, N0 u. R7 j( J9 v
// 中断事件
T: o. X4 h: b) f* ^& B% @ hwiParams.eventId = SYS_INT_UART1_INT;8 X3 o u% a3 M: ~7 {1 b+ S: G
// 传递到中断服务函数的参数
* V) e1 U2 g! c& g3 i- H hwiParams.arg = 0;5 \" y" |9 {/ j$ W
// 不允许该中断自身嵌套# \" g4 H# x ~) X# N5 l; Z
hwiParams.maskSetting = Hwi_MaskingOption_SELF;! X: K# v) r! D
// 使能中断$ y. b5 J3 t, q
hwiParams.enableInt = true;; s# k3 w0 Q$ M% U% l) e
// 可屏蔽中断 48 A' |) P$ E* B9 _$ Q, ]
// 中断服务函数 hwiMain
: ` V: x) b2 \ hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);5 U' E* P) L, y
if (hwi1 == NULL)3 p) T7 B$ r4 K2 d, c6 b( P& G
System_abort("Hwi1 create failed");' r) F5 H0 m( J5 E
BIOS_start(); /* does not return */
* g$ |- L# ~1 z3 s+ ` return(0);
" p6 A' t8 C' W2 r, q}
4 X) z0 m# L8 Q3 ^6 \# t; E: [* s I( S3 j( A; b, _
|
|