|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
* K( U4 L3 u: ]* w( q// 发送缓存
" V/ T5 n1 x2 Q5 achar Send[] = "UART1 test......\n\r";% i9 Y1 h* H. G3 Z( h9 q
4 u4 _8 l% N: j8 oextern void UARTconfig()
( p8 C3 Q, ^9 H5 }8 _{
9 \6 a. y+ D3 m! @ //使能Uart1
, H. K7 H4 _2 ^1 B PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# A: _7 k6 @% k
" F& c' Z6 H4 Y$ z# r+ r // 使能 UART1禁用流控) B; |0 C O& J
UARTPinMuxSetup(1, 0);
/ I2 Y+ R# C, m2 P
5 X+ [' x9 p% b. w( N9 { // 波特率 115200 数据位 8 停止位 1 无校验位
& `7 w( a7 {$ }, ] UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
9 W; l* y( }; P/ b( r0 }6 ]8 ^ 7 m9 b+ Q# u8 L L; p
// 使能 UART1
9 G5 V; c; K. l9 o* |8 S UARTEnable(SOC_UART_1_REGS);. a q- ` z; J- m: D1 W1 g
// 使能接收 / 发送 FIFO
5 T0 \4 h& U3 q" r9 A% R UARTFIFOEnable(SOC_UART_1_REGS);
/ B' j! o6 m/ j( H4 o // 设置 FIFO 级别
1 j+ p% r) m& Z0 K8 ?: [& S9 t5 | UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
8 S6 J4 h- Y. v. ` D/ v' z //Uart1中断使能; x3 p& h5 U6 m7 G; m4 ?5 I, [
unsigned int intFlags = 0;- I* W6 N* y1 b
intFlags |= (UART_INT_LINE_STAT | \
& M, ?: X9 k$ c- R; q ?! ]9 ~ UART_INT_TX_EMPTY | \
4 k. Z" S. ~ D8 y* X UART_INT_RXDATA_CTI);
( ~" _1 X! K/ q) t 8 ]) `8 Q# [4 ~+ ]: D9 u# [. D& c
UARTIntEnable(SOC_UART_1_REGS, intFlags);
y! b7 l( s! e}. q) z' @7 i; [! P' E# D
//UART 中断服务函数
+ X; f0 }" \) t3 o/ |4 S1 s8 Vvoid UARTIsr(UArg arg)( U1 U" `" C7 J( ^+ y
{) a6 W( L$ b) v+ p
static unsigned int length = sizeof(Send);& _9 r7 l2 x) y" \9 L9 ?3 J1 U
static unsigned int count = 0;
0 }& {2 ]3 |+ | unsigned char rxData = 0;5 p; L8 ]. q+ ?. ]4 v: T6 D
unsigned int int_id = 0;
. Q: [$ B! H% l( g' A4 g0 T // 确定中断源" s1 p1 m/ r" X9 a3 L0 n4 H2 H
int_id = UARTIntStatus(SOC_UART_1_REGS);" D5 [+ s% w% q- n
// 清除 UART1 系统中断0 c2 b% [; R/ |6 A' O
IntEventClear(SYS_INT_UART1_INT);
' p& x5 h- m5 @! N6 r* O& a // 发送中断
5 c* y6 ]9 H* J0 \, M% }3 n" t* p( g if(UART_INTID_TX_EMPTY == int_id). m P' l" V; a* p# d: A. f
{1 F* X' @) d1 c4 B9 D# i
if(0 < length)8 I0 t& P; U6 G
{
% G/ o8 Z0 D1 ^' y7 O a% x // 写一个字节到 THR
& p% U+ ~1 P0 @2 u9 l UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
) M o6 c" N6 |+ K" V length--;: A2 a v% V N9 K# Q
count++;
& h9 f! r: t' ]& o/ f }
; j0 e. }+ I2 _& m8 Z. ] if(0 == length)& |; r8 m) A9 ]9 |
{
1 E% `+ |& E" K( F% t9 R% [1 L // 禁用发送中断9 M* u3 [6 L+ c7 J8 U" ^! k( Y
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
, O" M4 r. y$ Y9 F }
' B: U* q* R9 v }
* g1 ^" ~3 @+ F9 g/ q* S( [ // 接收中断
4 Z' P" b+ h9 `3 L6 z Y3 V% n if(UART_INTID_RX_DATA == int_id)
1 x& T7 z/ I4 q( i# M" M {
|9 L. s0 p* U1 w, t c rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
" Y. V) u8 ~& S% L( ~ UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);* g U5 W7 A8 s% T3 w8 T' `: P
}
; f, ]) z9 P1 K& w // 接收错误6 u- X- s8 e/ S4 l
if(UART_INTID_RX_LINE_STAT == int_id)
; M8 Y+ @, e5 o! S; E! y {! V( M+ a- q$ f$ v8 l; J
while(UARTRxErrorGet(SOC_UART_1_REGS))
0 R- H0 S; B; }7 F9 J; T4 G. W {. S4 t$ l8 a' o
// 从 RBR 读一个字节6 _8 u8 g( W/ ]4 t# X5 `7 m
UARTCharGetNonBlocking(SOC_UART_1_REGS);
( Q% E- W2 J# O }* L3 D9 ^- p% u* j8 Y7 w
}, j& m" h4 z% N$ t
return;
# O0 Y K, o) {8 `, {}5 \1 m+ R* H! r3 g# m9 x, M
Int main()
! D) F/ ~* { `, v4 L{ ; R; ^! A( C" c2 @( D0 w
UARTconfig();//uart 配置+ ?6 N) s. b8 E! |, A* l) D
Error_Block eb;
. O9 l K/ l& i System_printf("enter main()\n");3 }/ s) `- R$ R. R+ a
Error_init(&eb);# }9 b- z+ l3 b9 K/ M
// 动态创建硬件中断
/ N" c b- U7 q) a! n Hwi_Handle hwi1;
5 B% x# Q* s* P3 ? Hwi_Params hwiParams;
8 f$ t4 i ~- q3 H. h // 使用默认值初始化参数+ Y U+ |) b; z/ U
Hwi_Params_init(&hwiParams);
9 A5 Y ^! k# A2 u // 中断事件
$ {7 J8 v" G# t' ~: N hwiParams.eventId = SYS_INT_UART1_INT;( U" e9 x3 t' Z3 b6 _2 K; b1 M
// 传递到中断服务函数的参数
. d5 L L/ ]6 N9 Q1 H4 ` hwiParams.arg = 0;
! r& l$ }9 f; j; H+ p" m5 e // 不允许该中断自身嵌套2 C- b' A, O. F" m- s
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
$ O2 o& O3 J5 c$ T$ ^! T // 使能中断
. D( d% q# y9 }2 e, ` hwiParams.enableInt = true;
) b# r4 w8 m4 M# J // 可屏蔽中断 4) f. K2 ~+ r$ k4 T( U8 P
// 中断服务函数 hwiMain* e3 o+ @# {0 P. g6 L- x+ f" b
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
. G/ S1 P! {! F$ L6 Q. q; b if (hwi1 == NULL)- \; S, j( Q, f5 Q! N! m
System_abort("Hwi1 create failed");
/ S5 x9 n% i# z! T% q' j# u- f BIOS_start(); /* does not return */( L: h4 c2 A# A
return(0);
" A- \) ^- o$ y$ W( X}0 Z6 s+ r2 A" e! @; I! K/ Z4 a _
, v, t6 ]! Q4 |0 ]0 G
|
|