|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
5 b8 J6 U% N0 M/ l// 发送缓存
$ R/ O8 p# y7 f6 R0 tchar Send[] = "UART1 test......\n\r";
) D5 C- I6 `7 ?0 V9 S5 Z- C* k t) t& _/ B
extern void UARTconfig()) l3 h/ `) f, L
{
+ }3 H9 z u: a6 z4 a //使能Uart1
0 A4 w( m- @$ k# s% J PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 s7 _: ~1 ~ x# m9 {5 Q Z$ { " K% M, c/ p/ J l& P) E) u
// 使能 UART1禁用流控# h" J$ V8 ?, J3 K( T# @
UARTPinMuxSetup(1, 0);2 T: r- O3 O" W+ R+ A4 s
5 `0 p- g' M! s- h3 G) I. K, ` // 波特率 115200 数据位 8 停止位 1 无校验位
2 W0 C1 J, o8 P1 g' o UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
/ B: c$ F9 q# S, G' O 8 s5 b5 F: M1 p0 L. |
// 使能 UART1
- h9 G; l& d1 S4 f5 |1 _( G UARTEnable(SOC_UART_1_REGS);
& R/ c# k2 Y; x // 使能接收 / 发送 FIFO0 A5 N) `2 N7 T0 B* c0 ~: q
UARTFIFOEnable(SOC_UART_1_REGS);8 X+ ~! R2 J4 v/ x' y. d, \
// 设置 FIFO 级别
/ c' Z. I6 m2 E( F3 Z$ K; Y' r( S9 I UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
9 a1 J- n- }( O+ n0 O4 T6 v //Uart1中断使能
# Z' s$ M: X# P& D$ | unsigned int intFlags = 0;
% ^6 B" w" p% o9 j intFlags |= (UART_INT_LINE_STAT | \$ A+ X! w9 f/ G8 ~
UART_INT_TX_EMPTY | \
2 ?8 Z# f, X& M& f8 ?8 f3 @( p! F4 {" l) F UART_INT_RXDATA_CTI);/ J D& O d7 s* t4 c
& [$ Q# d, I9 N% J9 j; e( A UARTIntEnable(SOC_UART_1_REGS, intFlags);! Q k c" ^/ e4 }8 Z# i, z+ @9 D, A
}9 k. w; m8 Y. o9 ?8 c; b, M
//UART 中断服务函数/ L7 S: d9 k: t# c% D% }- }' ?
void UARTIsr(UArg arg)
. ] }# e8 p1 w4 |{( a3 k0 X+ o* i5 P0 z0 q
static unsigned int length = sizeof(Send);
- b! `% h9 l( Y" p+ t static unsigned int count = 0;5 d) a# a+ C7 a+ w7 I1 U
unsigned char rxData = 0;
$ D% A7 A5 w' a unsigned int int_id = 0;
6 A# Y8 O4 j& @/ w, o' f // 确定中断源
. r+ \# n' u: A* `( x) B4 Y3 h3 D int_id = UARTIntStatus(SOC_UART_1_REGS);1 S0 y: h+ b6 J) D3 \- {/ n
// 清除 UART1 系统中断1 ^! V$ R, ^4 N9 F; m: a
IntEventClear(SYS_INT_UART1_INT);1 l7 A3 }2 G3 h0 Z+ I$ _1 B( M
// 发送中断' S& s3 \. x7 i: p
if(UART_INTID_TX_EMPTY == int_id)
' o5 o/ j$ l* J4 j# Y {/ c9 c5 ]0 j% B+ A* P% Y1 _# ?
if(0 < length)& o. _+ I6 `; A& I% s' U% Y9 X; H( r
{
* F& @+ @6 K, O. y9 x. f M) l9 f( u2 e // 写一个字节到 THR
& r! _" _. ?8 O" [- r+ B9 ]: ^ UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);3 I/ }) m% O4 l/ p
length--;& ^- F; @$ X1 H+ H; g4 ?/ K+ P! F
count++;
/ `/ L# T* D9 k# g } u( @5 v# E5 r* c0 n3 C0 `
if(0 == length)
, _2 Z2 B* W6 x' ~7 a) t& { n {7 o! E T) @0 g( R
// 禁用发送中断
, I# n( }/ @- Y1 F UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
, W" [& _; e. Q9 q- @% k }; [* ~, ~5 e' m z$ R' Y7 ^+ w
}" w8 Z! q# |8 f& B5 k$ ?
// 接收中断9 {. B( w" ?* |! [% r5 i M' G% [
if(UART_INTID_RX_DATA == int_id): h) w% l& b: [
{
) w- c# r* f' c0 e' V1 O6 m rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
1 N3 d/ {$ `+ o! d$ H UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
* v$ }2 G& h' f* n( v- m( V7 y8 f | }
0 x) p- f( N$ t; e // 接收错误
8 U7 z: w5 P0 ^' ?2 r1 D" o if(UART_INTID_RX_LINE_STAT == int_id)
& G, @' B- I: [: ? {
2 p. s0 V" i$ V) O while(UARTRxErrorGet(SOC_UART_1_REGS))
! _. z' b( ^$ @( Z u {% d2 d1 e# c( v8 J/ R% V
// 从 RBR 读一个字节
' {& p" f) q2 b. W! E UARTCharGetNonBlocking(SOC_UART_1_REGS);
) x9 o: j1 x5 K5 c; T/ D2 r }. m. Z" ]7 m2 Z2 T) O1 h0 c
}0 P" x* h% R* e! P
return;, Y3 z+ S- T. c7 t- G& \) \7 M' r# L
}6 T- \7 N0 v* m8 N. {
Int main()
0 }: x& m0 K& h/ @# Q8 O2 o{ 6 I( U& m5 A6 A( p$ {' } I
UARTconfig();//uart 配置
3 o0 X4 R2 Z6 R Error_Block eb;
' D( m# k8 u W9 U System_printf("enter main()\n");
1 V6 o& ?$ E" }4 M8 ^1 _2 p5 R7 h Error_init(&eb);5 ]) f1 Q. z$ R; _- v
// 动态创建硬件中断
2 P; [: N2 L( z Hwi_Handle hwi1;
# H8 X' N, [: b J# @6 Q9 F7 l3 Z5 v Hwi_Params hwiParams;
) t! Q' }. x5 Z# Y2 Z' S2 [9 V // 使用默认值初始化参数
! s8 J7 r6 X2 P8 H; D2 a% Y1 E$ G Hwi_Params_init(&hwiParams);
N; r) z! \& k9 f0 `8 {" D+ s% x // 中断事件
4 |$ Z4 L5 O, J4 N hwiParams.eventId = SYS_INT_UART1_INT;( V( }1 Z! ?* g
// 传递到中断服务函数的参数
7 z& G9 n! U% m6 t8 ?' P hwiParams.arg = 0;. s4 z, ]4 i/ Q* _! m8 q- r* K* O
// 不允许该中断自身嵌套1 l1 M' N, L" f7 L. `
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
) h9 q! V% a! I7 G( @ // 使能中断; g: ]: M3 m1 V3 T. |6 e& f) I
hwiParams.enableInt = true;
4 G$ w6 r8 P9 B7 H // 可屏蔽中断 4
- [* E% X7 u) S; J- t5 e // 中断服务函数 hwiMain
7 `+ p5 B6 I' } ?+ A" f0 u hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
* y0 S# I" [# W z2 I if (hwi1 == NULL)
% `! @. j' Z: `, U System_abort("Hwi1 create failed");& K$ i, ]2 j3 g$ z2 x
BIOS_start(); /* does not return */& e/ S: E) x$ s. T( z
return(0);
" R" j+ X; g0 d7 M* O! C# `}+ M: ~- _+ O2 f# C
2 {" l; o5 i/ J# F) r
|
|