|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
% s7 z8 n& m! T" S( d. N' ?9 _// 发送缓存
8 K H" q7 u' Y) i& qchar Send[] = "UART1 test......\n\r";. p$ z. Z& q/ b% e* j& l% i5 C
) o. ~5 n# D$ Y
extern void UARTconfig()8 h8 z5 d, C! ~4 r* L$ C) W( C
{
" M0 a- k: F' z) |" t5 ` //使能Uart14 a1 G: W1 _( _3 |0 {
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);+ |) I8 Q% `1 O6 y! z" r1 H) t# U
/ |4 R6 J% d& z% C# B$ D, U0 [ // 使能 UART1禁用流控4 z' Q# z3 N% \- D# O& |- O
UARTPinMuxSetup(1, 0);. M v5 \7 n+ D; p
4 m* P% d+ ?; @" U. X/ z( G6 I& C* H
// 波特率 115200 数据位 8 停止位 1 无校验位
6 ^# {: ^# B/ `: j: f$ i UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
$ D! S ?8 O! u. `8 H ; Q( H/ P0 t; m) U) Z
// 使能 UART1) j: _" A% B# B
UARTEnable(SOC_UART_1_REGS);, j4 `1 k9 C- h* P: b" Y
// 使能接收 / 发送 FIFO
[& M& H- A! L! g; U# I, B UARTFIFOEnable(SOC_UART_1_REGS);
( l6 I/ U+ n& z) @1 O7 I2 {2 F# s // 设置 FIFO 级别
0 Q/ W7 d# D" d+ I UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);% w; Q) Q/ ?, a1 Q, |+ S' F
//Uart1中断使能
) B" E4 X; `0 R* ]( ~- Y unsigned int intFlags = 0;. P5 ? U: Q5 a! T2 S
intFlags |= (UART_INT_LINE_STAT | \6 K8 n, d) A) [' `$ F
UART_INT_TX_EMPTY | \
) m: d o2 F5 G$ [. k6 `6 { UART_INT_RXDATA_CTI);
) y* o$ f/ s2 a( H7 c
: e7 [0 Y" j% ~6 e+ _$ P# T# p UARTIntEnable(SOC_UART_1_REGS, intFlags);/ E0 y; j( t, c9 O# p. D' h! L
}
4 p# G$ y F! N, [! z//UART 中断服务函数
: ~+ X5 ~& l0 h7 @( |+ t% Zvoid UARTIsr(UArg arg)
, w/ p; F" S4 B" w! R+ B{4 q9 k9 l+ o; P( L; X4 `
static unsigned int length = sizeof(Send);( L' U1 ?- g! H6 f
static unsigned int count = 0;; Q$ C+ w; D% W0 a# {- g4 {0 X
unsigned char rxData = 0;
2 I' M: u" c q& c+ L2 n; l( E& S unsigned int int_id = 0;) }5 F( Y' {2 X8 h7 t0 k3 I; X
// 确定中断源+ T. M! d+ ?( A. h) j% f8 e) b
int_id = UARTIntStatus(SOC_UART_1_REGS);& w1 T p. m1 W& k) v
// 清除 UART1 系统中断7 W* k6 r0 y9 x( V G
IntEventClear(SYS_INT_UART1_INT);
, K. o2 H7 @4 {' i4 |( t // 发送中断& W* _; _" Y- u8 ~7 v- J8 f0 U
if(UART_INTID_TX_EMPTY == int_id)
8 X" Y8 f( ?4 C( ]. k# _5 ^4 e {
8 X8 m8 e8 y/ L0 Q: O# E W if(0 < length)
# E6 k$ G$ ^. r {
A5 a0 N' b# u% F5 t // 写一个字节到 THR; ]0 |4 f& N% o' [& R
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);1 r: t: C( |9 ^3 M
length--;
" ?+ n* G; m# \2 o# p- q count++;3 b& S, i& f. E( Q8 d2 e& E$ [; e. v
}
, [0 n, G S0 P: ^, a- B if(0 == length)
7 c9 e7 `4 {+ D, u8 H {
5 X3 E+ n0 N4 Q" w7 J // 禁用发送中断
) u, l6 ]4 N" C9 z2 u UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);! W- a: ], \% ]0 k
}' a# p0 \8 `6 E) \
}6 A X8 {0 m' c( E: D' G' {! ^
// 接收中断" S) `% D, B9 G( \. B9 c" x; L
if(UART_INTID_RX_DATA == int_id)
9 ~/ X0 X3 c7 e7 Y {
8 w* t; U7 J5 X1 U. E rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);5 t8 e$ Z/ O5 J& x8 K6 H& X6 M7 T
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);- I9 _. ~$ l# A$ n2 V% _& w
}
- h- `% ~, u) @0 c4 \) M // 接收错误6 v4 V ^/ I' o7 r! }
if(UART_INTID_RX_LINE_STAT == int_id)2 Z) t. `3 N5 L, k6 f' v9 w2 V4 m
{
; L$ B3 L+ r' y; `. x* v9 r while(UARTRxErrorGet(SOC_UART_1_REGS))
! ]: K8 ^& `. x$ K {
5 k1 H. ^! x% g$ ~7 M$ E; G8 Y // 从 RBR 读一个字节* N; U9 I- s1 w0 a0 T( h; g
UARTCharGetNonBlocking(SOC_UART_1_REGS);
0 I6 I9 J5 a% O- R6 g }7 I8 M$ e. x% m
}
1 D, p% T8 M* l* |0 F) N6 m return;
& O2 A$ e! ^ S}- F* k+ v/ z3 e9 {) \; I7 |+ M$ e3 T
Int main()
7 Q4 L3 R9 K& ]6 \- z& o{
/ P3 ~4 u" T, e9 D/ f5 v& Z) x UARTconfig();//uart 配置
* {$ ~2 P4 X, Q9 k+ _$ _3 f' l Error_Block eb;" r. {! N1 C0 g9 n0 q7 ]
System_printf("enter main()\n");3 c& s6 d1 C& d( @
Error_init(&eb);; G5 A0 n n0 b
// 动态创建硬件中断: v* [# Z) G- {" j, i3 U/ k
Hwi_Handle hwi1;
4 f. c: d, l7 |0 O/ b Hwi_Params hwiParams;
& S5 N: H1 Z6 V" W* t // 使用默认值初始化参数
+ Z, ]& l4 M! @( \! Z Hwi_Params_init(&hwiParams);( o, V# r/ I! t# F5 J8 |
// 中断事件# _) r" C6 h8 M
hwiParams.eventId = SYS_INT_UART1_INT;9 h: R/ y8 {* _' I
// 传递到中断服务函数的参数/ w. j* P8 W) v/ g" ]5 W
hwiParams.arg = 0;2 j- G0 P. G. W% [/ ~7 v
// 不允许该中断自身嵌套 |1 E# J; G* T% D9 A
hwiParams.maskSetting = Hwi_MaskingOption_SELF;# I7 _/ Z V! C& p7 v' C
// 使能中断6 f/ F `. U) i
hwiParams.enableInt = true;
6 f5 o* P0 S- W9 ]' X- p% D // 可屏蔽中断 40 K) f2 z; [' I9 A: H6 z
// 中断服务函数 hwiMain
- B8 {$ n/ _( A& A6 [; u! M hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);3 O# I4 ?2 C2 x+ M0 q/ z, P
if (hwi1 == NULL)- _3 @: X* j$ i9 [* p% v5 T- G5 |
System_abort("Hwi1 create failed");& N; B2 V G$ L
BIOS_start(); /* does not return */; Q* Y# Z: q+ e! i
return(0);
2 R) g4 E1 v! d4 u# h} s6 }( Z3 y. q' `
' j3 I N( g" e9 \/ M |
|