|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
+ `" U* Y- Z) l2 a2 |1 ~# H// 发送缓存
( y4 v) q: E& Ochar Send[] = "UART1 test......\n\r";
, ]( O# _- ?- i0 x7 R, u8 g/ a% \$ t/ h, S7 l$ L4 ~
extern void UARTconfig()8 U2 Y0 B2 C8 `
{/ x, t. n: h+ |- W- t, C7 [
//使能Uart1
" Y' m& z. D2 y. T- t' l- B PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: o3 _. q& v5 t" d' B
; R# c$ I* g( L4 Q! I // 使能 UART1禁用流控9 E. U; B- @3 R9 h4 x+ E
UARTPinMuxSetup(1, 0);( e; m+ H' U7 u9 u6 c2 \; z% e
5 `! W6 e+ o7 F' C0 @$ [
// 波特率 115200 数据位 8 停止位 1 无校验位$ g/ ^4 n w7 T) i n8 K
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);0 v- {7 m8 O) K$ c$ v$ q! l
) b# i- m' V+ j5 l0 w' _ // 使能 UART1" r; t" w! j! ^$ N. M! ^
UARTEnable(SOC_UART_1_REGS);8 `5 a# G3 {' T1 d
// 使能接收 / 发送 FIFO
9 E4 Z( c3 e* O4 d8 d UARTFIFOEnable(SOC_UART_1_REGS);9 j& v6 P# b/ u1 E8 [' D. l. w
// 设置 FIFO 级别7 ^" a& g! O6 A3 V" q
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);5 U& S5 P/ L4 j/ x) P, E
//Uart1中断使能: F0 W M* @7 V5 p/ O) e
unsigned int intFlags = 0;1 |+ R3 n- X' U1 q( m; b" S
intFlags |= (UART_INT_LINE_STAT | \0 }5 n/ k$ v* N$ R6 Z4 n
UART_INT_TX_EMPTY | \# _# i7 o9 U# o% x- z7 x! ^
UART_INT_RXDATA_CTI);
( y. e- F; g! g+ P * k; g' }; | S- p
UARTIntEnable(SOC_UART_1_REGS, intFlags);
, K. U1 `: n. e2 J9 f; ]9 u}
7 S4 t" b+ q& G6 {* u//UART 中断服务函数9 b" _: `$ V0 \# Q6 d/ m- v$ e
void UARTIsr(UArg arg): G0 M4 Z9 r4 u5 b
{% P( P4 K. m) [( |6 C
static unsigned int length = sizeof(Send);# G4 y& w: E/ J% y7 O1 x
static unsigned int count = 0;7 J5 j# ~; s0 V8 U
unsigned char rxData = 0;$ b4 y5 ^9 }9 |& n ~
unsigned int int_id = 0;
* `; Y; Y( ?8 F! D // 确定中断源
3 w6 L" z0 d! G int_id = UARTIntStatus(SOC_UART_1_REGS);6 D+ Q1 s3 V/ p) k w; e% p% F
// 清除 UART1 系统中断0 N ]. r/ ~4 J4 n7 W, ]7 T
IntEventClear(SYS_INT_UART1_INT);
7 v) w8 C' {9 X/ b3 Q. A9 {/ ~ // 发送中断. L+ ^9 H( k& \2 n
if(UART_INTID_TX_EMPTY == int_id)
+ Z( D! e5 [6 R- A0 w& b {
9 G3 }8 F0 o" ^* s if(0 < length)
2 s* _$ B# A1 ^ N/ h {
" u! O4 Z: ^% D* G // 写一个字节到 THR
- w* ^9 A6 [# K( W UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
" A" S& p/ D, g" y length--;
3 U Y+ v: p3 i, o count++;
I1 l: R& l# m: F }) V" V: b) }, }1 T$ n
if(0 == length)' x: q; ?$ F v$ l9 d* L9 G
{1 P; @# s3 F6 U- g' S
// 禁用发送中断
5 D5 ?+ E- W( W& M UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
# I: P' Z8 Q: X' ?% t8 S# ? }+ e% J* r* h- T5 V7 A
}
% ?- g$ ?7 `: {6 O. P7 B# T // 接收中断
; u6 d0 D3 m% ? if(UART_INTID_RX_DATA == int_id)
& b* ~, |5 |! t+ W5 K c/ d( T {
4 ?3 a$ F, T" t6 i( b, y* G rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
! J' \3 M; @% Y UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);1 T0 o9 y! X3 @* ?3 {3 R7 h2 o
}
: C1 p) J. J. p& D! I! E // 接收错误5 Z3 a0 y+ H5 b+ ^, n z+ e# @1 O
if(UART_INTID_RX_LINE_STAT == int_id)
( e: X/ Z: M# a. y* l& Q {; ~% }" Z/ W" m
while(UARTRxErrorGet(SOC_UART_1_REGS)) o* C' s8 `2 B6 _; t3 G: L- |- L9 b; U
{
0 j! Y$ P" e0 K& s8 f // 从 RBR 读一个字节
; K0 d* A" }. @' `5 f8 a3 s UARTCharGetNonBlocking(SOC_UART_1_REGS);
0 o6 N' M G% S) ~3 T3 O) D! G }
7 C* ]6 ?# T" h2 y }# I: D4 h9 C8 M! p
return;
/ _) [8 ] a+ u; L/ p}
0 Z( k5 j9 s6 X! cInt main()2 ~$ [$ d+ ~) ~8 A& y" E3 U, ^( G9 c
{ 5 G- | j% `7 N0 j1 z& B( L/ h
UARTconfig();//uart 配置
% m" v/ V" m+ |% d" i4 e8 e Error_Block eb;
+ |% y. P( M2 Q5 Q) M# O System_printf("enter main()\n");
+ ~4 h; B' c9 P2 U8 P% n2 z* F" w5 ] Error_init(&eb);' @" a h+ E5 y9 h W
// 动态创建硬件中断
, q, X5 E, E) }! F Hwi_Handle hwi1;7 ?7 c6 b2 p* y% y# l: G
Hwi_Params hwiParams;
1 y1 ]0 P& i+ M3 X // 使用默认值初始化参数
' V& r. M7 O8 i* E. u Hwi_Params_init(&hwiParams);
6 d1 K$ B4 v; ]- c- }6 S // 中断事件3 V E% h/ D* N$ y9 R
hwiParams.eventId = SYS_INT_UART1_INT;
+ P* u1 j( o9 s0 i- C/ M // 传递到中断服务函数的参数4 l4 U( Z/ J5 h# I6 g0 i
hwiParams.arg = 0;6 _1 e" k2 D& e6 [3 S, C5 U
// 不允许该中断自身嵌套
3 P2 x4 Q8 s3 K j hwiParams.maskSetting = Hwi_MaskingOption_SELF;
3 U& T) J6 P, @/ k$ A3 a. q5 @' H // 使能中断4 G& K7 U2 c$ P1 s
hwiParams.enableInt = true;7 V9 p" G& @0 ]; o3 t6 R
// 可屏蔽中断 4
, T& N! n/ q, {+ O3 R2 M' a // 中断服务函数 hwiMain
- J# B& I, v+ }5 U: x hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
; A# b, P1 o/ R8 \ if (hwi1 == NULL)& ^4 j C6 l8 x3 K8 v' t) w
System_abort("Hwi1 create failed");
4 o' j# r. J0 C3 N0 G: P: @4 O BIOS_start(); /* does not return */) L: M- z0 O, b: Q( n9 o
return(0);
1 m4 X( r7 W6 p; }}
2 Z c) T& V, I2 b! v9 t2 d2 i
* A2 a% F5 f8 v9 U8 W9 _% O$ O' C: M |
|