|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
6 d4 L# M* \9 `5 Q4 E* f: w// 发送缓存+ l$ ^. ]7 i9 q* s7 ?& D7 q
char Send[] = "UART1 test......\n\r";
( }5 q$ i8 L8 `7 C+ c1 x/ e/ q9 X9 U; |+ A
extern void UARTconfig()
0 @+ U1 K% e1 U( D! J$ O& c{2 } U8 t' L( G7 y9 N
//使能Uart1% W$ M% Z3 C9 C' V* a2 p5 t
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 ~" A# ?4 [* e ?# t/ b
" k- ?9 H3 t9 S3 ~ // 使能 UART1禁用流控
% h9 `) H# _. J" r/ i4 B UARTPinMuxSetup(1, 0);) d4 A/ g! b' _; w% P
. t6 t3 J. j" @* f9 R; A( a) L
// 波特率 115200 数据位 8 停止位 1 无校验位
4 F7 w* m% [& I0 B UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
d6 z+ L" K B# o8 R9 Q) m 8 R9 c; x4 Y* r0 ^! \3 z
// 使能 UART1
{ K: J2 l, G3 `+ t UARTEnable(SOC_UART_1_REGS);
2 U! s$ x, o" _3 n! [! N% [ // 使能接收 / 发送 FIFO: I* f$ V% L3 q- Q- P% ]& i
UARTFIFOEnable(SOC_UART_1_REGS);
% A, R7 T; {" V# Y9 G; _8 j2 O4 l // 设置 FIFO 级别
% W! H0 Z' i1 M/ l UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
) d1 q* ^$ h8 ~ //Uart1中断使能
+ J0 |" @/ ?+ f( i unsigned int intFlags = 0;4 b- K5 {+ y& ?2 K( D* t
intFlags |= (UART_INT_LINE_STAT | \
7 u- i6 z7 I F, O' f UART_INT_TX_EMPTY | \6 g* a& l: E( l3 J1 {3 V
UART_INT_RXDATA_CTI);
# ]$ e( q! J1 b: E% J" G0 S
. u0 Z _ Q7 w0 ?/ E UARTIntEnable(SOC_UART_1_REGS, intFlags);) R* M4 C' {- N7 z& K7 Z* j
}
3 y" Y4 R( W- s- T+ U5 f1 T" q//UART 中断服务函数4 Q; i, _" e# R: s' S
void UARTIsr(UArg arg)) u! o$ P4 S0 K- u, Y9 ]
{; N- y7 ?" c3 A* e4 s
static unsigned int length = sizeof(Send);
9 N5 U! R0 [+ r' A1 k& R+ C2 t static unsigned int count = 0;% k [8 V; j. R3 k3 V p% _
unsigned char rxData = 0;5 p( T2 M( n# u& @7 ^) P
unsigned int int_id = 0;0 Z, j! C, X0 h
// 确定中断源) v( S x6 n6 u! x+ e% t
int_id = UARTIntStatus(SOC_UART_1_REGS);
$ X. w# g9 g/ q6 y5 j& E // 清除 UART1 系统中断4 j" }) _5 K& Y5 j' K
IntEventClear(SYS_INT_UART1_INT);) t. Q6 D8 V# `3 D& s/ \; B) }& i% W8 J
// 发送中断" q; i& e0 ]% p
if(UART_INTID_TX_EMPTY == int_id)
' S$ r9 S' T2 q$ f {
6 B: H: S# b; z8 u# ? if(0 < length)" u# f @" Z2 f) f4 u! }
{
- d# U _' y/ o) Q( g! D // 写一个字节到 THR
; y. ^! N' w: x4 Z! ~" C UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
7 [- @! c1 _- r1 Z% [ length--;
* c/ \1 \1 {# t4 P3 x5 M5 ^6 Z- c+ R' m count++;' X$ S3 R0 g2 s W1 p3 y
}
' b* f- o. h8 j& D3 l9 S/ l if(0 == length)
) x, l" }$ U7 `9 a n {1 N9 Y5 M; H1 y1 `/ ?) G& P
// 禁用发送中断
! U9 L+ P: T6 G: J UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);" z& b! k$ ^# k8 \
}
$ F' t* b+ I0 ^% |6 _! ^ }
: X& q7 G9 ]) q' t1 g // 接收中断) N# T9 V! c7 O, @
if(UART_INTID_RX_DATA == int_id)$ {) O( k8 @0 I7 h
{
: O- [) z$ [7 x: {7 J rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
* N2 t3 F& G3 G UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);" e9 Z4 d$ o+ p+ S1 G
}3 E4 g" c4 H- u4 i; \( q I
// 接收错误
- {) `7 `' q7 k. b2 L9 E) }/ k if(UART_INTID_RX_LINE_STAT == int_id)- }# [6 t2 i7 X) W1 Z8 r& k0 y
{5 b J& n" b. z6 ?- {. n
while(UARTRxErrorGet(SOC_UART_1_REGS))
6 d- d0 J; f, L% W/ \ {
/ s) S3 M {, c // 从 RBR 读一个字节. ~- ~8 n6 N3 i! V, l. U+ w4 \) t* V
UARTCharGetNonBlocking(SOC_UART_1_REGS);
! ?/ j5 U. Y6 j! D }
# w) @% [4 J% z( ]4 q$ K% Q }
; M, d# n$ |" U1 k" p; k2 z return;
\) q/ k8 T+ T% | _0 C" W' t- U}
; B6 D; z F0 w; K% {1 S% ?0 gInt main()( e0 t9 v7 Q; F* T$ J
{
- V8 r% n$ H- |. i$ ~( t9 j UARTconfig();//uart 配置% }3 Y- g' k$ ~. g( `
Error_Block eb;) Z+ ?" Q3 l9 k" t- \, ]
System_printf("enter main()\n");
' S, c5 p* d( J ? Error_init(&eb);' o' B% I1 Z' z+ q- H5 T
// 动态创建硬件中断/ w2 b8 a9 D8 H# l- ?4 q
Hwi_Handle hwi1;3 Z7 ^- O- m5 i9 ~& {/ W
Hwi_Params hwiParams;
5 e ~7 L I2 O Y6 } // 使用默认值初始化参数
% G$ {$ z, F, N3 P6 C Hwi_Params_init(&hwiParams);" P' q( m' Q& [8 |! W4 R
// 中断事件' t$ \# d/ E" g3 I4 D8 x d
hwiParams.eventId = SYS_INT_UART1_INT;
K8 E. @6 L; _* x+ C& s- d9 J6 m* P // 传递到中断服务函数的参数
5 ?& l2 q7 s, f, y6 o* ^0 m+ L hwiParams.arg = 0;
: t" I: D1 f' l4 H) W& g // 不允许该中断自身嵌套
0 _% d( Z; J/ ~0 ^. O* I hwiParams.maskSetting = Hwi_MaskingOption_SELF;) ~4 e& H& p% j2 i5 Z
// 使能中断
, K) V' D5 v! b# E( l hwiParams.enableInt = true;
L, N1 L2 D: ^7 z& i2 n* R // 可屏蔽中断 4
) x* U1 X/ Y6 D0 e# a# L- f8 r' j // 中断服务函数 hwiMain
5 t8 P+ V. B5 v n. B( v* p hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);2 o+ o: I% L7 K/ T
if (hwi1 == NULL)' s' k( {7 h( F9 y8 A- t
System_abort("Hwi1 create failed");( T+ d- x: c- a# B+ o
BIOS_start(); /* does not return */) ?4 K" C. `3 K% [2 O* h9 _
return(0);8 K" |* @4 _) v7 g; c4 e1 U7 j- U
}) T" c) t% c" B1 u1 _. R
/ f9 ?) z# ], B% e |
|