|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
+ T3 @- K K0 _1 r4 {// 发送缓存- \; H* t0 ?% e0 a
char Send[] = "UART1 test......\n\r";
* _( n. ]) C2 j3 d% O. e9 Y( F h& m8 s1 ]+ M
extern void UARTconfig()4 [# }3 v! M, K- r8 Y
{
" ^. R' Q8 Y/ A0 u //使能Uart1
& O% I2 O- t" D- } PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 ?, m( D& I: Y
. `) ~0 X' [1 Q3 ~* j' x/ | // 使能 UART1禁用流控
% W4 |' ~9 U: W$ t) j: H UARTPinMuxSetup(1, 0);: V* T* S: d2 q
3 I3 f( b( M# S% R- X
// 波特率 115200 数据位 8 停止位 1 无校验位- a% e: l. Z0 q0 U" o4 p
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
& |0 _# E0 L5 }6 C" t6 v; F ; U4 Z: Y% X( c. T& Z, D1 {3 p- P
// 使能 UART1
0 P: Z3 P$ w$ { UARTEnable(SOC_UART_1_REGS);0 w2 d' W7 @- r: N, r* \
// 使能接收 / 发送 FIFO0 |7 ?. I2 z8 E& t3 I
UARTFIFOEnable(SOC_UART_1_REGS);
; x8 r3 s$ e: O' V9 V // 设置 FIFO 级别- P t" F" o- l9 e/ e
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1); r1 V/ W- @6 V4 ^& _, C3 _
//Uart1中断使能" _$ h: z$ g J$ F% T0 I
unsigned int intFlags = 0;7 Y0 S1 W9 t$ L
intFlags |= (UART_INT_LINE_STAT | \
2 D1 E7 C5 S$ M/ `. m3 _ UART_INT_TX_EMPTY | \: @8 [ x1 I2 C7 w1 C/ c& t
UART_INT_RXDATA_CTI);+ t1 R( G) p) D. f. j ^ M2 x4 W
: S; P& G# O# R, ]0 j+ ?
UARTIntEnable(SOC_UART_1_REGS, intFlags);
+ w( N3 g3 [ e. F! x: _2 A}: u# b4 c- t2 D5 E1 A# Y) ?5 b
//UART 中断服务函数8 m( Y8 B# J+ z& q+ D" A
void UARTIsr(UArg arg)
5 X! ]# w/ O# A/ r8 ?/ t0 A{7 }( @* m* h. \' s# d: G
static unsigned int length = sizeof(Send);9 H( p" G- |+ T
static unsigned int count = 0;% S( X; V/ v9 Y' `
unsigned char rxData = 0;0 n% u8 q% b/ P# o
unsigned int int_id = 0;
6 V5 P4 {* @, H) Q D% K% F/ Q // 确定中断源
+ o% ^0 Y5 J" ~" N$ J6 j7 c int_id = UARTIntStatus(SOC_UART_1_REGS);: ^# Q. Q6 t; ^4 r# p, i" Q% d# J# y
// 清除 UART1 系统中断
/ Z- b( F3 r1 i) f IntEventClear(SYS_INT_UART1_INT);
% e0 m# T" p+ K // 发送中断5 U# b4 H1 P% U1 e( r& l2 O' S
if(UART_INTID_TX_EMPTY == int_id)
+ k9 n; D1 j6 ]2 s2 @ {
2 W, i* x( L3 j* g5 h* ?& | if(0 < length)$ ~5 o* y! c* n0 Q
{
0 ~& J" T/ s6 [2 H // 写一个字节到 THR l* J6 X z, _: |% `9 w. f
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
! N9 n5 z) |# d: ]" O' t, }; y length--;
- r8 L& `) [. i4 r# U U6 O count++;
, N( D+ H! D* q% [# } j# h }7 ~+ q/ ?$ v/ X
if(0 == length): b9 Y- V/ I- @
{. s1 K# ]6 K u: R3 w
// 禁用发送中断+ [4 w8 J+ _ z% k- C7 o
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
9 K! l7 D- v8 k$ J }% f2 o+ A9 y* B: S2 i S
}
. M9 r4 N2 J: c( o S) [ // 接收中断2 }. m+ s$ S8 V& M8 N! u. T# `
if(UART_INTID_RX_DATA == int_id), M- F, s2 P& j3 a2 K: Q- V+ r
{" n, L4 {' ~/ n. T- M e% L
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);4 d/ u$ Y7 i, f, K1 Q
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
+ [# |: w b1 J6 R5 s8 l/ X7 h$ B! v }% p9 d0 L, h( l
// 接收错误
l T( T/ f0 p! D if(UART_INTID_RX_LINE_STAT == int_id)* \9 v: p! N* [1 V. g0 g
{7 O- c# |* y6 h1 ^, x
while(UARTRxErrorGet(SOC_UART_1_REGS))
f2 V/ F% [3 n4 y. Q- m/ X. E {
5 x; }# U5 R# K9 P. c) \ // 从 RBR 读一个字节
: c- h- l! {) ?' K UARTCharGetNonBlocking(SOC_UART_1_REGS);9 w/ |) K6 T) K' e- b) ~& x
}
5 O* N% @0 ~+ F }
: Y p/ x( C1 v. V- F' t return;
+ q. Y9 \6 N9 k' E8 z L0 V8 _8 M}# s% N4 a3 J( }7 e* O& x5 h
Int main()( S! `% U' w' I" g! ]$ C
{
+ [0 R, _& R! M! w% J UARTconfig();//uart 配置
3 E1 K3 T2 W! s Error_Block eb;
- S* i7 c4 ^9 A System_printf("enter main()\n");
/ G1 E' |2 L$ Y7 o' } Error_init(&eb);: H9 A4 k0 P% J2 \! e
// 动态创建硬件中断
+ S: d: x, m% W1 L# D- m& j! `% V Hwi_Handle hwi1;
+ @8 Y4 M: ~( C% c2 ?' _1 t8 C Hwi_Params hwiParams;3 E$ Q2 O0 w( F5 z
// 使用默认值初始化参数
$ W/ _! @+ G2 U7 \6 q E Hwi_Params_init(&hwiParams); O4 d0 r% {6 k O$ _
// 中断事件
. [+ j& U% t5 j# \+ w hwiParams.eventId = SYS_INT_UART1_INT;2 q4 h. k1 d# n. Q) y+ I1 x
// 传递到中断服务函数的参数
. }( M. g3 ?9 k8 r2 h hwiParams.arg = 0;" g! L" ^3 X5 ?! f
// 不允许该中断自身嵌套4 ]7 m+ k! q, t# q! i; O, _/ W
hwiParams.maskSetting = Hwi_MaskingOption_SELF;5 _; O0 w) \ u3 |4 B. j
// 使能中断+ y) y; S5 g' r* ]: M6 e
hwiParams.enableInt = true;" y: p. d, ?4 O
// 可屏蔽中断 42 }2 f; B, a# J; z( c! i/ `7 \/ d
// 中断服务函数 hwiMain5 r& E: h! O' K f
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
o& K' k! w% h* H# o4 ~2 H$ C if (hwi1 == NULL)
: ?1 n/ W7 n. o9 u" ^5 M3 r System_abort("Hwi1 create failed");
! P/ U( o I7 z* n. t% w* d* a BIOS_start(); /* does not return */0 H2 }8 y0 B+ A, C3 A8 Q S
return(0);
5 y. ]. X4 f& v' I}
8 ?3 c* E7 j" D9 i3 R! V1 `) S3 T% j" `
|
|