|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
5 d8 K! a" ?* T3 }+ ]; n, g# L3 p5 K// 发送缓存
% \7 ?0 E* \& |char Send[] = "UART1 test......\n\r";" N% K4 @" G, ?& _0 |# f. \# w
) n3 H* S3 m1 E4 x
extern void UARTconfig()
- s1 z% y9 {4 \ B* |{
! [/ R7 X) u. P- ^; f5 N6 U4 X //使能Uart1" E% n0 m% `; H9 f3 C6 S* u; w2 T
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 F, F% ]: R1 y . z0 ~% F& C2 K% d) ^
// 使能 UART1禁用流控
# [# q1 s- W4 z C, T UARTPinMuxSetup(1, 0);) D. K' J1 _, ^4 {& P) \/ q8 j
6 ^0 V. J# i, \" }1 f' B // 波特率 115200 数据位 8 停止位 1 无校验位
0 P3 _" W5 i% f& c; Z1 M UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);0 D+ a+ l* B0 y- B! r* ]( `
' a# y( x2 t9 ?
// 使能 UART1" a( v) n2 H! n% |
UARTEnable(SOC_UART_1_REGS);7 o" C1 U! i/ r0 M" {
// 使能接收 / 发送 FIFO8 z* z" Q2 R4 y @" z
UARTFIFOEnable(SOC_UART_1_REGS);
! c. N W Y3 n4 r9 Z( |& p // 设置 FIFO 级别: u! w# H3 ^- n v
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);4 |2 H. d+ ? X. h
//Uart1中断使能
6 }$ _& D/ S4 P, m4 o/ y c unsigned int intFlags = 0;
9 F; I9 n! p& |) ~7 y intFlags |= (UART_INT_LINE_STAT | \, u5 J$ t1 M p5 R& G3 I& |
UART_INT_TX_EMPTY | \
- E) E/ M* }9 R: W UART_INT_RXDATA_CTI);
6 M5 U7 D1 z& e8 X
- ^. p. J4 c! l UARTIntEnable(SOC_UART_1_REGS, intFlags);
* e; k- J: l, g1 i# n. C5 m% d}- m) |! p7 W+ e) [1 Y# x* ~! L
//UART 中断服务函数
# q0 _# d. x& O! Pvoid UARTIsr(UArg arg)5 q) y& ?! Y1 V; t
{
- l( `) t' w4 [ static unsigned int length = sizeof(Send);- h2 E# @1 D# [4 u3 Y
static unsigned int count = 0;3 c9 j: E3 x4 n& H) H6 C
unsigned char rxData = 0;% L3 h) }8 p* q( s8 Z y
unsigned int int_id = 0;
* d& v( \' G q, C. U // 确定中断源
2 T* K( @) X7 W. l; {2 z- Z. F* P6 H int_id = UARTIntStatus(SOC_UART_1_REGS);4 O1 _. J5 _/ Z- O
// 清除 UART1 系统中断
+ S# u/ z3 h' g+ B) b IntEventClear(SYS_INT_UART1_INT);
) j& z$ n+ i+ g+ } // 发送中断6 b* B p4 Q) T8 d. [2 |+ ?' Z
if(UART_INTID_TX_EMPTY == int_id)( ~2 A6 M6 R0 E/ U* u; x3 j. y. P
{
8 g" B% i! B5 `3 m5 B' A if(0 < length)
. U' I2 F; T% a* V {+ K. \, |; h1 W# S8 c4 b
// 写一个字节到 THR
0 }5 ?$ y# |1 o: r% O$ {, T$ } UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
+ ]4 m3 X. v ~4 I( M$ ] length--;
( `9 ~* f9 N7 u3 w0 D1 R2 z4 u/ t3 K count++;
j0 L" `* U0 L# [' K! ~; F }6 b9 H# q8 q4 M# W( @1 S3 K
if(0 == length)3 X h) e' X" v/ U' {' c G; H0 p
{3 c }3 Y5 a0 Q+ e6 [6 L% k
// 禁用发送中断
2 j$ N: p% `* Z* r2 A# [# y# `! h UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);5 l( Z- [6 a8 I+ k5 p0 A. B
}
3 s* F) @$ d* H- Z1 p1 Y }: l2 G+ j3 E8 q7 @1 p3 z( o
// 接收中断
5 g8 B8 {# w4 ^: V0 ?. F# @ if(UART_INTID_RX_DATA == int_id)0 D" q7 m. }: ~6 N: p
{) @0 [9 D( v! n) r& N
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);, m9 ]& f6 D7 I( F
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
/ z1 h7 @- t) k% D! ^8 Y( \ }+ l3 L* N: T$ ?, p; L. ^, T
// 接收错误3 m$ F- E/ e4 [+ X" D q
if(UART_INTID_RX_LINE_STAT == int_id)7 V' Y! ^7 B4 F
{7 z1 a A7 E; M
while(UARTRxErrorGet(SOC_UART_1_REGS))' ^* A/ P1 P. z
{$ b2 n, g; h" _6 F" M. l4 p
// 从 RBR 读一个字节
9 A! M3 d" D8 C6 L; q+ G/ h% R! t UARTCharGetNonBlocking(SOC_UART_1_REGS);7 C F! i9 w3 j' L" F
}
+ D M9 L; v% ~ }
6 Q; A1 A/ O. N0 s/ q1 o% }1 J return;
1 }% W7 h! ^5 o4 f/ g" U}
0 K! w0 ?& e. H- q3 fInt main()1 A; C+ R5 J4 O! H; C+ ?
{ 7 Q( ^8 ]! `% o6 \: ]5 k+ h( u& R* j
UARTconfig();//uart 配置
, u0 ]+ E+ M! G# d2 {/ n5 a5 K Error_Block eb;
( ~- C. ?: ~8 {% M4 b System_printf("enter main()\n");3 l8 C' U$ c2 z
Error_init(&eb);; l7 F( i q& Q) k7 F
// 动态创建硬件中断; a8 Q& Y7 z" G1 E% F, N
Hwi_Handle hwi1;
7 N1 m7 L# N o% i& } Hwi_Params hwiParams;& n- E- P3 f" [- X; ?" X& [
// 使用默认值初始化参数. I9 i% E+ `4 |* \4 R0 H) Z
Hwi_Params_init(&hwiParams);
h& B& C7 B( P( @7 X* N3 @ // 中断事件
- l2 R% u2 u# { hwiParams.eventId = SYS_INT_UART1_INT;
- T/ H8 ~5 h* w# Y8 i) \$ F" D; H // 传递到中断服务函数的参数6 k1 C0 W9 _; z
hwiParams.arg = 0;; j5 G% N N) `5 m
// 不允许该中断自身嵌套# o7 J& x, l5 a+ E! \- N
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
1 a# K. Z8 J) m/ {: J# w; r5 i // 使能中断
1 e- w+ L! W! h3 b8 R- _7 u hwiParams.enableInt = true;
& ^8 n0 r5 J; Y // 可屏蔽中断 4
: A8 j* Z1 @) C8 a: D2 O // 中断服务函数 hwiMain. o6 P5 a8 R, p+ N$ Y9 V; O
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);4 z: R( K, s' O4 j8 n+ Z# H; m
if (hwi1 == NULL), C4 \9 y I/ s' g
System_abort("Hwi1 create failed");
8 N0 X) {% @) {: ^9 ~ BIOS_start(); /* does not return */0 L4 n# m$ q9 J5 X
return(0);
4 E O8 T0 d% R5 L, H}
3 k0 R4 |! B: V# k2 [6 I" u+ \
V* h) V2 y( k5 O1 z |
|