|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下$ \: l! ~& \4 F4 T' q5 h, ]5 O
// 发送缓存
3 l3 ^ c. I+ Hchar Send[] = "UART1 test......\n\r";
; _0 K5 T, N" Y2 j3 ]. b! f% T: M. N% a& {5 ?+ ^
extern void UARTconfig()3 u: v+ Z" L s" P; o7 @
{
4 [. K6 P M- }; E( M, [ //使能Uart1; e% n( |8 {4 F2 a" k/ O# X
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);% w, o+ |* _% W; h- }
% o6 H L7 W# D; b; y( F1 `9 \
// 使能 UART1禁用流控
# f' H. M* }9 c1 C6 d UARTPinMuxSetup(1, 0);
- u, }, O* o' h) G$ l6 N
* |& ]% H- ?" D9 C/ ~; v // 波特率 115200 数据位 8 停止位 1 无校验位
) d. p0 r) f- Y3 v, v UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);6 F' w7 a5 j5 L* ~( \0 w$ P
/ i. C/ m8 T; H- V% d9 ~
// 使能 UART1
6 c. O8 m3 P8 }! m UARTEnable(SOC_UART_1_REGS);& x; y9 w1 y* s+ n/ z; K7 g! z- n
// 使能接收 / 发送 FIFO
/ R; x5 v- `2 q& Q' }5 g8 X) J UARTFIFOEnable(SOC_UART_1_REGS);- z5 N, |$ I& Y Q3 X S
// 设置 FIFO 级别
, n t3 d2 f* l1 e# S5 F UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);0 n8 l9 U/ w- H4 M7 e) r- `, B
//Uart1中断使能 q4 R" e5 W! a, x# X
unsigned int intFlags = 0;
& N9 Q6 s% s9 K0 _9 G intFlags |= (UART_INT_LINE_STAT | \+ r4 d4 ~6 v- [: P! l Z
UART_INT_TX_EMPTY | \
/ W1 D% w( z. r/ b9 T UART_INT_RXDATA_CTI);
0 w( h# @6 u; V) @: Z" V- a
5 i3 D# Y( W* \2 { UARTIntEnable(SOC_UART_1_REGS, intFlags);
$ S) U) t9 q$ \# m; U' w}
) _, L0 V; l' u* r: G& z//UART 中断服务函数
& M M8 Q4 d# |2 i1 t jvoid UARTIsr(UArg arg), O5 b7 P6 \4 D) T' Y
{
+ @. a0 L0 I# Y8 k5 z static unsigned int length = sizeof(Send);
; ?; f. x7 r# t$ ?3 y static unsigned int count = 0;
. \1 o# [( E2 l4 T" G unsigned char rxData = 0;
- v1 ~- o& ^6 V: ~3 K ` unsigned int int_id = 0;9 @4 r' \3 f6 }4 j8 g8 g
// 确定中断源; `+ j0 E. Y$ H) n1 \% b
int_id = UARTIntStatus(SOC_UART_1_REGS);
* t9 r* u7 h$ _( v' P( l3 [ // 清除 UART1 系统中断
! s1 O, D; p9 B" H IntEventClear(SYS_INT_UART1_INT);
8 a3 f8 m, a5 `% r. a4 V4 u // 发送中断8 E4 J% Y* Z0 ~6 I* I
if(UART_INTID_TX_EMPTY == int_id)
$ q, J* b1 y1 y' h7 m- B4 V8 U, H0 I {1 _3 y% l+ O9 J3 ]% [+ ~. `
if(0 < length)
- I% D0 e# K7 v: R& n/ O {
: f! i; e9 S8 j$ m) {" m$ s // 写一个字节到 THR
: D' U# n& R! r" t/ v- g. F: v0 ^ UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
; p8 N0 G$ D1 A" R" z$ _$ H9 ^2 f length--;
, n3 p- |$ K6 |# S W count++;
. j4 l) L$ t, L0 D: \& f" Z! ^ }
& L d! @. B2 l' W if(0 == length)
4 I0 q1 s' }3 m. b- [0 n! K {
/ D- E: J, p1 j // 禁用发送中断
% c/ u! w/ D0 U7 ?/ E G( @: {2 \ UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);, \) {4 s# d! Z( g8 @
}" r/ v; X) H! o* ]: g
}
+ Y8 Z, W4 _8 l6 e/ P) b // 接收中断
# f: P3 H% z k8 a8 f" J5 _ G2 N! e if(UART_INTID_RX_DATA == int_id)% s6 x. V G; N" G8 Z& k! j
{1 g$ J0 T, ~. Q% v& ? ?2 @
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
& Y( m# c* D7 {" \1 l8 ^ UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
5 w/ p# h# M C3 T+ F }
* s: Y7 A, K- F, S# u- s+ I9 K // 接收错误
# Z. u2 O& M, k u9 ]9 R if(UART_INTID_RX_LINE_STAT == int_id)% m6 m1 W8 _6 R( _& A
{) ?# Z$ N& p1 x7 D3 f @
while(UARTRxErrorGet(SOC_UART_1_REGS))
# H3 q3 `6 _. ^4 C! K' r8 U {
" C4 x# i) P: ]$ h/ E& D! F' C+ O // 从 RBR 读一个字节5 q; }! P; u0 Y- l6 W9 n* z& K
UARTCharGetNonBlocking(SOC_UART_1_REGS);
. n# s4 E3 U! O5 n& D1 ^( s: c }
: D$ @; w" z5 ~7 D4 ^/ O }
6 _4 |2 e, z( r G& ] return;
# V) t7 W# d8 B% U7 k: _3 k}
$ y6 b1 n0 s% G! E1 W+ B$ @1 l& A3 SInt main()
* j8 s/ _9 [4 X0 I' y. t{ 7 @+ E( g/ B) ]
UARTconfig();//uart 配置
8 f3 K" @6 a* N. A- z! H Error_Block eb;
8 T7 A5 \9 v2 l! Y+ d; j; Q System_printf("enter main()\n");* y" e( e( C7 b2 k1 Q
Error_init(&eb);# P g1 r! Q' }# i* L- p, b4 q
// 动态创建硬件中断+ p1 I* R, d5 `
Hwi_Handle hwi1;
3 \- ]1 u4 B7 h+ f1 L+ A, w Hwi_Params hwiParams;
# f0 b& L, J" z) c, g) X // 使用默认值初始化参数
! M8 r& a' G4 l Hwi_Params_init(&hwiParams);/ O1 _2 b9 I0 c1 {9 C5 C! y* w- q
// 中断事件1 v1 W, g+ r% |8 `
hwiParams.eventId = SYS_INT_UART1_INT;8 S- \" G! d# l( M* v( `( D
// 传递到中断服务函数的参数- H. L2 l. ]: k& z# U/ r7 _ U
hwiParams.arg = 0;% T2 g2 D& `- a" G% D
// 不允许该中断自身嵌套- V; |% l4 D- T2 G8 n3 I0 K
hwiParams.maskSetting = Hwi_MaskingOption_SELF;5 k ^+ E/ @& d! ]& i6 e& V
// 使能中断
" h& g( s. [* q# |5 _6 F5 `! I hwiParams.enableInt = true;
$ S6 L" o' `7 T* N2 B- p6 u4 i( j8 F // 可屏蔽中断 4( k+ _* c e& X8 m4 c1 u6 ~4 C( S: w: y4 Z
// 中断服务函数 hwiMain- ^) W0 ?( f- P2 F8 _8 g
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
/ w8 C7 r; }/ y- V) K( d if (hwi1 == NULL)
4 o+ S7 X( h; M4 G" O4 T System_abort("Hwi1 create failed");5 m8 t6 a' \$ t* E
BIOS_start(); /* does not return */. ^* {; v% D h7 W3 l0 p! S8 p; N
return(0);; [8 R; X5 f! i- }1 j0 N2 k
}
2 w# q8 u u5 ]7 U, p: l
7 w$ N2 r" {. Q- C |
|