|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下6 c& h6 s7 d! [. o8 `
// 发送缓存' t& g) f+ s4 w1 N$ [% N
char Send[] = "UART1 test......\n\r";
2 S! b; Q6 d$ e
( J4 o8 J# c. w; W' p* X. _2 A sextern void UARTconfig()
* D5 T* f$ d2 C$ W. J{
& Y( t2 p. \4 ], { //使能Uart1
# |& c3 \4 D) `2 k# { PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 m. p9 a8 S9 _* ?& y$ v( ]( C- N ! w) e3 O; z6 \$ D& i" T( K9 C
// 使能 UART1禁用流控* e [8 p5 L2 @; _* c2 x
UARTPinMuxSetup(1, 0);
( C, z3 j7 F* M
) `# B7 e* d1 `8 X // 波特率 115200 数据位 8 停止位 1 无校验位, s# r6 C' v# f1 O/ B% J N$ L8 E
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ N3 i. w- g; S$ [
( R8 A) k4 f9 W3 A // 使能 UART1! A7 s2 T- G/ _, i/ f" ]7 {, M Q
UARTEnable(SOC_UART_1_REGS);
" C0 R" U0 V+ V4 Y* O' X // 使能接收 / 发送 FIFO8 T V5 f9 N6 W' h) d
UARTFIFOEnable(SOC_UART_1_REGS);+ U% A, a% Q3 l. i, L" l: t
// 设置 FIFO 级别6 W+ p1 R; e: s, \9 r! V
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
# r) R" D7 ]# s) m- i# T //Uart1中断使能 I$ B& k. e# y
unsigned int intFlags = 0;
& {0 K8 f7 a5 @0 s$ M intFlags |= (UART_INT_LINE_STAT | \
+ q8 A* ?+ q0 ^- G: t UART_INT_TX_EMPTY | \2 `; b" s5 {0 H' r: r) F
UART_INT_RXDATA_CTI);
7 \/ c$ J1 b; r! w
0 {' R. e4 d1 o% F* E UARTIntEnable(SOC_UART_1_REGS, intFlags);& e1 B5 {; f- L+ P$ S; p$ o
}
1 R$ V% C" Q4 [//UART 中断服务函数
& r7 F: c- B: M# T9 e6 tvoid UARTIsr(UArg arg), h ^4 `- P# w8 O1 ~) p
{: J: N3 f+ s2 G
static unsigned int length = sizeof(Send);' `+ M! `0 Z5 [- e0 M6 y
static unsigned int count = 0;/ s5 ], c2 q' y1 S$ q
unsigned char rxData = 0;& G4 E6 d; r5 L: P( y8 G" y
unsigned int int_id = 0;$ H- T, @- t l0 O# n7 L
// 确定中断源$ v+ d4 o9 ]. L' F( \
int_id = UARTIntStatus(SOC_UART_1_REGS);0 g) c! {) J0 A1 `! m
// 清除 UART1 系统中断
1 X/ J6 Y0 j( Y# P& l% j9 M+ i IntEventClear(SYS_INT_UART1_INT);
# l3 |: {8 C. ^8 w- f, b) R // 发送中断
& Q6 S5 G2 j I if(UART_INTID_TX_EMPTY == int_id)
9 k- l3 o* ], K" B( V# j- D {. T) c: z7 Z2 S' P0 s( K
if(0 < length)
3 X& s+ P0 T1 B {5 j: O$ W8 a. `) \/ @3 |! r7 g
// 写一个字节到 THR
4 \6 F2 R- N: X) ?% Z9 l9 S UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);' f- W8 c: H2 B! I" D& U+ ?! B1 D
length--; h4 b: z8 ^4 U* i
count++;
2 K M L& O+ a. ^6 {7 \ }3 c/ i6 }! o9 t; s
if(0 == length)% V3 W( k, F5 }4 j+ T% g* y5 w
{, O1 _, u v3 ]8 W$ X
// 禁用发送中断7 q1 E- L9 L' g; \4 _
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
$ L# r* |0 X0 t. v) |/ V, i& b, I3 f1 W }
3 M! `8 r3 k1 ^8 l9 H+ m V }
! ^; H( S( z# m, }% b4 @( V // 接收中断
4 `8 L6 B8 B- @: h$ O6 [ if(UART_INTID_RX_DATA == int_id)
: g) `6 ~9 C+ C9 j0 l {+ w y1 |5 u! y/ _$ p: T
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);/ G- I) ^) g/ H" [
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);" f( h9 V+ t/ S7 C" P" F
}
8 W/ D# l4 b, G // 接收错误1 s4 }) j! W2 { [( k
if(UART_INTID_RX_LINE_STAT == int_id): |" r1 L. v: i/ L2 P
{3 I9 s& c" F$ S
while(UARTRxErrorGet(SOC_UART_1_REGS))5 q2 ^! u9 |+ h+ G% Q V/ z
{3 X! O' J ]3 A
// 从 RBR 读一个字节/ T' ?0 Y8 I F6 f$ H
UARTCharGetNonBlocking(SOC_UART_1_REGS);4 G) W2 C" L; @ |5 s* ^
}' p: W. `7 W& e0 F8 d6 C3 |
}
; C( ~8 d; c5 F return;; M; W5 Q3 e0 D6 K
}. x+ c4 Q7 M8 I; ]
Int main()
5 T, H4 g" r2 N y4 U' u{ 3 Y0 D# Y7 s2 e1 F2 G
UARTconfig();//uart 配置
4 [3 [! O% v. e Error_Block eb;
" m: g+ V5 C- m9 P2 f9 o7 l System_printf("enter main()\n");' C ^( X5 C8 w o
Error_init(&eb);; @7 s* Z2 d, z- O/ n) U' j
// 动态创建硬件中断: n6 H5 ~, Y0 l7 _, ?/ e
Hwi_Handle hwi1;
* L2 g: O1 n4 C r4 i7 i) W/ ^ Hwi_Params hwiParams;9 S+ z5 m4 ?( N# o% \
// 使用默认值初始化参数) R" a* z' m, \, S, i$ L5 q5 n
Hwi_Params_init(&hwiParams);" {+ J I K# p# ?9 c
// 中断事件
6 f5 x% Z! [- i e* Q1 I! m hwiParams.eventId = SYS_INT_UART1_INT;3 `7 D1 F# H# a) U5 [4 C% V) b3 }
// 传递到中断服务函数的参数: v g% F- w" Z
hwiParams.arg = 0;# Q; \% B: w+ B9 W1 w/ ^
// 不允许该中断自身嵌套4 |6 Z& Y1 Y: H
hwiParams.maskSetting = Hwi_MaskingOption_SELF;0 }$ g1 Y$ i; H9 x
// 使能中断) f* F4 H5 g* B- }
hwiParams.enableInt = true;, v. A" e O& [, p% d
// 可屏蔽中断 4* A o$ D+ o& J, k& r
// 中断服务函数 hwiMain
+ O( p/ o# n, n0 I# K hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
( r) }" e2 C* A- O) \5 n if (hwi1 == NULL)+ |# t( I3 o+ h8 v# ~+ e
System_abort("Hwi1 create failed");
6 G4 S# F7 y/ H! l) P8 p4 y BIOS_start(); /* does not return */
$ Y5 k: Y5 R0 v8 }% J. g return(0);
4 } I5 y, l% M' A! n8 f}
8 {" p; v& `/ W/ g# X
5 y# N7 T% J& z& H+ ? |
|