|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
, A$ F0 `1 D: s" T: q/ i// 发送缓存
8 C: B% a: C! uchar Send[] = "UART1 test......\n\r";
% x, Y, R* r2 Z0 o" f1 x
6 z: C# ?2 A, P* T7 ~/ Lextern void UARTconfig()
1 j) k% K: p. H& J{
6 u( q; c/ @9 d+ q //使能Uart14 f, m5 u5 J2 g+ l# Y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 n4 N8 f* e3 q) k , Y n5 E) }" V9 V3 P
// 使能 UART1禁用流控
- l; w8 B1 Q: v6 x [* R3 _ UARTPinMuxSetup(1, 0);+ c5 n/ I$ u. `$ |" i
( h! Z; [3 G, N& h. o
// 波特率 115200 数据位 8 停止位 1 无校验位
' U" X2 k3 a$ d, x UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);+ X4 P4 Q% c; X" c
- C# G" ^% `& \3 F
// 使能 UART1
0 y, c \ T6 R3 y UARTEnable(SOC_UART_1_REGS);+ h2 P) J9 V9 k/ h. \! }5 L
// 使能接收 / 发送 FIFO. l8 a# ]! h4 `& [4 f1 I
UARTFIFOEnable(SOC_UART_1_REGS);8 ~- A/ E& \( H- e* g
// 设置 FIFO 级别7 q5 L3 |+ U/ j$ |! ]9 t; W2 K' k
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
3 ]2 t; L: s1 D5 S+ X* O9 {% F //Uart1中断使能
' J& [ z+ @( C unsigned int intFlags = 0;" y* S# ^& _2 m
intFlags |= (UART_INT_LINE_STAT | \
2 z; b* c$ |3 u5 }3 v UART_INT_TX_EMPTY | \4 |8 c6 |5 p' P/ E" ~# p9 r# j$ `9 z
UART_INT_RXDATA_CTI);
8 P% M3 y: e+ M( I" }- H, M 0 y' i' Z+ @: q
UARTIntEnable(SOC_UART_1_REGS, intFlags);
9 D8 F& X6 H ?}; }9 d! Y# k" g
//UART 中断服务函数& Z9 X# w5 C! |& L/ F
void UARTIsr(UArg arg)
; x* w! O+ u, U) g! W{: d/ w x) p; P3 E0 X3 c
static unsigned int length = sizeof(Send);; P7 K1 w, q1 z
static unsigned int count = 0;) y# Q6 U- F- C; O' ^5 @4 I
unsigned char rxData = 0;5 @/ }$ ?( K$ e! C9 P% _. F" n
unsigned int int_id = 0;" m/ i4 M) L( R
// 确定中断源
2 g( L! ?( p9 U. V S' s int_id = UARTIntStatus(SOC_UART_1_REGS);
+ W/ H! a1 Q8 [" P. J // 清除 UART1 系统中断7 A3 ^& V) u; C) @7 r' Z3 L. g
IntEventClear(SYS_INT_UART1_INT);
" W1 D+ q y5 _% L, L9 C // 发送中断" I1 o8 g& K0 b8 N
if(UART_INTID_TX_EMPTY == int_id)8 d1 a# R6 t u8 p3 `& p, d
{* u- b3 t1 f! \+ O5 v" Z3 p& w# T
if(0 < length)
T" Z g: _% o8 O- d {3 v7 }4 R( E, ~) a' Q5 Z1 {8 a* g
// 写一个字节到 THR
P! z* G+ ~! X7 m UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
( H ?9 m0 p4 }1 y$ \3 I/ T length--;
( a- a( T$ A' k! f+ V/ B count++;
5 f" S" G8 g" x2 Z+ q0 _1 g }/ w& {& m3 P7 Z
if(0 == length); s, M, r( u- n5 p2 V2 N* w0 M8 b
{
- s2 B# G# M/ p7 y* y7 L! R, D // 禁用发送中断
6 k" f1 _) X o& h6 C8 v3 z1 ? UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
( y1 s& v" ]8 S$ y. ^$ I }3 l2 x3 m2 Z7 C7 Y+ ^
}! _$ ?5 [$ S, H X
// 接收中断8 e \$ c9 g# ]$ e
if(UART_INTID_RX_DATA == int_id)
p* x0 R9 o" N! P {2 M6 e. g' I2 I- F
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
; ?: u: |4 \3 D3 b UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);7 ~4 U) V* A6 R$ M, T
}7 ^4 k9 k& N$ Q( @/ ^
// 接收错误; u. O" a) I7 v2 s% c& k
if(UART_INTID_RX_LINE_STAT == int_id)0 B, a( z8 W) ?, \. y9 r2 `
{: e- L; u% B c4 |( k
while(UARTRxErrorGet(SOC_UART_1_REGS))6 S4 `' F8 a1 S" K8 ]% Y
{3 p' z" `, {3 T; E, ?% z
// 从 RBR 读一个字节
6 z: @, {/ ]3 ` UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 x' B+ W- v0 ] }$ b' o; V- x& |/ O4 {1 g
}
& F7 N' @0 c( A! i$ K2 n0 B return;
* B, K6 N) x9 ]8 y2 C+ @' ^} v N9 P. W% ]' R
Int main()
9 j! b" X& u, Z$ W5 l{ 5 f$ O1 s0 D) T, k7 k2 @
UARTconfig();//uart 配置
* B) b2 o2 i6 L" A Error_Block eb;* l4 V7 {% N# k6 v' h L
System_printf("enter main()\n");; e8 q& M0 a# h* N
Error_init(&eb); _4 ^( G/ _& b5 [/ ~
// 动态创建硬件中断3 f" G0 F: H+ `' \* U R! \
Hwi_Handle hwi1;& B4 g% m: ` n! j+ P
Hwi_Params hwiParams;& N8 g, }. v# m- P9 r/ {& A$ W: r
// 使用默认值初始化参数 a, H/ n3 T, w+ T
Hwi_Params_init(&hwiParams);9 {# M3 r' M$ T, t6 [1 B+ Z
// 中断事件
+ Z" p r, F' N; I hwiParams.eventId = SYS_INT_UART1_INT;
& `9 r+ K, I" I& Q1 H // 传递到中断服务函数的参数
7 f$ I" {+ X/ l2 Q3 `$ w hwiParams.arg = 0;7 Z+ i$ N% U* Y; M& y
// 不允许该中断自身嵌套# m4 C' Z4 f/ T$ K- e7 U
hwiParams.maskSetting = Hwi_MaskingOption_SELF;2 ?4 t5 y# T( I( j7 i- ]
// 使能中断7 h0 X* F& T5 v0 ^# X
hwiParams.enableInt = true;( \( v* `9 f" c+ t3 l
// 可屏蔽中断 4
1 m( h8 b* O. h8 }% M( ~1 o9 X // 中断服务函数 hwiMain
7 S$ g. f$ E# ^7 @, a9 F hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb); P$ B0 m+ m5 d
if (hwi1 == NULL)
, `4 z- K: C0 A3 a4 K System_abort("Hwi1 create failed");8 C# S' G/ d2 F" `
BIOS_start(); /* does not return */
8 b2 E; o5 G1 ~1 _$ F$ W, l return(0);
6 X& y# ~1 n2 ~+ `}
# `) I# @4 W( v0 X1 b: V/ x% S7 y0 T& ^$ z) n
|
|