|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
- z" }% l8 X* Q4 f3 ^. ]// 发送缓存7 Y1 Q8 ^( s$ i" z! n5 v
char Send[] = "UART1 test......\n\r";1 v4 i2 d: m" P" H: w; S$ Z! _; e
8 C. V# Y% N/ N; Vextern void UARTconfig()
& w, O! @8 B; ?{' c1 N+ W! H1 L
//使能Uart1
/ J. c) P0 w2 t; R2 t( B: e0 ? PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 A# G3 k, m: d' u$ j- p }* G
, e' Q, g2 L2 U1 P' X$ m // 使能 UART1禁用流控
" i: L$ U$ N" m" s# H% q UARTPinMuxSetup(1, 0);7 }5 O2 G" d8 v( i8 f
+ C5 m9 l- l$ [$ X // 波特率 115200 数据位 8 停止位 1 无校验位
4 A8 h2 j6 j; M UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);* S K- s7 W8 y4 C
5 k* P" Q/ y1 v/ }$ M
// 使能 UART1
2 h9 W1 Y! \& ]; c1 g r/ Y1 c! s UARTEnable(SOC_UART_1_REGS);
" }6 D. E, `5 c! R: P s$ M3 l // 使能接收 / 发送 FIFO, i* r3 E0 z2 n' a/ N; W
UARTFIFOEnable(SOC_UART_1_REGS);0 f/ ^+ H8 B, u# H4 Z9 P
// 设置 FIFO 级别
8 c( X' @9 U3 Q9 D; U1 I5 r UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
: H& m. u3 F2 ?: P ? //Uart1中断使能
x% Y8 N; Z$ a9 E+ f6 j! J' `4 ` unsigned int intFlags = 0;
& s0 @4 `+ h: E7 n( \9 ^ intFlags |= (UART_INT_LINE_STAT | \+ U+ I0 R( j5 g
UART_INT_TX_EMPTY | \8 h9 E, U. ^( Y, Y5 v
UART_INT_RXDATA_CTI);' Z( g, { o; [+ X, n: ~: m
! A1 d7 e/ s+ w
UARTIntEnable(SOC_UART_1_REGS, intFlags);
& p9 U h4 m8 z$ q) ?- ~}0 L! t5 w A, m( k. }
//UART 中断服务函数7 a/ V# @7 p/ V! ]* [: Z
void UARTIsr(UArg arg)
3 ]3 r b" W/ e* E; |5 }{7 S3 l7 Z/ O9 T! P. _% |- {8 l
static unsigned int length = sizeof(Send);
% A5 f$ l) l1 L- L! Y static unsigned int count = 0;
6 a& h% e2 V5 f( V0 D+ q" y$ {! G unsigned char rxData = 0;, P" W9 @0 K% s/ j
unsigned int int_id = 0;
9 y2 U1 u. E/ z+ Y& I7 y // 确定中断源
) W( v+ q5 E; ]) s) A; h, J int_id = UARTIntStatus(SOC_UART_1_REGS);
3 G# D$ W) I7 Y ^ // 清除 UART1 系统中断
. R3 i n5 B: v IntEventClear(SYS_INT_UART1_INT);/ h+ x* M# y; f1 F( N
// 发送中断
6 ?! ^; W$ z/ P3 z if(UART_INTID_TX_EMPTY == int_id), ]( k9 o8 n7 l j9 ]6 Q
{; s1 C5 j4 a& P% k/ C1 T
if(0 < length)" Y" v, s' g* |3 |: ]
{7 H7 ?" N! W$ A% w. J
// 写一个字节到 THR
' h6 ]# i/ b: e& d \( G8 k UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
) ]6 h) T' z# [1 `+ v0 Y- Q length--;
+ g Q _% b0 D g( x7 i: e count++;
0 s0 }0 ]: {& B }
: P: Y ^& A, F! {, n; P" ~' g if(0 == length)! q4 _6 T4 ]; `0 @
{
- j# X0 d* C( ?: k8 S" Q // 禁用发送中断/ \* b2 S6 C1 k. [2 A$ v
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
0 r) F7 ?) G& }, [ u- i+ ~. @ }7 C: ]( D" k: J5 K8 t
}
J: l* K3 u5 |* g8 T // 接收中断
: D1 S, L- f+ ~' o7 F. g if(UART_INTID_RX_DATA == int_id)
8 |: b* P- y( |; I/ v7 I; Y( s) l {
" k! B( F9 F; e# K) ~ rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);) ]: J' J7 n w: {" l
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
0 p5 c! D' s+ } }
; V$ C7 L1 M4 f0 p // 接收错误
; G2 d% r! I p- V7 y& h if(UART_INTID_RX_LINE_STAT == int_id)
% {, \& z% \& M( J3 \ {
( Q. W0 J' B" [ while(UARTRxErrorGet(SOC_UART_1_REGS))/ b' U& }2 n2 ~0 [
{
( u8 a) H( T, k6 F // 从 RBR 读一个字节
# \+ n5 m' d- r: y1 a7 t5 E! h UARTCharGetNonBlocking(SOC_UART_1_REGS);( | T; G D9 r. U: f' }3 P
}
0 E% h3 n+ ]+ y& Z }. o8 i% O, |9 v" `+ P& ?, Y
return;- ]$ m" G& z0 D9 ~
}
( f- @) Q8 r% wInt main()9 k. f8 V3 b3 V H: ]% @
{
! T( x- g: U6 c% p3 | UARTconfig();//uart 配置) I7 f! z( d) g* J3 h( S
Error_Block eb;
( F( d6 @# R2 I0 ]1 O# T; n System_printf("enter main()\n");
" m% k) {+ j9 K- t5 ~ Error_init(&eb);
# D0 [2 U* i; S4 a // 动态创建硬件中断! S0 ^& P6 x% f2 q! [
Hwi_Handle hwi1;
3 p! O! e; _7 Y% }5 e' i" c Hwi_Params hwiParams;
! f' Z/ g+ G$ I // 使用默认值初始化参数 w9 n: `( E( O! r8 N( O/ b
Hwi_Params_init(&hwiParams);# l. t( f0 y. `4 g0 _
// 中断事件/ B9 _) }7 h/ C+ H5 Z
hwiParams.eventId = SYS_INT_UART1_INT;
. O8 R' }* A: z // 传递到中断服务函数的参数
7 ]$ U& e& I) n4 M hwiParams.arg = 0;
8 K( r) @2 u( [ ^& c // 不允许该中断自身嵌套# a% Z0 P+ p/ ]7 k3 K3 Z' h
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
* K b. A4 u, _5 M! c+ j // 使能中断0 B( Z( Q" s4 Z" V8 T/ P
hwiParams.enableInt = true;5 S/ m W# i" |+ O* Q' b
// 可屏蔽中断 4% ~9 V& Q/ L$ Y8 L! C9 A, C% L' l
// 中断服务函数 hwiMain
/ h' P2 b) O0 M" O hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
- W. M8 b2 M1 q+ ]. H1 \& | if (hwi1 == NULL)) _9 z* r$ T" W% k
System_abort("Hwi1 create failed");3 i2 [6 `' f" d0 E0 q
BIOS_start(); /* does not return */
/ g2 a# _! ]9 C1 r# L( ^ return(0);. Q: i8 t) A2 Y& H
}* g% {2 N% j2 [( w0 u! z
, O# ~1 u, x+ k5 U ]" r N |
|