|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
* Z7 N X* t O4 ~+ Q// 发送缓存
, V ]* u: M+ @char Send[] = "UART1 test......\n\r";
+ S* u; e* D# n" o8 o- u3 g6 D- k+ l1 f/ ~- F1 @4 K# t' A
extern void UARTconfig()
8 G' _: r) z; q4 U{( J1 e4 l9 T1 _' t+ v3 P
//使能Uart1
' Q$ T& S. R+ D" N ^ O' k PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 ?4 D: n: _2 M$ ~
' Q, S3 U! B0 r( @8 ?6 v
// 使能 UART1禁用流控) K% ~: w1 _$ f
UARTPinMuxSetup(1, 0);
( a, }- ?* l5 _. F" f" T( ^+ |( |, | 2 v; l) k: Y0 v& _7 z* [
// 波特率 115200 数据位 8 停止位 1 无校验位8 W: ?* c+ {5 E9 k- m
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);! k- c9 v3 [7 z; h, y& V8 K$ ~( i. r
+ t& B8 X- A- P: E // 使能 UART1
. Y/ l. [# G" v' g6 i1 a8 C! D, S$ k UARTEnable(SOC_UART_1_REGS);7 w" k+ [) [/ d8 i; i
// 使能接收 / 发送 FIFO1 l0 h! U* S$ G P; Q
UARTFIFOEnable(SOC_UART_1_REGS);
2 A1 ~7 Y' d6 f // 设置 FIFO 级别
2 s. a7 o9 X& @) T: h7 j UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
( a' [+ `3 |% e! Y! }/ [ //Uart1中断使能
6 X+ D5 q4 d$ i, L unsigned int intFlags = 0;
% P) Q7 P; {( e' B1 s$ F; K intFlags |= (UART_INT_LINE_STAT | \
6 d0 }3 y9 q- g h; v$ y6 O" w& s y* c; J Q UART_INT_TX_EMPTY | \
2 ?0 C# y) \/ J3 g/ B- Z. g" ? UART_INT_RXDATA_CTI);/ U( ]; [0 |" |- D C! p( ?
" ^- U' }3 h4 f, v
UARTIntEnable(SOC_UART_1_REGS, intFlags);. w1 Z8 u1 b ^. V1 K& D1 d8 |
}
. ^; J7 X- @. c0 V1 T//UART 中断服务函数
8 Z: @* ~2 N- I3 ?" b* Wvoid UARTIsr(UArg arg)! p! t& s) \+ K
{
1 Q1 \7 r0 K; j! q- E static unsigned int length = sizeof(Send);% C$ p* U/ t/ u O1 |) s9 P9 y# s6 P
static unsigned int count = 0;) r; B6 M9 I7 m% ]
unsigned char rxData = 0;
; ~3 a9 o7 M' X* n. t2 Q unsigned int int_id = 0;
8 e; ]' P' D' b' ]/ U# {: C // 确定中断源. D% ]9 j0 d0 n7 h( w3 U
int_id = UARTIntStatus(SOC_UART_1_REGS);$ d' k: j! N5 f. Y s0 f
// 清除 UART1 系统中断. Q0 o7 Q2 K/ F) q: @6 y
IntEventClear(SYS_INT_UART1_INT);
5 r9 c/ }3 C5 l7 e4 l // 发送中断" q% X# m9 G, Z9 V9 k
if(UART_INTID_TX_EMPTY == int_id)' A2 z& g2 E' q
{/ m: U2 U6 d' K# T- l4 U
if(0 < length)- G; i. Y1 O u/ \, f
{+ W) I6 g; [- J
// 写一个字节到 THR, g' T. Z: h; C( O! z; G
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
) f- P" L( m. L( e length--;. a# D+ K2 J. x8 F; K
count++;
7 p; h; _( \! B' U }
6 j0 X( l$ r0 q4 `. c$ _( e" J8 F if(0 == length)" z2 C/ q; \$ w7 S3 Q
{ B+ v! k2 {$ v/ R' X9 u
// 禁用发送中断$ k3 p/ y5 v% g
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);& z9 q( r( I, n; s$ O/ T
}) k: e/ I- T$ C) c) @( v
}! X3 k& H [( s- W+ v' L
// 接收中断) Y1 ]5 E6 W1 r
if(UART_INTID_RX_DATA == int_id)/ Q. }' J0 A( O' B* S" W/ _
{: i1 t+ l4 `! y0 v: q1 Y+ a
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);$ b4 O, ?( t& w
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);3 b! H7 Z% h; r# @8 w( r
}
$ {# |% b$ L K) x+ @1 J // 接收错误
+ ]& ^6 y6 M1 J9 @4 @$ D if(UART_INTID_RX_LINE_STAT == int_id)7 E \8 n! O( K% ~0 a, e1 N
{! W3 A0 _ N4 y
while(UARTRxErrorGet(SOC_UART_1_REGS))
$ O. ^: ?: ?: ~8 E, s: g4 [ {
* F8 K- h) m+ ~( c4 R9 Y0 K1 I2 u // 从 RBR 读一个字节
, ?% o2 m3 W8 f* ^& I% G- A UARTCharGetNonBlocking(SOC_UART_1_REGS);$ _( \8 J0 P N
}
1 x% J' n, l" K5 D" x) d; j }
+ y o% j6 @6 h% Q return;
4 Y( f8 F9 X i2 G4 g}( h2 I2 u' l! M4 k, a) [
Int main()$ ?9 j# L3 D9 \1 x7 E: V
{
- a5 Q- ]* `1 g5 ?, O" {. k4 E UARTconfig();//uart 配置( x/ B1 H1 s" ]) ]: Q3 D
Error_Block eb;
1 C; P0 H. u' M& U( Y! R$ @ System_printf("enter main()\n");6 ^& W7 m! O5 O/ W; J$ o' q/ s# E
Error_init(&eb);7 }% h! ^$ [0 t! g# E
// 动态创建硬件中断3 _* C; q7 L5 r% m6 \9 M* D: q n
Hwi_Handle hwi1;
- s4 S6 d8 a- {# d& Z Hwi_Params hwiParams;
9 @" P& s6 h: d9 E' V // 使用默认值初始化参数 y3 Q0 M0 E9 N0 m {# O5 g
Hwi_Params_init(&hwiParams);
! b* D+ ~$ Q4 Q7 f5 t // 中断事件: N' z- y+ m# B9 x3 D! C/ C
hwiParams.eventId = SYS_INT_UART1_INT;
j: b) h/ `# c // 传递到中断服务函数的参数" F5 d0 ?: z! [2 B4 b8 D5 P# `
hwiParams.arg = 0;
# p( \' G" }& R6 s' ?6 {' s! b3 j" X // 不允许该中断自身嵌套
' d d; Q2 \' ^7 z. E1 Y _ hwiParams.maskSetting = Hwi_MaskingOption_SELF;- I+ ]; K4 a7 H8 U' o8 t
// 使能中断
6 C& r8 U. c4 L0 H6 ] hwiParams.enableInt = true;
, M6 W5 {, e% ^: L% P // 可屏蔽中断 4
" P$ L& _' H8 V1 {. @ // 中断服务函数 hwiMain& @& G. n2 W, a, [" ~8 D# |
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
3 p2 F4 h+ `0 ^ if (hwi1 == NULL)
* j. K# n" V6 v G. |+ J. h+ ] System_abort("Hwi1 create failed");+ A' H# z# k) _3 e7 p$ O
BIOS_start(); /* does not return */
+ R# m+ ~9 X- F! X' s return(0);# q/ {9 a4 e% d6 `& A1 ^
}# B' Y/ s& c3 s Z* @
" d- z, R% t+ s9 e* `2 \
|
|