|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下+ P! ~( d* D+ Z' Q' D
// 发送缓存4 w& f1 T. {* A* G
char Send[] = "UART1 test......\n\r";+ _, S& }9 `! B; h5 s1 f6 U6 C
! ^3 b" L+ R% T8 @7 Zextern void UARTconfig()
S0 s/ a. I4 p{
3 J7 C. V. o9 { //使能Uart1% a# q1 F# A1 k: ^3 S$ ~
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);' B1 c2 |$ G# r( c
% ~% T- U9 h9 p" g; l; \8 K; Y // 使能 UART1禁用流控. P: p0 C4 a e x5 R) T
UARTPinMuxSetup(1, 0);4 V2 D) j) a# {
! t9 n. G0 u2 r3 S/ W+ L // 波特率 115200 数据位 8 停止位 1 无校验位: ]! | V9 e6 S9 |% F a
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);8 |/ C R6 C0 K9 V. m
7 N0 A' g9 ^& i // 使能 UART1
( t) p# S: r) ~2 Y7 \, x UARTEnable(SOC_UART_1_REGS);
$ f* r# _) Z: s( n3 V // 使能接收 / 发送 FIFO: Y7 O$ j- ~) M; k/ ^) r3 m
UARTFIFOEnable(SOC_UART_1_REGS);
5 T8 j" e/ g/ U" u, L: T // 设置 FIFO 级别* E0 w7 O+ V8 X7 ~9 c1 V$ ~- O5 k
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);9 S# v S; G8 R9 h4 O
//Uart1中断使能
) V2 z5 ^2 E4 \7 B* K unsigned int intFlags = 0;
8 M: e# b/ T( a8 d& z9 z4 y: O intFlags |= (UART_INT_LINE_STAT | \: G* p6 F t3 y% W; o7 x
UART_INT_TX_EMPTY | \; |0 K) t$ V$ `- ~7 W3 s q; l- P
UART_INT_RXDATA_CTI);8 e( [( C$ W) m% u: d
6 g7 c2 ]# t2 u UARTIntEnable(SOC_UART_1_REGS, intFlags);+ F) M; I9 G, I8 v# ~6 G
}
( X- |! m: }9 p//UART 中断服务函数
2 X! d$ q5 b0 w \void UARTIsr(UArg arg)- [5 @' k; k# x7 w
{( J2 U3 T# B2 e5 y y( X8 e. ?1 M3 r
static unsigned int length = sizeof(Send);
9 Y8 J0 {& h+ T- H+ N1 |* Q static unsigned int count = 0;* I: N7 B0 t: J$ z
unsigned char rxData = 0;/ u, `) }# D4 J0 [
unsigned int int_id = 0;9 \) w$ N; K$ p5 _6 O
// 确定中断源3 x2 C9 b. C! X
int_id = UARTIntStatus(SOC_UART_1_REGS);
% U* S( \( w( Y. @, y // 清除 UART1 系统中断! n Q% X8 i* a# f
IntEventClear(SYS_INT_UART1_INT);
- f: X# ^9 U5 f* B$ r // 发送中断
4 g: F2 p/ u: a2 K if(UART_INTID_TX_EMPTY == int_id)
+ ]' ^! w: r6 [& V {6 S: C( F5 q8 c; _! ^
if(0 < length)9 v( ]2 `) F5 |) ?' C
{: c0 W2 h2 N8 a# L# d, A
// 写一个字节到 THR
% v4 Z, l2 ?9 e" k UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);/ t) F9 n9 ~, D" d
length--;! _9 L% U+ z, W% F# F& n
count++;2 ~; M2 }4 K6 G$ x. c
}0 l' G7 m% ]2 X$ z; b
if(0 == length)0 B) [7 J* w5 W* Z5 X6 A" b
{
$ p8 _+ N$ j2 V- X% r( b' N0 t // 禁用发送中断
0 m; R$ k: D0 I3 G# E5 f: H UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
! s7 J* ^3 \" W" j' q }
" n- l8 i, S) i: x: y" W }
( ^! k/ A( C$ G // 接收中断
: T% y) d. `4 E* d" ~ if(UART_INTID_RX_DATA == int_id)% \* m) t; N: |; w0 V3 }; y& W/ @
{
( g. `! k) J0 r( Y w M rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
8 _& a7 j7 M' |8 Y+ b UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);- l- q! A# ^8 V; T' w9 C! R3 |
}
) L- N4 h* M; O$ g- w8 ]; p // 接收错误
6 a0 m& D2 x( Y7 u if(UART_INTID_RX_LINE_STAT == int_id)9 B1 v1 c) r6 r3 K
{
% v! O- f3 X( Q0 [$ A while(UARTRxErrorGet(SOC_UART_1_REGS))5 z9 f$ W/ {) a) @1 D4 K
{+ C( }5 c% w7 l5 f$ E! U
// 从 RBR 读一个字节4 {) t+ G9 O% P& Y& c/ v
UARTCharGetNonBlocking(SOC_UART_1_REGS);
( @ x: a" o0 ~3 g }0 |3 l6 \+ r4 b
}4 g# i7 M/ F) D k* B. A
return;
' e" k( |) t7 R5 g}0 I# K0 Q+ h$ B
Int main()
4 U" [' L9 _# k7 `9 }) E{
/ }0 O( I' ?" a8 y UARTconfig();//uart 配置
$ E3 g1 C- U5 k0 L: a6 y) Z( s Error_Block eb;. \: W# ?! `* x5 y8 i
System_printf("enter main()\n");. o# z6 ?. N4 K$ Q5 K: u. A, O- S+ P( _
Error_init(&eb);
7 `; l& L9 `4 d4 l- S // 动态创建硬件中断' q2 |1 G: \0 [1 P; m
Hwi_Handle hwi1;$ C( `' E" J( U4 n, r# W) l7 X
Hwi_Params hwiParams;
8 q* _! W; G8 u; y8 a. @1 e- `0 ] // 使用默认值初始化参数! ?( ^+ W# K5 y F1 U g+ ]- D
Hwi_Params_init(&hwiParams);* Y& M2 @& V4 i# [- X3 g! @
// 中断事件
3 E) f2 R$ L. }$ D hwiParams.eventId = SYS_INT_UART1_INT;# ?" t* d- p- @0 ]) d" v: Z
// 传递到中断服务函数的参数
- V+ s6 H0 c. K# @( L hwiParams.arg = 0;$ q+ h! l! L. N& x% Z+ N' k, }
// 不允许该中断自身嵌套
9 u* z5 {* v7 A: z- D hwiParams.maskSetting = Hwi_MaskingOption_SELF;, W! Q/ l4 k1 g+ |* N. W2 [
// 使能中断) ?; @/ D- O; p6 v) t& L" y7 q
hwiParams.enableInt = true; [6 F) ^, w2 r/ ]* M+ _
// 可屏蔽中断 4
& H2 ^7 V, g& \: a // 中断服务函数 hwiMain
1 @, |' z0 w; U7 s hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
6 ?1 `/ p& Y; m! N. ~5 t if (hwi1 == NULL). F% m* G( l. I6 i
System_abort("Hwi1 create failed");
7 Y$ V' D% T$ Z( a BIOS_start(); /* does not return */
& Y0 U' O% K1 L: A$ N return(0);% O: M, F: \6 L$ W
}# v/ ?+ K! F; U5 b9 ]
5 ]3 n. C$ I3 r |
|