|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下& y0 p- B; L5 G9 C* B7 }7 o' R& G1 `
// 发送缓存
1 |4 [$ L8 R2 ]+ \. m! Gchar Send[] = "UART1 test......\n\r";
/ l* t2 M# s7 S& x) Z4 q8 N4 a5 H7 @- ^, q4 R5 E2 w" T0 x- {0 N1 f
extern void UARTconfig()0 c3 v$ S! W! q, s! C
{: O5 t7 G6 [8 K. n, E! J
//使能Uart1
$ r* g1 q% V, _ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' N+ u, Q' |; e7 C
L8 w$ k% f6 f- l# ]& u3 i) Z // 使能 UART1禁用流控- W6 I6 ~/ F8 Y. N. x/ I
UARTPinMuxSetup(1, 0);
. m# j) D7 k; L; @, Z! n; l 7 y& A1 e% z# \4 G2 N# ^
// 波特率 115200 数据位 8 停止位 1 无校验位
$ g1 m( @: W% @8 l9 h UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
7 Q. b- f9 y/ j0 F) a) b
3 b, Q. G; l. z F+ `' R/ L // 使能 UART1" v/ }& V" Q$ w( K! x2 R1 b. @
UARTEnable(SOC_UART_1_REGS);: d, }; q5 b& t7 Y. t5 v8 f4 ]
// 使能接收 / 发送 FIFO
) f- u0 s1 M; F0 t UARTFIFOEnable(SOC_UART_1_REGS);% t# W- [) D: J: N; x8 ~6 I/ a
// 设置 FIFO 级别
! o8 x; b! A- Y1 y6 d& ] UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
* M" \9 _6 [( c8 h5 D7 y5 r. V //Uart1中断使能
# T, b) ]5 x. ?' O: Z unsigned int intFlags = 0;
, ~* j0 R7 z8 h intFlags |= (UART_INT_LINE_STAT | \3 I, z* O9 v3 E7 d9 v) @
UART_INT_TX_EMPTY | \$ G/ |+ W9 g/ X4 \' b
UART_INT_RXDATA_CTI);0 f* x/ O! D* @! O: Q" ?
5 x) p$ q" b( I, H
UARTIntEnable(SOC_UART_1_REGS, intFlags);) P+ g t* s5 ]8 A7 Q; f' A
}
9 q& B9 U" R, {//UART 中断服务函数8 _+ |* [( s5 T; I5 l7 y
void UARTIsr(UArg arg)6 F! R# P' {4 F1 z
{
# q5 z" t7 [3 [6 E1 R n static unsigned int length = sizeof(Send); T+ Z7 E2 j, o- E1 S: q
static unsigned int count = 0;
$ v$ X Q% R( K m, [ I( \, A unsigned char rxData = 0;
7 y- c: ]0 D& ^+ R; Y. j unsigned int int_id = 0;% d' O. i1 s, s+ y3 F3 ]7 Z; q
// 确定中断源
7 o+ E$ @: v3 E. j, { int_id = UARTIntStatus(SOC_UART_1_REGS);
+ T8 l7 i! |7 Z7 | // 清除 UART1 系统中断+ Z. K' I6 f8 u+ R9 i
IntEventClear(SYS_INT_UART1_INT);% `: ]+ f1 u* i' l
// 发送中断
& {9 O: s5 q; O0 H1 G1 A if(UART_INTID_TX_EMPTY == int_id)
- C1 H+ N: t$ [8 ^ {
; ?- x1 P7 d& i8 D: P* k if(0 < length)! D6 P t+ u. o4 I4 k/ o
{3 T3 k9 V. A! Q6 w
// 写一个字节到 THR
% l0 q [& }) O" X, o$ ~ UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);1 r" b( y- ?* r: A3 e; w
length--;* [, D, ~! @# H5 J
count++;, z; a! q d% O6 |' h7 x
}, Y9 B9 x7 K n& o5 H( n$ v$ c7 f
if(0 == length)/ ^5 I, y8 F8 q/ J; d
{( R3 L+ g) O' `6 R% Z
// 禁用发送中断6 Q8 ~: A- G1 J& f5 x% m9 V
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);9 U# T6 m& @9 {4 v- W7 [8 l/ r
}) V& B- x4 ]% a" R" Y
}* _0 A. Q0 G/ J( i, z; L
// 接收中断1 G& p2 \2 L {) `
if(UART_INTID_RX_DATA == int_id)
) l: X) R( _4 V Z {3 h* N1 Q. p: A/ f2 }3 t
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);; g# z( k7 |# u% Q
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
?& j( k6 w* ? }& {* N% i3 d8 N3 M. @5 V: i' }
// 接收错误) V7 Y+ Y5 B( _0 @6 S+ f+ A! j6 {
if(UART_INTID_RX_LINE_STAT == int_id)
0 V8 N. `1 c" b2 j. y7 A- i {
9 G ~" G0 T4 W r( L3 C0 K while(UARTRxErrorGet(SOC_UART_1_REGS))
) v8 T" I! c7 `5 h {, n( ^& {0 M3 u. \) h/ J" D$ H
// 从 RBR 读一个字节
: k6 p6 {8 x7 N9 T% `0 |/ f UARTCharGetNonBlocking(SOC_UART_1_REGS);) ~" s' S1 S) Q0 h9 c2 n4 p
}
; E% h3 [ Q$ B& e8 A) ]0 b. L }1 C6 I& c; ]7 P$ I& o, f; g9 f. @! O
return;/ }( }4 q- U8 x6 r4 X
}" K3 W D: d6 I* J9 t( u
Int main()# g1 O& B( V. j* m2 D+ {" Y9 \5 g
{
! s2 `9 p- r0 x. y. _& j2 c7 P' r UARTconfig();//uart 配置
2 ^2 ?! g" y8 c6 h* e0 t6 a Error_Block eb;& o0 M+ L; B* y% C8 w4 F: a7 T
System_printf("enter main()\n");
, n' {8 t1 K3 n4 | D% Q o K: t) I Error_init(&eb);
( Q5 d6 c2 y, y // 动态创建硬件中断
& @8 Z& |0 {2 {! q( U7 w+ G Hwi_Handle hwi1;
, o! R- n6 D q: Y/ V% b2 T/ S- \" C Hwi_Params hwiParams;/ `( V0 I/ S9 h. c3 A* N$ g
// 使用默认值初始化参数
1 X& }$ E0 `7 [ x( i, q* C" ~ Hwi_Params_init(&hwiParams);
3 j8 v/ F' g7 m( t. Y2 | // 中断事件
' O' N' l9 J# ]0 f hwiParams.eventId = SYS_INT_UART1_INT;
- O8 c+ q/ C* l N+ n# h) h // 传递到中断服务函数的参数1 n( X& c, B- n3 n' q! ~
hwiParams.arg = 0;: d' s- \6 f8 e- b$ e
// 不允许该中断自身嵌套; E4 X$ M* U0 ?3 U* O
hwiParams.maskSetting = Hwi_MaskingOption_SELF;6 c8 E0 M+ i2 a9 }4 n% n
// 使能中断4 @, A2 ~' F+ K& M
hwiParams.enableInt = true;/ {; ^) ?* ]/ V$ [; X' j" i
// 可屏蔽中断 4' G, p) {& M0 [' J1 L+ e7 {
// 中断服务函数 hwiMain
; e7 n1 w& o- `' B' m6 }- P hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);: G, R" H% D% P" }1 u# l
if (hwi1 == NULL)
~# `8 S, d8 J) `' m System_abort("Hwi1 create failed");% h/ S! V9 k( r( o
BIOS_start(); /* does not return */
! B2 @5 ~. Q7 I" T return(0);
0 H A- K( R) {% }' A( C L, r}. [/ s1 J3 a/ G+ C5 Y
9 [# B! Z% M9 z* H9 i5 Y* O |
|