|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下/ O5 s" Z* t) o8 d+ b1 \
// 发送缓存
x! d3 [5 g' uchar Send[] = "UART1 test......\n\r";
! s$ |: {$ o& m
, v$ I Q9 J% N7 |extern void UARTconfig()0 x- A: v( Q& W- N
{
! `! L+ Z0 }- Q0 \7 ~ //使能Uart1
! J1 x3 J! X; g# l! K9 r# f) \ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);. ]+ f+ }! C) A
, X7 I* Y( \6 U4 o
// 使能 UART1禁用流控1 s) F, P! c- a& ], f1 D
UARTPinMuxSetup(1, 0);
% a8 M$ [" c# K 0 w$ t0 \4 ?( ~% n% ?3 j0 z
// 波特率 115200 数据位 8 停止位 1 无校验位
5 ^; Y8 A) Z9 y5 t6 a UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);% \7 u( `* [% }6 u* Z
8 q1 W4 j1 Z; g+ s: v. g) [
// 使能 UART1- J* D- a# H/ I2 q: ~
UARTEnable(SOC_UART_1_REGS);
6 m, d- [$ T2 t // 使能接收 / 发送 FIFO
) q( z0 v; Y4 M2 c6 \; ^1 O- _ UARTFIFOEnable(SOC_UART_1_REGS);
k% O) v$ T$ s+ \. x$ ], q // 设置 FIFO 级别
2 |6 |. f3 t H* x UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);$ ^/ A$ Q: h8 A& C
//Uart1中断使能6 D9 a! m7 v" Z
unsigned int intFlags = 0;( B+ d; n( M4 i9 {
intFlags |= (UART_INT_LINE_STAT | \
# ]9 @ S3 p" u# t UART_INT_TX_EMPTY | \
B, g% ]3 s& H: }, Q+ H8 D1 t UART_INT_RXDATA_CTI);
$ ]# V# b R# J M2 ]5 B9 i6 C) N. `
UARTIntEnable(SOC_UART_1_REGS, intFlags);8 Q( e2 Q' ~: d" f
}& G3 l2 l' q0 g p
//UART 中断服务函数
% G7 n% i! J! E/ Y) G+ evoid UARTIsr(UArg arg)6 Q9 W% d2 ~0 [/ B. Y! j
{' U9 T& ]" A. i, ?
static unsigned int length = sizeof(Send);/ }6 `7 A6 M9 E- v/ K$ j- n
static unsigned int count = 0;3 X3 {* A7 @" P( Z% c
unsigned char rxData = 0;, Y5 P+ ~0 i; x* N4 R) V
unsigned int int_id = 0;; I& K8 |0 _2 m6 A
// 确定中断源8 ?: G0 B w5 I' i
int_id = UARTIntStatus(SOC_UART_1_REGS);0 n, ~9 j: ^, b" p0 t) R6 r
// 清除 UART1 系统中断! x* O3 L# v- E. E
IntEventClear(SYS_INT_UART1_INT);
6 h0 b: M2 W U0 L/ e& S- v3 J3 F // 发送中断
( S! B" V$ Y @7 i6 j if(UART_INTID_TX_EMPTY == int_id)7 i0 w; r1 |" [& S! J- R9 H! D1 r
{
4 E. V. D. J; n3 c% O if(0 < length)
3 Z u7 N* M E, v. G, y% c0 y* L5 S {- i" e4 {4 g+ v1 q7 O
// 写一个字节到 THR
# M" P5 n1 M8 x9 H9 a UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);6 r. T# W. M$ D+ L Y1 F" Q6 T
length--;. h1 n) @ ] M+ D1 T$ |0 [# o. t6 H
count++;. B" F1 C. I5 U4 I6 V, Z5 @% U
}" v9 W9 c* _; |7 N
if(0 == length); J, {$ E) h) J7 C% S7 W8 u
{
' v- F# U2 m; m8 s/ {( d // 禁用发送中断
9 }0 x* }5 w: X3 m+ ]% I0 V UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
% U$ V% S+ v0 i! w3 r( r0 [7 c }( ~+ k @" [' J/ l( P' A6 K
} `: c B' }/ N* J9 U
// 接收中断
4 N. A: L5 a- \/ t4 ` if(UART_INTID_RX_DATA == int_id), q- g& G# l% g3 m+ G& u
{
; n9 U7 ^/ E& O8 \ rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
: \2 B* J: A, W6 n* \ UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
1 H \5 t w( ^ }
9 _; w$ v0 a: D* |5 C, a% G // 接收错误9 E f' M8 c4 z& i* b
if(UART_INTID_RX_LINE_STAT == int_id)
3 F: }$ T5 R, O# w) B- R4 i) ^5 t8 i$ | {8 X) Z; c) v3 A3 c: T
while(UARTRxErrorGet(SOC_UART_1_REGS))
$ ?7 H ?4 z% v6 W3 t" \1 K {) b! x- D$ l7 ?( F1 a* T
// 从 RBR 读一个字节, L5 x9 @, {# I) f" {. k8 I8 t* @
UARTCharGetNonBlocking(SOC_UART_1_REGS);2 _, F1 `; [; \5 K/ k6 i
}
1 X* B# A+ c/ g* ~$ [3 Z }$ ] _% q/ O3 ]9 l/ L v+ y8 p1 z# h
return;
0 M7 X# I, o1 R" B3 t}
' } n) W% D! Q' fInt main()' u: y4 r+ S( g3 |0 N1 {9 ?
{
9 ^0 l3 Z5 J3 A0 P+ ` UARTconfig();//uart 配置! j: o/ a* ~$ R# u; o- J( L
Error_Block eb;2 k/ |" q- G7 v+ k" @
System_printf("enter main()\n");
" V+ ?6 f) d6 m `& ^" q8 d' Z6 U Error_init(&eb);3 C @2 i% K& A5 _2 E
// 动态创建硬件中断
/ V+ O4 v: W% g Hwi_Handle hwi1;4 b) O. V% ~ W& j
Hwi_Params hwiParams;" e5 g% x9 [# Q7 u8 C
// 使用默认值初始化参数. d4 `8 f9 t5 r& d
Hwi_Params_init(&hwiParams);
0 ^) ~0 z8 W: k' i1 ? // 中断事件0 P1 T. Q0 G2 @8 C$ N0 J g8 L
hwiParams.eventId = SYS_INT_UART1_INT;+ [ K1 C& f; }5 `' ]
// 传递到中断服务函数的参数
3 q- `& a! R8 s/ j# k* M. T hwiParams.arg = 0;$ v7 L; S8 j/ x% V5 s) V
// 不允许该中断自身嵌套4 y9 {! t4 \7 A2 g6 p, T
hwiParams.maskSetting = Hwi_MaskingOption_SELF;4 ~3 I% N7 p) t5 [+ y9 W3 _0 Z
// 使能中断9 C$ l8 _* \: ^% }' a
hwiParams.enableInt = true;0 ~7 n0 N0 P' [6 \8 ?
// 可屏蔽中断 4
9 U5 t7 m9 J: m3 \6 ~ // 中断服务函数 hwiMain
2 m& A. X7 ]% B, N+ {* G6 ] hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
1 x+ k& O: l. @ if (hwi1 == NULL)4 n) e; f/ L- Y2 z8 f
System_abort("Hwi1 create failed");
! l9 T) n+ C/ { BIOS_start(); /* does not return */- ~; q7 y3 L7 E. Q* k$ u* U5 \
return(0);
2 K3 C; j4 M2 q}
; u( @& p$ ^) v4 R3 k ]' ?/ v( e! F( ~- G
|
|