|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
! o/ v d$ s; ^/ h) G" }; q// 发送缓存
( [1 _0 \* _# jchar Send[] = "UART1 test......\n\r";
/ C' }. w7 o8 h4 ~% r/ U8 t9 a
s5 Q: g& O6 |3 Vextern void UARTconfig()
# N7 N. J9 [% K' U3 M7 q& ]0 j{6 ?- Q7 b. O+ w A5 T) v
//使能Uart1
9 U9 H0 s4 `! l7 g- K PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; R$ K4 r' [5 h
; q- T- a9 B$ w3 t% E8 { // 使能 UART1禁用流控
5 j6 @# `! R) y UARTPinMuxSetup(1, 0);" U0 |9 f; u. r/ L. K" G' J' M: ]
* v$ U$ q* F3 R, v0 C3 y* } // 波特率 115200 数据位 8 停止位 1 无校验位
; d% `9 N5 }) }# j( [ UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);5 R. U9 J- ^6 _9 i) L
( o1 o. V7 E. X& y% l9 p // 使能 UART11 o+ b% m7 J" R1 k2 X8 n, b& p$ t
UARTEnable(SOC_UART_1_REGS);6 C$ J& d5 T3 o& l
// 使能接收 / 发送 FIFO0 T) _8 u/ `, Z: l2 b/ m
UARTFIFOEnable(SOC_UART_1_REGS);# d: W% @/ P4 u0 f
// 设置 FIFO 级别. Z5 L" G# g& T! f$ u# d0 ? z3 l5 Y2 {9 {
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);) g% A4 w! B6 O) i, ^3 s
//Uart1中断使能 K) `. _4 D1 s8 v) z
unsigned int intFlags = 0;- j; \4 \! f* K: s) b
intFlags |= (UART_INT_LINE_STAT | \- @5 ~# m( _# A5 t2 T5 z
UART_INT_TX_EMPTY | \
! C5 [$ R: G6 R( C UART_INT_RXDATA_CTI);0 F. `' u7 p' }, {/ ?
( r9 }8 ^' Z. B) r
UARTIntEnable(SOC_UART_1_REGS, intFlags);
& w4 A. Q0 b# N4 B}8 B2 A4 { c: N5 a7 F& l
//UART 中断服务函数
2 K4 ~9 X, _( l) Avoid UARTIsr(UArg arg)9 t1 L' p2 a0 B/ @% h: K! f; F
{
7 `2 Z H5 G4 k7 N static unsigned int length = sizeof(Send);
9 Y2 B: `) z* X- `! D5 Y5 ~ static unsigned int count = 0;& Y5 ^; G' a4 c; o
unsigned char rxData = 0;
; }$ D) J* K+ v' \3 P unsigned int int_id = 0;
# y5 V9 T9 x8 a( F2 m; e // 确定中断源
$ g* [ E; g* Z6 j7 a9 K: T5 r int_id = UARTIntStatus(SOC_UART_1_REGS);; Z7 n4 M( O- W2 @2 C
// 清除 UART1 系统中断' W8 o( {7 \; \/ D ^& ?
IntEventClear(SYS_INT_UART1_INT);6 a5 ]# g( S! j6 A: T8 J
// 发送中断
8 ?6 e- ^" J4 B, X2 c% | if(UART_INTID_TX_EMPTY == int_id)
% v5 _4 ~% z; I: C; s2 D; X# H {6 ]5 `& p7 x5 J
if(0 < length)' h1 \+ S# c i' y$ ~, U
{" g. D1 r, h7 C/ i& I
// 写一个字节到 THR- w# n4 T" I' ~4 j
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
" r' M: }# o7 ^2 |, g# R length--;
^: I+ V; J5 m: m. ]2 X count++;
- [% B# y1 y+ |. g }0 L8 a" q6 K- @& V
if(0 == length)
4 x: r. R2 h9 w6 L ? {$ a& n2 {& E! M6 f/ \ a
// 禁用发送中断
: |: ?% i/ k& s: I: C UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
: P- T/ F# R' {3 f% F }
1 x; L. s3 `0 G" c* h, K' ?3 { }" k6 {% M4 s' r6 d, \1 _: a. M
// 接收中断5 {8 B; }5 g/ F% z& E. R( h* v
if(UART_INTID_RX_DATA == int_id): E; q4 `" c' k& H- o6 w7 ~: M/ E
{
( Y B/ i& H( [. \9 A- A rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
t7 u- O1 B+ ]; o6 I UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);$ p' u0 L! U5 C8 l2 C
}/ @* J. J- W( F" I
// 接收错误0 x! I& L" {1 z
if(UART_INTID_RX_LINE_STAT == int_id)- I7 S% X$ f* T- D1 P% G5 |6 Z
{8 c1 D9 e6 r2 K+ ]& i* C3 H
while(UARTRxErrorGet(SOC_UART_1_REGS))
# i2 t' V7 Z* V8 M- M' K8 k+ p {
( h Q, Z- ~) Z- R+ t& H4 @ // 从 RBR 读一个字节% w& o( f* h8 y% h; ?
UARTCharGetNonBlocking(SOC_UART_1_REGS);; ]9 p0 m) ~' N9 h9 U/ |! r
}
; A/ b2 I4 Y/ k }
3 q2 m$ m, C) s6 H+ |/ z9 ^ return;
6 c( E- [& q6 Q8 W% _. m* A}
( O- h. f. u) w, I7 x3 k) r- Y; X/ AInt main()/ _! O' l2 Z5 ^1 }& n" S3 y) X
{ ) V& v% u5 c) H8 O7 u
UARTconfig();//uart 配置6 K8 G- f. O$ n& c
Error_Block eb;
- c2 M: v. d. `5 ? s2 ~7 z" [ System_printf("enter main()\n");
/ r) s: y; D1 \7 o3 o- X! n Error_init(&eb);
H0 e. u9 ^1 T) p // 动态创建硬件中断0 C/ h# |, A f% D4 v) t) l& Z
Hwi_Handle hwi1;& H) @" h: R! C& G' \4 o
Hwi_Params hwiParams;! u( d& M D4 R' P5 n8 G2 g
// 使用默认值初始化参数& h# r. O# s Q. |# Y1 h
Hwi_Params_init(&hwiParams);
0 l/ q* R& Y2 n# o7 W // 中断事件
5 G. m9 X6 D) m( i* d: o9 b$ l+ g hwiParams.eventId = SYS_INT_UART1_INT;3 B8 c0 h o/ K2 w
// 传递到中断服务函数的参数
- k5 A# t8 f0 o, U2 ? V0 Y hwiParams.arg = 0;; g' Y. _0 f" ?/ J9 ]3 v! Y7 Y9 s
// 不允许该中断自身嵌套
% N0 q" N! x5 i1 Z hwiParams.maskSetting = Hwi_MaskingOption_SELF;
% t7 E- ^4 _6 F$ \9 ] // 使能中断4 F8 H0 F. S+ @$ `5 {! i j
hwiParams.enableInt = true;
" ]% C5 E0 }! a4 W2 P // 可屏蔽中断 4
" k* d+ @1 Z7 q; ]7 h! Q; \8 J6 W // 中断服务函数 hwiMain
# n* B5 A& r$ X3 V hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
8 k" @# S2 M' q$ v( ]3 v4 q1 k if (hwi1 == NULL)
: O7 ?0 J8 w: {" }( v; v1 P1 K System_abort("Hwi1 create failed");
# q! J8 L2 T- b) `& N0 v8 ` BIOS_start(); /* does not return */
; F8 r0 C. ^1 r& j return(0);4 V4 u5 L1 U* S( m/ V
}/ T# ^8 f" c, l! }% O
( h6 W$ c+ f& b |
|