|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
5 g+ l% C* E& t* Y2 L// 发送缓存
; L$ q( N3 U# j; ] m: d4 Echar Send[] = "UART1 test......\n\r";2 L' J1 z4 I! v3 _
( d U9 b' M" I& sextern void UARTconfig()0 G6 R* _9 n$ N @' ^
{
/ ?1 B6 e. S% [1 X //使能Uart18 J0 f. N7 R0 O7 A- B( M
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);% p" ]) x8 r. O+ e6 J0 `, l
: Z1 q) E6 T9 s% g% b% G
// 使能 UART1禁用流控' `# s( {1 [1 E- `# t% c
UARTPinMuxSetup(1, 0);
9 V z8 U6 `. P! \
9 t+ C2 k8 R2 S6 p0 C5 G0 h+ Y // 波特率 115200 数据位 8 停止位 1 无校验位
0 K2 v2 [% Z5 v2 E2 Y$ q UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);! z7 v8 ]8 z a: _) \1 Z
: k `3 j5 y" ]' p // 使能 UART15 q. M4 p; }. B" ?* f6 f
UARTEnable(SOC_UART_1_REGS);
) T* |7 R9 k3 @! w+ ^ L // 使能接收 / 发送 FIFO# ^1 p- |, Q, X
UARTFIFOEnable(SOC_UART_1_REGS);
* o# l5 M9 J) [3 ]* q // 设置 FIFO 级别/ W7 I6 ^6 g$ E" k5 y% `, l( I# H
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);5 |; E! R7 z6 S7 C
//Uart1中断使能
, Q5 D4 C i; T unsigned int intFlags = 0;, P( {8 o+ i. J
intFlags |= (UART_INT_LINE_STAT | \
2 N4 n) r- y4 j. j& \+ O$ j- z' A UART_INT_TX_EMPTY | \+ b: S0 p: a% ^9 {* c
UART_INT_RXDATA_CTI);4 ?0 d0 |0 U( X& p! _. d
- e" a: Z( S# Q8 d! t
UARTIntEnable(SOC_UART_1_REGS, intFlags);7 Q! \/ s/ |+ a) e2 _
}
* L3 [4 N! l. L" ^//UART 中断服务函数& p0 p2 w3 G0 R6 n
void UARTIsr(UArg arg)
; L* N( e1 R6 @& x{
! b, T' T0 ~( } t8 e% H static unsigned int length = sizeof(Send);. J7 E6 B9 A6 s4 q& V; g: e
static unsigned int count = 0;
/ O$ _4 M, K& {& F& {1 ^5 ^! } unsigned char rxData = 0; p2 p m1 ?. C- K2 m
unsigned int int_id = 0;$ R7 G% l3 X" R; U4 w6 [
// 确定中断源
2 Q# N+ o# e5 j int_id = UARTIntStatus(SOC_UART_1_REGS);
( ]6 U& V6 ~% d( A; C // 清除 UART1 系统中断
- z1 K( W5 F' `7 l IntEventClear(SYS_INT_UART1_INT);
4 k2 |# Y4 @( {8 \3 \ // 发送中断 [" m) P* g* Q& A( m
if(UART_INTID_TX_EMPTY == int_id)& l) t& O$ m. l: ~ ]. [, H% P4 k
{
& p5 @" `: u# d+ B if(0 < length)7 t+ G" f0 r1 }6 R* C
{. i: t; u) Q/ d0 a l( O8 k
// 写一个字节到 THR# b; h7 X- Y, } u/ J
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
6 D z6 |/ W! S3 p( X/ e, P/ w length--;
$ U* _1 H! S6 X9 {5 S1 h& G/ _ count++;
) S- m( g1 ~6 R. [6 A }* J( G7 q9 a* T1 @" h+ E7 D
if(0 == length)
) w$ ]5 {) d6 Q { l2 R) T$ p+ i9 ^% f1 }
// 禁用发送中断% u3 S) T- U; a9 V
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
# V$ q/ Z8 C" e6 L8 f }
* T9 T& g# j. z }* _2 I6 {( ~4 I) N
// 接收中断; I/ h9 E( C% S
if(UART_INTID_RX_DATA == int_id)
1 y6 B. T( p. [ {
8 R2 h3 j! s3 M- a rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 c4 V7 E6 }3 R' v* K UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
& O( A. s1 I8 k/ D- @+ n }; q& P# e0 L4 K) u$ l
// 接收错误 t( z: Z, T* N+ u$ J5 Z
if(UART_INTID_RX_LINE_STAT == int_id)
0 T( s- l$ j3 H$ w! A" L. h; u {
: V0 ^' t: [! f( F B" h while(UARTRxErrorGet(SOC_UART_1_REGS))' r/ x4 C& T* u$ ~1 [
{
/ i4 P/ E! R( q& U // 从 RBR 读一个字节
! Y2 s; x7 Y3 q7 t2 K7 M8 v UARTCharGetNonBlocking(SOC_UART_1_REGS);
2 Z1 o2 W9 G6 I }
7 W3 s- l' H' y% @' y }/ ^+ y: [4 D l( K5 s/ m7 H& Q
return;
1 N) y6 r, o5 P}( |1 a' ]$ ~7 z. P& `$ @9 K
Int main()
7 I% z7 M1 a$ I{
7 {7 R5 V+ k% s4 G. N5 v+ k UARTconfig();//uart 配置
; q7 J( J w9 S* Y2 r6 W9 D0 [, _* [; g Error_Block eb;
! z! L( ?) V( p" I a: F$ ~ System_printf("enter main()\n");- j- [3 u9 c" Z6 r
Error_init(&eb);
- W1 s7 q! G7 f // 动态创建硬件中断
2 W: s: b- J, n8 N, C3 U Hwi_Handle hwi1;5 {7 e& {9 S* q* q5 N
Hwi_Params hwiParams;
: d% X1 [1 M2 \; c7 a0 M // 使用默认值初始化参数
, h7 {; L$ @2 [ Hwi_Params_init(&hwiParams);( ~+ _) ^. O c+ p1 r2 q) C* s: I
// 中断事件+ V- ?! A" |9 u
hwiParams.eventId = SYS_INT_UART1_INT;
; K3 S6 Q5 R3 \' _/ W3 _, d // 传递到中断服务函数的参数! t, `9 O6 h7 S: d7 q
hwiParams.arg = 0;
p1 W0 R3 M0 C P // 不允许该中断自身嵌套
: U5 t8 u1 p; m% u* G2 i7 a hwiParams.maskSetting = Hwi_MaskingOption_SELF;" B! Q8 {+ p. E# @3 e% U0 j
// 使能中断
4 e4 r3 b( v# ] hwiParams.enableInt = true;
4 a1 V2 X$ c7 O, v) ~' O // 可屏蔽中断 43 y& E4 Z1 T3 R% m, B
// 中断服务函数 hwiMain
! x3 Y! B. o. a2 W! n hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);: f+ O* ?1 W f: }
if (hwi1 == NULL)
: c5 [% F7 a& M1 x0 s System_abort("Hwi1 create failed");7 f+ h- C+ a7 w0 L
BIOS_start(); /* does not return */% F8 O' R0 |8 b4 F- D! s6 h+ K
return(0);0 z& N, T9 b% s+ {2 P
}0 l. L( x Q1 S% f
1 L( E4 {6 S) U. W! T% c$ P |
|