|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下" H7 \% j8 G5 y- A. L( K
// 发送缓存
6 ]! \+ R# L6 C' z d2 v# }9 qchar Send[] = "UART1 test......\n\r";
, ^* l3 r- ^2 _- {) g S& W) `4 ~( [. c
extern void UARTconfig()7 o8 b8 M+ D( ^$ ~) d. p3 u7 b
{
8 |$ Z: Y' x# J5 j //使能Uart1
6 D- ^- ?9 q( I! c- t PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
" p% {4 ]( B, A/ s3 j2 s" ~ 3 }0 M1 n0 ]4 _0 f6 s4 u( Z
// 使能 UART1禁用流控
0 O# R3 [# _$ R2 T9 U2 F, }$ a UARTPinMuxSetup(1, 0);
* @( f! g7 |. Y3 g, c0 }+ e7 ` 9 }0 Z1 z' s/ m3 X
// 波特率 115200 数据位 8 停止位 1 无校验位
7 `9 n6 ?& x6 O. W5 b) K UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
; B. y/ o' `) m6 K 9 E2 W7 ^) Q! C- O$ M
// 使能 UART1
! Z1 u: ~2 V/ w( _1 ]: ~ UARTEnable(SOC_UART_1_REGS);
1 N X4 |8 ^- g, |- }+ L // 使能接收 / 发送 FIFO
# C% N" K& h: J4 a9 P UARTFIFOEnable(SOC_UART_1_REGS);4 [: ?8 L( u, {' L7 h
// 设置 FIFO 级别9 e: b5 P/ q f0 O
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
+ k$ S0 @( t ] o- Q4 _ //Uart1中断使能
0 t0 l0 p( H/ l. V/ ] unsigned int intFlags = 0;3 @- Y1 y+ L5 ]2 j
intFlags |= (UART_INT_LINE_STAT | \6 V' ^2 E; E5 x
UART_INT_TX_EMPTY | \ M, S. a N- o% ^! j' K N: Z
UART_INT_RXDATA_CTI);
. x% W. b0 i3 W! G: z3 j( {
4 Z/ e3 P" I) L) j2 F* k1 E7 X UARTIntEnable(SOC_UART_1_REGS, intFlags);
$ X3 q% D2 ]( |, |% a/ h* q: C}
4 [4 A- |, ]$ q0 k+ T* _4 U! A//UART 中断服务函数5 e% T0 d- O" s8 P3 I/ R
void UARTIsr(UArg arg)1 F4 I* R: d$ H5 y$ U! V; x
{7 o# ` l2 V( U% [; T5 o6 j2 |) y
static unsigned int length = sizeof(Send);* V6 u: e) |- i6 k4 m7 O
static unsigned int count = 0;3 c) u! l% B" p2 \9 ^
unsigned char rxData = 0;4 u9 a/ x& D6 p' l
unsigned int int_id = 0;
) r! a3 e# d5 d6 M // 确定中断源
: T+ o7 |1 v q& G3 g5 l int_id = UARTIntStatus(SOC_UART_1_REGS);8 V. ~' W7 i3 a, v
// 清除 UART1 系统中断
1 y$ s6 K f$ @+ ^6 @# j IntEventClear(SYS_INT_UART1_INT);
8 R( Y8 c& q1 t // 发送中断/ _' Q3 Y: I- s5 ~& T; S
if(UART_INTID_TX_EMPTY == int_id)
8 t; W" c l6 ~- T1 V, e0 }* K. N {. z. K T$ ~, R
if(0 < length)
1 b% M; B- {- J% e5 T$ d8 b {$ Z9 r3 k" [! S" J, b/ Z) E
// 写一个字节到 THR! Z+ J! H0 w' Y. c
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
* H5 Q* U4 \" Z$ k% ` length--;
: ?8 r5 R/ O: J count++;
) K K% x, ^4 I+ B( Y- b }
* D s8 T+ k5 P- t# Q0 T3 i if(0 == length)
( r% ]% \8 ?5 r/ D { C, a0 J9 H" U4 _4 |
// 禁用发送中断3 x T# \1 S0 \5 d
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
5 J4 t* l' X; l* X1 J3 v+ H6 n }- P! [$ B1 b; n, B: W/ m* j9 E/ j
}7 i/ I; u2 _. V3 V7 w$ }7 y3 O
// 接收中断
" b0 i3 P) o+ t% \ V4 p8 E$ F if(UART_INTID_RX_DATA == int_id)
: _# N$ [/ g* I( w- _4 v {
4 q9 Q! [- p- f0 i; u# h$ x rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);0 z4 m' e, L/ U {0 c5 E
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
' _1 d+ s& C% N9 |$ ~% D }7 i9 A% k+ {* m& A
// 接收错误
! m: E; G5 o& [- L& P7 R( [ if(UART_INTID_RX_LINE_STAT == int_id)
- _3 A2 l5 \8 F8 z {4 x( M& V0 b# s& y
while(UARTRxErrorGet(SOC_UART_1_REGS))
4 W, a/ L( C1 i7 N {2 o" ?3 c: X% a7 ^7 l9 R& c
// 从 RBR 读一个字节# L" g/ {' M( Z, J% Q
UARTCharGetNonBlocking(SOC_UART_1_REGS);6 S1 _ g: ~% z2 ?+ }( W# [
}& M8 I6 ^" M4 F% m8 T' d; N
}
7 e7 U+ J3 r6 f7 O! B @1 F! L' _4 W return;
9 B4 l, C9 ~# Z; B}
+ x5 D$ O! Q& C. M+ k9 c; D" L( pInt main()
7 F: X5 U R9 e$ [) I( ~8 X{
4 w, }4 M) h( p9 [6 g# x0 T UARTconfig();//uart 配置' \$ E# _4 L$ ~% i
Error_Block eb;8 I6 h0 x1 J; `: }8 [; S" q) ^
System_printf("enter main()\n");
( h, j" x/ o& I' F' R; o Error_init(&eb);) b2 `0 D0 p7 X' T: {) L. q$ n
// 动态创建硬件中断# [. |% J. l/ A a+ H% z/ J/ J: M. S
Hwi_Handle hwi1;9 g- \: h9 s1 i7 S
Hwi_Params hwiParams;
! `/ ? t3 {# j9 R0 v- w // 使用默认值初始化参数 G% Q, E& K" L' r2 |+ B7 Z* k
Hwi_Params_init(&hwiParams);& N- Z# A1 {) `% M
// 中断事件- V* `7 [. H2 p. e9 [# v
hwiParams.eventId = SYS_INT_UART1_INT;7 ^, H E4 r6 H0 l) ^" @' g
// 传递到中断服务函数的参数7 E5 D' c6 ?! R
hwiParams.arg = 0;; t8 V# `9 y6 U: @
// 不允许该中断自身嵌套
D& Q# P. V$ S- y+ m hwiParams.maskSetting = Hwi_MaskingOption_SELF;% u* A, R9 d0 w5 E' }
// 使能中断
' O$ \$ J/ P- Z8 T5 d; r hwiParams.enableInt = true;) Y3 v E1 t: o; t; g
// 可屏蔽中断 4$ I0 s: Y0 t% x& o x3 j7 g
// 中断服务函数 hwiMain3 E; T+ P5 w3 H3 m! x$ h; d
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);- \5 H7 s: p1 M+ S' g1 K3 Y, d
if (hwi1 == NULL)
7 H" [5 \: v( ~4 _& l5 H7 W# D5 K System_abort("Hwi1 create failed");
0 \4 ~2 l* {! Y6 o& H0 ^ BIOS_start(); /* does not return */
$ X. ^% W; ^7 p1 l# C6 C; Z return(0);
+ O# p3 o0 W! U+ a% i}
}. {& i$ a0 H2 Z( M v
! h$ H; q. _0 M# `$ i |
|