|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下6 {5 c0 X+ R0 o( b8 L$ l1 K
// 发送缓存7 Z- \- Y5 C3 R
char Send[] = "UART1 test......\n\r";
5 n" {5 Y0 u `& s' j# {4 R1 X* b; M1 N
extern void UARTconfig()
8 O- T% Q5 B( y0 G{
$ r- I8 N) l7 l4 Z //使能Uart1- |) c. V! B, w7 l# w' e
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);+ |& r% R/ w* P1 \) A
6 ]7 s, C7 a: L: [- f# W
// 使能 UART1禁用流控3 x, d+ \% e9 e6 ~: w
UARTPinMuxSetup(1, 0); \2 @: `( h3 j- }& q; w
e/ i( @; ]& Y% C) z7 @. g% M& n
// 波特率 115200 数据位 8 停止位 1 无校验位
) F/ r5 }% C' F E4 G/ Z UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
: n& t9 [+ v+ d0 i5 Z" t0 x I5 S* T6 h! L: L- f3 h) ~
// 使能 UART12 U( E! _7 | x8 }0 P: P5 u
UARTEnable(SOC_UART_1_REGS);
2 t, U; B# \4 q, a1 f // 使能接收 / 发送 FIFO
2 g+ I( i. E4 L, D UARTFIFOEnable(SOC_UART_1_REGS);1 N) z8 J# C: g- J5 v
// 设置 FIFO 级别* G, T& m; X" D% `# G. ~+ K
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
1 o. \$ ^% a% \% F0 Z K //Uart1中断使能
1 r) w, k! K4 L4 D unsigned int intFlags = 0;
/ p- \( E [: T: N* J7 I intFlags |= (UART_INT_LINE_STAT | \9 {* J X4 w( d2 x
UART_INT_TX_EMPTY | \! a( w% t! _# h! I) J
UART_INT_RXDATA_CTI);
9 q) l8 ~# @, N# _' H7 g/ P$ t
0 T8 b& U9 q; M7 B! F6 K3 E UARTIntEnable(SOC_UART_1_REGS, intFlags);
4 m$ i- S% j2 E6 ~( J}
* F7 O; H6 _0 v; l//UART 中断服务函数
: I9 O3 R+ \, [void UARTIsr(UArg arg)
' g; D. a8 J# t; j" K{
' }& O- g' E( G' H static unsigned int length = sizeof(Send);( P( E1 x. v% d" S3 x0 B1 k
static unsigned int count = 0;
; B5 B( |( K( N# ~4 z2 h unsigned char rxData = 0;
) F c" B9 l1 X! ` unsigned int int_id = 0;$ ^* S3 ^# h9 g* h6 \3 M' V8 F
// 确定中断源
" i& |3 e0 _( L) i- [ int_id = UARTIntStatus(SOC_UART_1_REGS);
' l2 p& U5 \: _ // 清除 UART1 系统中断
3 ?1 x0 ~. Z0 R IntEventClear(SYS_INT_UART1_INT);
: @9 F9 Q" R' x+ C: v+ W8 ~2 i+ ? // 发送中断2 L0 H3 ?' d1 y
if(UART_INTID_TX_EMPTY == int_id)1 ^; C4 \; X; D# X+ T: a
{1 j8 t2 B9 q' Y3 f Q, [6 I5 i
if(0 < length)4 P, S5 N I& y4 c, Z1 @3 M
{
* U0 P: J; r% M7 K( X- Q // 写一个字节到 THR
7 w+ W# ^1 Z4 K( d6 I1 H UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);. L( I! O& t, C4 j8 d' U
length--;
1 s" R- N# y& V+ l count++;
8 i5 L8 l2 R/ L" Z; W" U. S5 t }
8 Y! j- a( e9 X" V& q if(0 == length). a1 K \& P5 E
{
! s+ [: t: u: ^! v6 F // 禁用发送中断
8 V. e0 f. u) `. Z4 _6 q# E UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
% N8 u- x' A' ^/ z: t* `0 g: j }
8 | D3 x& y X+ _" d5 v1 d }
4 |0 r) C) D/ ^, L/ U // 接收中断 k1 O, E0 g! m% l
if(UART_INTID_RX_DATA == int_id)( Y: T$ K2 C0 L# D
{
; t4 e3 u; g; r' E rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
q9 F% T, p# p$ Y# D UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);) |- x, p( h" v" X* i
}4 r: @7 {1 ]( F
// 接收错误
6 I1 k% \( \! M; L1 I8 | if(UART_INTID_RX_LINE_STAT == int_id)
) W) a! R% Y$ I" H7 x& |! g" P {4 P& ]. |5 K! |& k4 O5 l1 z7 B( @
while(UARTRxErrorGet(SOC_UART_1_REGS))6 l3 k! a$ o4 n. K- h6 | L
{1 k2 t' S; o6 J) |; n
// 从 RBR 读一个字节1 F2 z* i7 g9 [9 T
UARTCharGetNonBlocking(SOC_UART_1_REGS);4 V f" l" Z$ j9 q* f
}! h) Q% [0 \: q; d
}
/ O1 t+ H6 S/ r M0 \ return;
% s9 H& ?( Z9 e0 S0 [}
7 ?+ \3 u: T% Z- w) t( a1 s3 s( L$ mInt main()
1 r2 Q/ P# M- j' ~2 S% z* J8 n{
5 D* _4 y: f' ^. @ UARTconfig();//uart 配置
/ M$ e& s9 C, e5 p$ x Error_Block eb;* l; E4 b0 g* g! W/ E I
System_printf("enter main()\n");
" A a% j: @4 z O. ` Error_init(&eb);
2 @; K8 y! n; L% @ // 动态创建硬件中断
6 A; k. v$ x+ ?! c; |, x$ g Hwi_Handle hwi1;
, [* ~; E+ v0 m2 D Hwi_Params hwiParams;6 h5 W, u3 u( i' h( C# z" c
// 使用默认值初始化参数) p/ X+ B# n4 T( I: W
Hwi_Params_init(&hwiParams);
. v7 B6 U; s; d* v // 中断事件9 w$ j6 Z8 {, k6 a7 v' d7 {
hwiParams.eventId = SYS_INT_UART1_INT;- \' ]+ L9 a, y# _+ O* F" g' Z
// 传递到中断服务函数的参数
' T8 I& {* K" I2 w hwiParams.arg = 0;
. {- u% n, r8 ~9 P7 K- l // 不允许该中断自身嵌套# X: H7 z8 B) f+ C* d* W' K( K
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
' ~$ D7 q0 ^! c- R( A8 N# \+ x+ g) J* ~ // 使能中断
! z# f1 j2 f- I& D3 n( T! w) I hwiParams.enableInt = true;5 h" ~: \5 d X* B2 E/ H" t, w% Y
// 可屏蔽中断 4- {1 h8 j' |% D* N
// 中断服务函数 hwiMain: [6 J( Y* u8 u( y3 g4 c8 I
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
" K1 a& N) a+ C# k3 p if (hwi1 == NULL)5 r8 q! `7 w! Z, @# g5 Y
System_abort("Hwi1 create failed");
: F. y5 E- M' x# t8 A BIOS_start(); /* does not return */
) m* r$ U$ }+ p- B ? return(0);' f- L0 ~& v. ^, @/ A; w
}9 P% u$ x" y# B; T7 L3 J+ T
. n" Z2 X0 u% E+ Y |
|