|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
' W5 ]6 | k" e" k" ]// 发送缓存- ?( D7 y3 q6 W* Q' {
char Send[] = "UART1 test......\n\r";
' {& Y, O( i9 x! Z9 d9 c
* _1 f- e3 Y" l2 Z* ?, B# e( d8 Eextern void UARTconfig()9 @% g4 V A, a' K1 f% c7 F
{
5 I! o6 |5 c8 C" ~# B' n, ] //使能Uart1
. e2 a. I" H3 @4 G PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( r$ c- [( _0 q3 T
/ a5 b1 Q1 M! f( f
// 使能 UART1禁用流控) q+ T/ l' ]" N; {7 {9 B7 y+ o6 o
UARTPinMuxSetup(1, 0);1 U; |. e, U+ e7 {2 C }* Y# m R7 r
8 F' e$ {3 r* ^% e // 波特率 115200 数据位 8 停止位 1 无校验位# }3 Z0 w# r! N5 G6 k
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
; {! J$ c/ e; c8 G
1 ]/ X0 [) u( o // 使能 UART1" \' K1 y4 U+ X6 o
UARTEnable(SOC_UART_1_REGS);
. P$ d5 x. ]; n3 S! q3 | // 使能接收 / 发送 FIFO% C0 C+ u* s3 T& y# e4 }
UARTFIFOEnable(SOC_UART_1_REGS);& f' x7 b' R1 `- h6 t! i
// 设置 FIFO 级别
! [+ f0 F* C3 }$ r2 | UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
0 o+ }& I* R, _% r //Uart1中断使能4 g' T8 S) X1 n/ s& w
unsigned int intFlags = 0;
+ g7 i+ [2 ~( K: i1 a intFlags |= (UART_INT_LINE_STAT | \2 H( w' ?3 O Q4 T7 P4 U
UART_INT_TX_EMPTY | \1 B: `2 U; B2 n! R; J* S' f
UART_INT_RXDATA_CTI);
: g' D8 W/ S/ _ U( v5 Y$ y + I' ~' n3 u# M- Z
UARTIntEnable(SOC_UART_1_REGS, intFlags); t7 _% Q, Q& p Y: p8 _/ F# ?
}
! a* y4 s! c5 ?2 F8 o$ ]5 O* `//UART 中断服务函数+ P }. i! S3 J! O7 {
void UARTIsr(UArg arg)
/ K# F% Z7 _' w9 j( a. N4 \- `{
; u+ Z0 f* T `3 n, ]+ m static unsigned int length = sizeof(Send);9 W- F( n9 b/ q! j
static unsigned int count = 0;
$ W/ \/ W7 P# x6 \; J) k unsigned char rxData = 0;4 g! x+ n3 G2 E" y' b. I
unsigned int int_id = 0;
% @$ F- U5 l3 |" b# o // 确定中断源
T1 t0 L8 d% T) f# m' A4 B& g int_id = UARTIntStatus(SOC_UART_1_REGS);% f, Q& \8 ?; k" C. I3 ?
// 清除 UART1 系统中断2 j( S9 N) @7 M& O0 s
IntEventClear(SYS_INT_UART1_INT);
8 J0 h# i8 Y. |+ F9 o! T" W0 [ // 发送中断
5 s+ U! c$ \$ R, ?+ t# b0 p1 r if(UART_INTID_TX_EMPTY == int_id)+ g" [! @; Q4 Q7 N
{
- e2 L+ d5 a6 M5 A- _ if(0 < length)7 C' V j" v: u5 F% d' S% r
{0 C6 P4 t- p$ X
// 写一个字节到 THR
; l2 a1 U- F \8 ?8 T UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
1 `" K8 X' N4 b length--;0 g4 s! m' X5 U5 z/ r
count++;; B# r' R" p' [) C. ^
}& `! t4 l8 M& _- p
if(0 == length)
( z7 a/ J6 t$ \6 [- h& n+ p {+ ?8 K6 K7 A; l5 L' b7 j) p
// 禁用发送中断; g; v/ L" S: m2 K- `
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);% f0 H0 G8 ?; @' n- ]! e
}7 P. ? D: W' H/ p9 c c& i
}$ F. m0 {8 v9 i1 X, f1 g
// 接收中断
& C/ L/ i' W8 Q& D A! t, @ if(UART_INTID_RX_DATA == int_id)
) l! i9 H6 H* V {2 h* U# p3 A, Z8 v5 n* I Z- `
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
/ T2 j: q, O6 Q9 m, V! B UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
; J- u& z" i/ f2 {7 v }
1 _: H) x3 b! R% ] // 接收错误
. R0 @- H) b+ S$ q* ` if(UART_INTID_RX_LINE_STAT == int_id)
R5 M3 ~2 ?& g9 H {3 S/ C8 z; Y, Y
while(UARTRxErrorGet(SOC_UART_1_REGS))
, Y+ }2 G0 z+ t0 J5 M {$ S$ I0 R: q- U9 b
// 从 RBR 读一个字节' v! _6 g/ E X" K; Q
UARTCharGetNonBlocking(SOC_UART_1_REGS);
2 A3 y; ~7 i9 f4 C; o }5 l. L, {8 n3 r8 V
} B1 y) _, Z3 \" K
return;
( s9 n" T, Z& H9 x; N: k4 W+ E7 C}$ i/ k; \" S& l+ q7 a
Int main()3 b% f1 P8 K# ]
{ 3 s, W7 p; Y9 n
UARTconfig();//uart 配置+ O$ {9 ?7 S7 R! J+ w
Error_Block eb;% f3 H8 D; e6 g
System_printf("enter main()\n");
/ ?( Q5 I6 v/ W6 k8 S$ q Error_init(&eb);
0 H0 r+ y" T% T4 T4 d // 动态创建硬件中断" b' ]4 g5 S$ ^
Hwi_Handle hwi1;0 |* A3 c2 F! Q6 [$ i1 U
Hwi_Params hwiParams;8 t8 w! c8 p# g8 m k, d' ?
// 使用默认值初始化参数
( D2 C" }: C( o% N f Hwi_Params_init(&hwiParams);
! p# V) K' o8 E0 h // 中断事件
6 V1 f# L/ T7 p! g hwiParams.eventId = SYS_INT_UART1_INT;
/ E7 h) b1 h! \. d: g // 传递到中断服务函数的参数
( H' `6 |' j( ^/ L k hwiParams.arg = 0;
/ ^5 S/ W0 v. b# u- L // 不允许该中断自身嵌套
$ V% r3 P8 o" P4 r B2 q hwiParams.maskSetting = Hwi_MaskingOption_SELF;& I _, c) x: K- q. N
// 使能中断+ B" d1 r& K3 s
hwiParams.enableInt = true;
' S( W1 `( I/ R% e2 `7 H, ^! R N // 可屏蔽中断 4
0 r, l$ [' B9 j5 l // 中断服务函数 hwiMain
* Y& b9 h) P: V4 N" L- S; T4 { hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);& l$ r! [- I' \, E9 T
if (hwi1 == NULL)
. ^- Z1 }& R3 X0 ~6 P- @ System_abort("Hwi1 create failed");: D' Z$ g2 ^7 p3 P! B( y
BIOS_start(); /* does not return */
5 F$ S% d) `! Q return(0);! Z3 E8 I9 E5 S' ?
}8 w9 W* ?6 y: I( \1 i
1 o+ R& ~8 I: i3 F7 p
|
|