|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下. y) r! W$ R8 N' i$ L
// 发送缓存
# P* }6 Z+ _) a# T; n, Vchar Send[] = "UART1 test......\n\r";8 f- T5 p1 X; O0 Y$ D
1 D) }+ }8 B5 Kextern void UARTconfig()" r- v& P. C! L8 U
{
9 C8 @3 ~& `% I( i" C$ t. O //使能Uart1
1 j% n6 C1 |) s3 m' E PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: p( _$ d, F! o* f# N
$ J( x( }5 y5 s1 X- j5 H) V7 y // 使能 UART1禁用流控
! t2 }2 v; T: X, n- Q8 l/ U UARTPinMuxSetup(1, 0);
1 ?: P8 H/ G- J" S M- a + `& v5 z/ k; F4 T; A; l# R1 J
// 波特率 115200 数据位 8 停止位 1 无校验位
: h/ `" |' p* g8 \. n4 j9 D8 W UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);2 m# `. P0 }( G+ n" J6 I7 D
( P6 K7 d6 o4 k // 使能 UART1- }: d" v% S) L- ]# @2 n) W( h0 C
UARTEnable(SOC_UART_1_REGS);3 P8 g r' J: p4 n( l- q
// 使能接收 / 发送 FIFO! c/ C& i; y# x, M
UARTFIFOEnable(SOC_UART_1_REGS);" u1 `7 O& q# z+ ~2 @: G
// 设置 FIFO 级别2 ~. L( f3 g! E9 T8 d. E. P
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
6 W! A% w8 h9 T! R. c //Uart1中断使能7 j' \! {1 G/ O! V3 H3 F9 z
unsigned int intFlags = 0;
8 K4 @+ X8 `3 N8 P# O intFlags |= (UART_INT_LINE_STAT | \
! }+ b% F1 m0 O- L) r$ n UART_INT_TX_EMPTY | \
$ I O% j9 u$ O5 w' W UART_INT_RXDATA_CTI);
7 h& V& r+ f3 m1 m" f; o
( q9 `9 q" E8 \- {9 X" V! {/ F UARTIntEnable(SOC_UART_1_REGS, intFlags);% h( @- Y7 M# T# f5 X3 M
} F' a. C B. T; j
//UART 中断服务函数0 a2 n, `7 d1 J/ W. F) I
void UARTIsr(UArg arg)( X- y3 C% d& s) g5 t; }1 y, {
{
$ U3 U, S$ i3 ?4 k5 h static unsigned int length = sizeof(Send);
, S1 k$ ^' ]- }5 q static unsigned int count = 0;! z1 i8 C+ I. n* ]/ a5 v
unsigned char rxData = 0;1 B' m* N, A8 X m3 t; I# ~
unsigned int int_id = 0;# e- G. E& { W8 b9 W3 |) B }: }
// 确定中断源
) I5 Y6 Y& L# C int_id = UARTIntStatus(SOC_UART_1_REGS);& ]# A; x1 G+ G$ I' Q6 b
// 清除 UART1 系统中断
. k# |8 ?8 x* Z$ r. w3 |% S% T IntEventClear(SYS_INT_UART1_INT);
) y& j5 c! R8 d8 D$ I$ R* a // 发送中断
/ R3 \0 F1 R1 }( X$ { if(UART_INTID_TX_EMPTY == int_id)2 U: r% A: v1 Z& `6 N H4 x3 L
{
1 o# |. y' K( g# O if(0 < length)7 B- i$ }/ }$ ^/ J9 n" Y
{
" B3 A& @+ e6 L9 a" [ // 写一个字节到 THR
& [+ M3 j0 l& w+ f UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
# k- ~" v2 g+ j3 d8 m length--;0 Q3 }/ ?: G0 ?4 m
count++;
& X, o; C1 i9 n* x: k }) G2 J7 f: n/ A! V+ i9 p! |$ E
if(0 == length)
9 n+ B& S9 ]! l2 m/ ~ {
4 l0 U, ~5 t6 r9 {: q // 禁用发送中断 M# `- P; [8 t! p$ c! R
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);# p0 k" Y O* I$ Q# H5 H
}8 V' I0 {8 X" J# ^
}7 h( i6 r( t' ~9 I" Y
// 接收中断
$ Z4 ]; E: o- Y; s) d+ w+ `- U# T if(UART_INTID_RX_DATA == int_id)
! A& I1 z' d/ l: ? {% z& j3 s( i1 s5 X) o
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
i6 L; N0 L% V2 o! C% t1 ? UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
5 q% E: p" }: [' @# @' w; O# C% | }
+ B6 s' a) h' {3 r // 接收错误
+ e- K0 b3 M& y [3 s6 @/ t if(UART_INTID_RX_LINE_STAT == int_id)
2 ?& G d. E5 _4 v9 _5 B {
( b- ?/ @3 e8 b o- u while(UARTRxErrorGet(SOC_UART_1_REGS))4 q$ r2 \7 Q, v" z, d2 ?6 B
{
; ?+ `6 M8 M0 L: o* z; I1 H // 从 RBR 读一个字节7 N* ~! O+ l& T6 ~3 e
UARTCharGetNonBlocking(SOC_UART_1_REGS);- n# m# e& V1 P: G% H
}$ D: T7 b9 X. M; R7 o8 F! }/ X
}, j- r+ g5 o: q' ^0 ?# ~* b
return;
' ~* U; c F- Y}5 a/ j$ B6 K1 Z( P4 e+ s! p$ b( R
Int main()) Y2 b7 i2 ~6 b, X1 l
{ # Z5 Q D* `7 V8 A. Y$ j, d
UARTconfig();//uart 配置
2 d( \: ^; s- @7 W1 R$ ] Error_Block eb;/ W8 Y4 i9 q. d% n7 g" K4 k0 Z
System_printf("enter main()\n");/ Z; V' U4 v5 B
Error_init(&eb);
( ]3 I7 K) q1 | Z4 J7 Z7 V* x. y // 动态创建硬件中断
- s6 y. U$ M9 J2 h7 @) F Hwi_Handle hwi1;
~: S7 R/ F+ p1 v9 c9 p Hwi_Params hwiParams;: @/ B/ X/ z4 a
// 使用默认值初始化参数' X4 }9 |" s) P! J
Hwi_Params_init(&hwiParams);
/ m: n( a$ D1 P$ K- l // 中断事件7 l+ c! g4 L* h/ ]( K& ? n' H) `
hwiParams.eventId = SYS_INT_UART1_INT;# A: |* ~7 b W) r5 T( o& q
// 传递到中断服务函数的参数
6 c) L9 n$ f& T R( x1 D8 q hwiParams.arg = 0;% M6 u; A; K2 d( H% X
// 不允许该中断自身嵌套1 u- Z) `* {( u
hwiParams.maskSetting = Hwi_MaskingOption_SELF;* c) g; X& e$ A
// 使能中断
7 b* \2 ]2 i) p/ Y: [. Z( k( d1 \ hwiParams.enableInt = true;0 d% W! @2 k. I" o2 [
// 可屏蔽中断 4
/ E! H) W+ Q: u' N; s3 w5 M1 l // 中断服务函数 hwiMain' ~. I! I6 i! p S6 @/ X1 S; y" _
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);0 x k7 k* y# v) q# V
if (hwi1 == NULL)
' A `; t. v8 x8 s4 g System_abort("Hwi1 create failed");, C& {0 U% b5 x
BIOS_start(); /* does not return */
0 Q- |) q! l, |5 @ return(0);
! t; a H$ P N5 r6 h8 e}
0 P- s9 i$ H- {' a: h2 g. K- R7 e) |" W( {, `% B$ @' u# E8 H
|
|