|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下7 I, l% ^0 u5 l5 o% m) @! G0 n" X
// 发送缓存
. ^" v, G- f1 ichar Send[] = "UART1 test......\n\r";
2 n j4 D( U* N+ ^' N) y
8 K( w! M4 E" ^) j. `extern void UARTconfig()$ I w/ m2 @+ d; |5 ]1 F
{3 q2 x3 |, g4 H% o) ?' I
//使能Uart1* y/ c H9 X5 n% J$ G3 f( [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% P, ~* u) o! k5 E 5 t) W0 c* v, T& ?; D: R
// 使能 UART1禁用流控
8 E( n5 `5 U3 m2 a UARTPinMuxSetup(1, 0);
4 ? t8 m1 ?5 I% A
$ p2 {- d# D' |" y' e0 d // 波特率 115200 数据位 8 停止位 1 无校验位/ F( b% s" q' [: Q+ h9 C
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 X/ ?- J! t/ m3 q M
7 j% U5 h4 x$ }* X9 }$ f/ a- k! R$ Z: R // 使能 UART1
* T: T9 b. k7 c; t. P UARTEnable(SOC_UART_1_REGS);! K6 U8 P+ ^) f2 D; m
// 使能接收 / 发送 FIFO
" [( X0 {' I. j* D* @5 O' w9 ^ UARTFIFOEnable(SOC_UART_1_REGS);
8 d; o J# W5 D- N6 a* x2 E // 设置 FIFO 级别
" B2 u i5 ]+ P: { UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);- a3 h3 t* Q& n/ C# E
//Uart1中断使能# d T X- w" A& p4 y
unsigned int intFlags = 0;' ]& k+ W G5 t @/ \9 q$ {
intFlags |= (UART_INT_LINE_STAT | \8 ~2 {2 X# ^! N( A
UART_INT_TX_EMPTY | \, N+ s# N& x& I0 T) L, e
UART_INT_RXDATA_CTI);
7 u3 o$ s* d9 W8 Q9 @ I / \. C6 t' s. }$ G
UARTIntEnable(SOC_UART_1_REGS, intFlags);
0 ~& X8 V8 h6 l( X}
: ^: [9 a+ _; p: [- {//UART 中断服务函数
0 g y0 U( @% t* avoid UARTIsr(UArg arg)/ _6 c# f2 B' e0 z
{# y! @- T" C8 ^" w
static unsigned int length = sizeof(Send);
- ^: |$ @2 U( R/ ?, B4 } static unsigned int count = 0;
# n& R% \7 U$ V( Q; A0 J# X- F6 E ^ unsigned char rxData = 0;1 C; z% E3 t ?, U9 n
unsigned int int_id = 0;3 H; U5 A( W' N8 E& e# \: s
// 确定中断源
3 S# R4 N. }& H int_id = UARTIntStatus(SOC_UART_1_REGS);5 h% g- J" k8 u* R3 N5 y2 s
// 清除 UART1 系统中断4 h8 ]7 Y$ z' Z
IntEventClear(SYS_INT_UART1_INT);
; F; k3 H. Y+ u1 Y* y4 N // 发送中断
3 @5 s3 g4 ~; ^- N* s5 S9 ?& l2 h if(UART_INTID_TX_EMPTY == int_id)$ A/ Y( V# w4 i3 L
{% H+ v; \2 f: q7 i3 ?! d
if(0 < length)
, O" g5 X) z2 ~6 p0 V0 e6 g {
9 ?% ~. u% V% t/ a( [* g- v: v // 写一个字节到 THR$ V4 O1 Q( u+ b( ^: w" E) q
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);- }% w: {: I: I3 e8 n
length--;
9 N' k, Y2 C7 ]2 R: q count++;
# N0 d/ |( m9 T0 C }; t h) {7 z& e n
if(0 == length)
8 N8 G) q m# E: h {) R# @, O( T$ `" s1 ~
// 禁用发送中断. u9 o" @. k. v/ S! \8 z7 C
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);: }) Y) [" w3 L" q. s* s9 c
}! p1 B: S. O2 v5 k ]. s0 s
}
' @8 J; R. ]5 P3 L8 n+ l" } // 接收中断
) m4 ]2 j! o5 N' S) ^0 E5 w7 s if(UART_INTID_RX_DATA == int_id), r h1 Y) }( o! |
{& m9 h# x0 d# l# ~1 a
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
/ L% Q4 u$ N I* ~ UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);# c2 {+ x a1 B' s' j, e) _. W
}
9 H; M9 G3 N7 O3 @9 | // 接收错误! R, s4 r+ a9 W3 {! c
if(UART_INTID_RX_LINE_STAT == int_id)
5 g0 E2 y4 J- V/ J {
- o! F2 l3 V7 C9 q' |9 |" E while(UARTRxErrorGet(SOC_UART_1_REGS))& {2 P8 C# j" l. a1 @/ B' L
{0 B4 `. Q: F( R7 |
// 从 RBR 读一个字节: f* k0 v' k8 y4 ^: E( E/ t
UARTCharGetNonBlocking(SOC_UART_1_REGS);( g: K# A8 t3 K# F$ m7 p: r1 a
}; T' H$ Y2 N( v. W$ h C$ @
}
6 w0 R* T: d" t9 D- ]4 n return;. {8 t9 B! ~' R0 v2 w2 u
}
9 C8 E' d2 f# E6 B* jInt main()
. m; f" H& x3 U( }! B: {{ # b0 [% @& o$ [
UARTconfig();//uart 配置) x0 ?+ r. j1 J. P
Error_Block eb;. x' ?( g2 b2 U8 Y
System_printf("enter main()\n");
; j& \, G$ o8 e3 w k Error_init(&eb);. [6 x% d+ ]9 B$ ]3 q# B) J, N) G8 I
// 动态创建硬件中断% Q6 K. j" }, c) T" f
Hwi_Handle hwi1;
( j0 l: U7 s5 b( T Hwi_Params hwiParams;; V- I0 j4 j3 `* k: O t
// 使用默认值初始化参数
, D" v7 r f( \0 ]2 J- O8 T Hwi_Params_init(&hwiParams);+ g3 W) o3 s; S7 s* _1 |
// 中断事件3 O3 z* C( Z" ~
hwiParams.eventId = SYS_INT_UART1_INT;
( h- n, B/ Q2 _% Q+ h! R // 传递到中断服务函数的参数3 u9 Y! Y/ D( @
hwiParams.arg = 0;
' I) n4 ^% ^- C% { // 不允许该中断自身嵌套
1 E) t. x% w) ?" z hwiParams.maskSetting = Hwi_MaskingOption_SELF;! e* U2 O J9 F N1 J& b
// 使能中断
9 {, z- Z1 r, A; I2 e+ g; L% G* V hwiParams.enableInt = true;
* z M5 ~5 h+ A) F: L# @) g // 可屏蔽中断 43 T+ I c1 l& m) r
// 中断服务函数 hwiMain
2 N$ J, T7 Q& y hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);. L! j* f5 V- P9 u: _ o! D1 e
if (hwi1 == NULL)
7 `# x$ C: l9 ^4 t8 J p0 p1 V System_abort("Hwi1 create failed");8 S) F0 ^) Y" q8 V: W# G. R
BIOS_start(); /* does not return */1 \( I V4 L+ T+ q' Z8 d+ q
return(0);: Z. z0 O- m+ ?$ s. b4 y0 n* |
}8 J4 w( z) L$ q" U
/ ?- P# S$ S! p( u+ N
|
|