|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下. |2 ] g! X5 r/ b2 O w9 h& K5 p
// 发送缓存" x. t9 w% [3 x8 n" ~
char Send[] = "UART1 test......\n\r";
' V! l/ Y' _, H+ S5 ]* Q; F# f2 w+ |5 [$ p* S
extern void UARTconfig()
0 u- W. E( N' Z6 A' j9 i{' N6 c- h3 w9 \
//使能Uart1# u" V8 E# X2 n( Z Y. W/ O+ R* `
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ o0 e+ f# I0 t4 t 4 I* y1 d! k/ u$ ]' [
// 使能 UART1禁用流控
# ^, B9 a* B/ J& ]8 Z& H6 o UARTPinMuxSetup(1, 0);$ L/ {9 c: [1 U, N/ M
2 z3 V4 @ ]/ F8 v! l$ r9 r; v2 M% D
// 波特率 115200 数据位 8 停止位 1 无校验位3 Q' ~! K8 D: H/ d9 n$ Y
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
' P. _) _/ d; }' O . ?$ K6 f# T0 r; t9 o
// 使能 UART1
4 W" ~2 b) ]0 M# z, b) N: C UARTEnable(SOC_UART_1_REGS);
5 O1 ~0 E1 Z4 @1 A+ m) e l' C // 使能接收 / 发送 FIFO
# A) \. O- x' i) U. E; i. W% I8 o w UARTFIFOEnable(SOC_UART_1_REGS);- }' Z" @2 [, U8 d, i
// 设置 FIFO 级别+ H- t7 w) P/ I5 W& W) _6 i- O
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1); C8 E6 v5 S% R k" j4 E
//Uart1中断使能$ E. p; v- B/ ?( _6 h
unsigned int intFlags = 0;( e% e# q! B4 z( \" m* \
intFlags |= (UART_INT_LINE_STAT | \
. u, j+ e9 @7 ~% l UART_INT_TX_EMPTY | \
7 h# Q) Y* E. g) h) Y3 |- x5 h) v UART_INT_RXDATA_CTI);
3 S# r( S8 r- N ; M$ F6 X$ j- u& b7 q6 A
UARTIntEnable(SOC_UART_1_REGS, intFlags);
5 v7 t+ l X7 ~3 l: }3 A+ \* v C' P' G}
0 {! y! C' X4 ~) _; B/ T//UART 中断服务函数+ Q9 w) c/ O: a
void UARTIsr(UArg arg)& n9 \: a/ I- x4 E
{
/ i9 X- i# k$ ^# ]1 S+ U static unsigned int length = sizeof(Send);
P& O7 ]$ E- M0 {$ [7 L c static unsigned int count = 0;
9 N8 B- U: d3 R4 o unsigned char rxData = 0;4 @$ R6 A9 k! G2 p* W7 m
unsigned int int_id = 0;+ ]" |, o# G! m, z; r# R- Z
// 确定中断源+ W# z9 `( b7 r+ w4 R9 z, i/ s- p
int_id = UARTIntStatus(SOC_UART_1_REGS);
- J, S6 }5 T' z4 A; A. Z8 ^, P% Y7 g // 清除 UART1 系统中断1 M" R" |( V$ D
IntEventClear(SYS_INT_UART1_INT);* ^6 b% D) G: i% @
// 发送中断
: m+ I; ]0 G& g$ W if(UART_INTID_TX_EMPTY == int_id)9 \9 @+ i9 ~% s- Q0 g6 _1 {4 G' U1 c
{
* |+ T9 g. H% @8 {/ s if(0 < length)
. [9 Z5 w5 F9 W; p% D8 ?- A {
) A3 y+ n& r+ Y: s; X! n. S9 F // 写一个字节到 THR
" K+ I6 b2 v; i6 O' z UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);' R/ r+ T$ J* [
length--;
* q* Z& J C* ~+ M count++;
, {) g v) c r% N& m }
& x# L$ Q& J+ N. t9 k n" \+ Q if(0 == length): @# F. x p0 Q% r3 {: r' y
{8 j4 @6 h8 q) X: E6 z' U8 l+ C
// 禁用发送中断+ M6 r5 K( {2 A$ Y" p, z; H* R+ x
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);- M: i2 n: @/ ^. ^3 f9 h+ U
}
_- Q: \0 R' D }
& N o. O3 k: J3 U // 接收中断+ d. X) V4 F* f- _5 Z9 w
if(UART_INTID_RX_DATA == int_id)5 i' M6 ?/ _4 d3 e' q
{3 v V; s2 N8 X, q+ d& Z, ~
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);3 T1 e. X7 Z( ^* S7 H
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
5 G2 |* `* c; w, P: X2 }1 a% y7 v }
0 s7 H; z8 F" j6 x4 E; [ // 接收错误
) W, Y& Y9 q7 m, E) S if(UART_INTID_RX_LINE_STAT == int_id)- B2 h! \: [- t# v
{
, u. [% @+ O: o+ l) h while(UARTRxErrorGet(SOC_UART_1_REGS))' j: z) i$ I4 U* M' D8 |. O
{
* E9 l0 s0 X" S2 L( `' s8 N I // 从 RBR 读一个字节) M% X3 _2 }$ ] Q
UARTCharGetNonBlocking(SOC_UART_1_REGS);- f. N5 r( d/ r: @* @* |
}6 U) r6 s2 ?2 o, g
}
5 t, f8 n) T) T return;2 }% F% q5 [0 A- T/ R/ e
}
* p8 `4 e8 d6 R8 }: }* b& kInt main()
7 k+ o+ |$ j' @4 S9 ~; b$ |: B{ ! B8 ~0 Y6 W8 k/ c( u7 |* h, D
UARTconfig();//uart 配置/ x! r7 N/ ?3 a) B
Error_Block eb;
4 p* o0 V! w+ F, g. ?) j/ h System_printf("enter main()\n");2 y; R) ~8 d4 m5 @
Error_init(&eb);
' O( C; B7 D6 h$ n6 {* x // 动态创建硬件中断
- q7 K ]' r5 J! I$ q4 B8 T Hwi_Handle hwi1;
. [7 O4 s9 Q4 \3 g9 T7 \1 A Hwi_Params hwiParams;% H: J# l* J: x7 [3 E8 n
// 使用默认值初始化参数
+ o. N6 t/ l5 m$ P/ ?8 W# V Hwi_Params_init(&hwiParams);
9 j1 [+ {5 a; g' M0 v3 }' a // 中断事件5 R J: ]# g+ V+ P
hwiParams.eventId = SYS_INT_UART1_INT;
: a3 L2 g6 B! x* T; A4 \ // 传递到中断服务函数的参数
" Z; M% x. a. O+ S! b hwiParams.arg = 0;( h- R! f4 A+ ]" }% g# s5 \
// 不允许该中断自身嵌套
0 r! w4 W M) A) @ hwiParams.maskSetting = Hwi_MaskingOption_SELF;
) ]+ Z, X; S! p+ d0 i& p3 W* \ // 使能中断) g8 L7 I, ^5 {0 E# {: u @
hwiParams.enableInt = true;: @- H1 ~* \; b/ y5 ?4 ~3 z! p) d
// 可屏蔽中断 42 j- F, k; @- \0 V6 F$ u: @% A
// 中断服务函数 hwiMain1 k1 f1 L7 _2 v5 I7 x8 m7 \3 t* y
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
" W/ O5 z+ u9 u7 y5 ? if (hwi1 == NULL)+ |+ k9 a$ U; L3 d8 c' E* C
System_abort("Hwi1 create failed");
3 q" E& y- ^3 t# C2 j8 }. n" } BIOS_start(); /* does not return */
8 s# `7 Q9 R/ w H2 y2 A$ O5 d return(0);; Q& ?" e# q+ M: z+ K, O. H
}
2 ?& ^$ ^# Y+ p9 F! u; u# G
) C" T* v) w! I$ N" F; I' D |
|