|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
5 p+ V U3 K* l6 Z& }8 }' x: R( _+ l3 v// 发送缓存
' F5 r- W8 J2 @1 m. J8 xchar Send[] = "UART1 test......\n\r";
! T2 Q& x, f- b2 o: }+ r2 E) |' T' M6 s' Q4 O7 ]+ H
extern void UARTconfig()( P! N. R: s0 R( T6 |
{' d) M8 C# w5 [9 j, B. }1 [
//使能Uart1/ R% @; \3 e( S. e5 H
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);: J- z+ H" ?) q) s1 P1 O% ]' n, Q$ z
& o# `, e4 G3 \4 L( X // 使能 UART1禁用流控0 c# m+ I. F& |+ G4 d
UARTPinMuxSetup(1, 0);
7 Q A+ O9 G7 J/ g9 O
5 l" G$ f9 D; M$ @+ b // 波特率 115200 数据位 8 停止位 1 无校验位
. }; x0 t2 M! D UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
- y/ R1 W! @8 ^+ C4 h
( A; C2 l1 a$ k: {! {( A8 ` // 使能 UART1
- n- J( C5 L ?' G5 R UARTEnable(SOC_UART_1_REGS);
% C( v/ z/ g( [- { // 使能接收 / 发送 FIFO
" \0 s, R' l6 w, A8 k/ W/ h UARTFIFOEnable(SOC_UART_1_REGS);- F- l/ _& ~" I B7 o& t& S
// 设置 FIFO 级别
; Z$ \0 f( O+ A* \$ W UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);& L: {5 Z9 i& z
//Uart1中断使能
& Z% I1 @9 u! Z5 }5 K9 a& W$ S unsigned int intFlags = 0;
- G5 E7 m- V% t l3 s, n intFlags |= (UART_INT_LINE_STAT | \1 q8 j0 A+ l" I$ C. |) g
UART_INT_TX_EMPTY | \4 O! q: p% _4 J. ?( _
UART_INT_RXDATA_CTI);, i2 m% C$ z' l+ m0 x$ k! @6 F& g
+ M7 v* \4 E* Q: f+ a3 C
UARTIntEnable(SOC_UART_1_REGS, intFlags);1 `4 v8 w& l. ]* U* j% T
}
% e0 ]4 e$ {8 i6 C" ] c* t//UART 中断服务函数% [5 f1 X I2 a1 {# X% Z& H
void UARTIsr(UArg arg)
( D' L% J% X9 K{6 m% j' X2 J( h. |1 ^6 p9 W
static unsigned int length = sizeof(Send);
9 `: z* ]8 L" a1 U static unsigned int count = 0;, i3 l! r9 z/ Q3 {- ]" S
unsigned char rxData = 0;- ]! n, t$ _6 {+ R
unsigned int int_id = 0;
1 N7 r8 s) g4 Z( D: y1 n4 ~3 e6 L // 确定中断源5 p+ V+ q3 X( {' J( K6 T- M
int_id = UARTIntStatus(SOC_UART_1_REGS);
, T2 z4 Y/ K J* z( s/ O7 S // 清除 UART1 系统中断: d7 R. f* S3 Y. v9 Y
IntEventClear(SYS_INT_UART1_INT);
! U$ A$ _' I( c/ W Y6 ^ // 发送中断
& ~! j: F- I6 F( m0 ]) I if(UART_INTID_TX_EMPTY == int_id)
4 L! o) w( @: f4 N$ U- r" ` {
9 B1 d; O. u7 ^( k if(0 < length)
* p; m; S$ d5 x9 R( B, s G# w' u {' o* U' ?- M$ r; }
// 写一个字节到 THR4 g0 H/ q/ w- @. H& R- T! i3 u7 t
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);/ N7 p( N+ h+ |9 c
length--;$ D( b5 G U. S! X8 F( O
count++;/ J7 C9 c5 n' J1 A+ r1 h; c
}# Q8 B' C+ j; R, J$ Q9 v
if(0 == length)
9 N4 B% C7 ?, y z* {% z {: ?4 n' b8 E6 [' i
// 禁用发送中断; S3 ]( t8 O3 h+ W, f3 u* N4 X
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
0 n3 b5 w# e4 g1 }8 T- C3 q/ {3 X# l }! y0 L( }/ z+ E: O
}/ {# ]0 D4 w/ @* P% T& {; P
// 接收中断" u( E6 M' U, v% f2 g" U
if(UART_INTID_RX_DATA == int_id)3 M* e* g$ E I, K3 M$ z6 q6 u. ?
{
0 k% K& j! K' G; c! q U rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
% p$ U% y3 E0 P; R UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);8 ]( q6 d4 ^9 R5 M. K. T9 A
}
: G) j: l; F! J' M! |6 ^' w& Z( u // 接收错误6 j& R9 ] N8 k: x( X+ j- r
if(UART_INTID_RX_LINE_STAT == int_id)
9 K% @5 X0 E+ @& B. H3 ] {& P. _8 ^4 P, V- z& ] O" `
while(UARTRxErrorGet(SOC_UART_1_REGS))
6 _) j' j7 k6 I# Q. F! F3 I {9 u# S ^& C' Y" n" n" T
// 从 RBR 读一个字节+ i$ b& O0 r V- q) d7 o, ?
UARTCharGetNonBlocking(SOC_UART_1_REGS);! Z3 }$ P O/ @; _' {& j( X( U
}
/ Q( C5 N5 ?. m. H7 d0 ^& V) T- N m }
) s; r, n& j6 o: ~% @0 n return;
* q6 E( F2 m* S1 H6 }}9 J: R( v! b3 M. U- y5 r
Int main()
& D! Q: t+ E" ~) e! Q{ % f0 i# k5 Y0 G1 y
UARTconfig();//uart 配置
0 j0 R8 z! P. w% f Error_Block eb;* [ N2 U1 {& D `, h* Z- { i9 k
System_printf("enter main()\n");; Q* e, J& H3 d; W& m3 D8 U
Error_init(&eb);
% F n, E8 O+ D; t" s% t // 动态创建硬件中断
2 q, f" x* V" K2 K( h! C$ I" F5 a Q Hwi_Handle hwi1;# W* u* A& \5 q; C. P
Hwi_Params hwiParams;0 S1 x- L. Q3 ~4 H" Q
// 使用默认值初始化参数" O! G8 [5 F z( T: B* L
Hwi_Params_init(&hwiParams);. [; r1 d( L8 B; ?; r$ R$ p
// 中断事件; h. p9 j4 o" D' C- z( b! s4 C
hwiParams.eventId = SYS_INT_UART1_INT;: ^1 z7 s- I& i9 Z0 y2 E4 F# e; Y- k
// 传递到中断服务函数的参数- K. u; F8 H# D5 @
hwiParams.arg = 0;* p7 l* k$ A1 q6 {! v. P
// 不允许该中断自身嵌套; v: j/ H* x3 G; k
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
$ }" i( v1 d ^6 \ // 使能中断0 z7 c3 g2 e( m- R6 s0 D! y
hwiParams.enableInt = true;. K) c( j N3 q" t" O: ^+ r
// 可屏蔽中断 4
) E# {- N* T3 r( b& X5 p // 中断服务函数 hwiMain; m4 z& } O% H3 G
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);* G. v0 j5 s. J) i
if (hwi1 == NULL)
% S3 w7 n- M3 U, z System_abort("Hwi1 create failed");
- |; v: k* ^/ f, q BIOS_start(); /* does not return */
W% K8 K+ F; Z return(0);
" p- D9 s4 v7 ^; x}; f/ f9 u0 ~' o& I) B. J
4 Q% Q) r) f; B1 o* q |
|