|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下- y1 P! }5 h% T& E' M
// 发送缓存: R2 y0 X% g- P4 ]0 b
char Send[] = "UART1 test......\n\r";5 Y: n( S3 J1 ^: w
3 u" T* a4 U0 }2 E- N$ T
extern void UARTconfig()/ c5 M; f2 V5 s
{
+ `8 A5 O' g4 ]9 r" p //使能Uart1
, T" o$ i: Q- a G! ~ w' B! B PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 L/ z3 q: A3 S6 [
1 l# n* n) M0 S // 使能 UART1禁用流控, R6 i0 T, @4 p' z5 Y4 @, n4 F
UARTPinMuxSetup(1, 0);# v& N1 K( ? s* ?+ c9 _
+ e% d _/ d$ ~. u" u9 C
// 波特率 115200 数据位 8 停止位 1 无校验位- g4 r) `. S& H' C8 r
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
) ?" K1 z9 Q, T3 k5 s+ u
8 E/ X4 \, E2 ?+ c: d' h8 \ // 使能 UART1) `; ?1 |' X+ j" E1 i* L+ @% `
UARTEnable(SOC_UART_1_REGS);+ x3 a/ ^& M7 [7 E% J
// 使能接收 / 发送 FIFO
) r# |4 M/ p1 E$ Y* Z UARTFIFOEnable(SOC_UART_1_REGS);8 D# ^( V7 P% h% Q" \! |* j
// 设置 FIFO 级别
% b4 l" T% D5 n0 ]% v5 d6 B# w" [& N UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
. Q% M( d' X3 S$ L //Uart1中断使能3 O, y# ^. T% Y0 B
unsigned int intFlags = 0;( B( C- J$ q& A6 I- d$ f/ a& m
intFlags |= (UART_INT_LINE_STAT | \
1 k1 ?# J; P7 P UART_INT_TX_EMPTY | \2 q8 S3 G/ M2 O/ c5 N! J; j
UART_INT_RXDATA_CTI);( ^" o! J7 L$ u$ N3 z5 f
" a a' P" D6 x UARTIntEnable(SOC_UART_1_REGS, intFlags);
. ?' b! v1 u( u. s- k$ a}
3 n7 E$ U+ k c6 s- M//UART 中断服务函数9 R5 h! x6 B, ^9 t
void UARTIsr(UArg arg)
0 s) m' v' p4 r% z6 ]/ I{4 _0 v. } R( a7 q
static unsigned int length = sizeof(Send);
+ M: k# d. n$ o5 T2 K$ f static unsigned int count = 0;
: M6 X% f8 f2 `1 p" h unsigned char rxData = 0;; Z( x0 U4 I2 w1 A2 F- `
unsigned int int_id = 0;" [7 ^& `. V0 U# B
// 确定中断源* p/ u( ^! _( X) j! D8 B
int_id = UARTIntStatus(SOC_UART_1_REGS);
4 h2 P& L% D3 A; T& u4 V // 清除 UART1 系统中断8 ~. b3 y. }& Q. L: U
IntEventClear(SYS_INT_UART1_INT); D/ X+ r$ f& L
// 发送中断9 R: E+ J u* |$ f' }
if(UART_INTID_TX_EMPTY == int_id)
5 q7 u$ D, {7 q% X4 M6 V {
6 l0 [5 T4 o: Q9 M J' b2 q) h: ~$ ? if(0 < length)% O9 \+ _ F1 ~: j
{
4 e5 X0 X& Y9 _7 r: X$ M // 写一个字节到 THR
3 S e c" g# ^# ]/ e9 l UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);) G$ B* L, Q2 o R8 L+ s( u1 h, U
length--;
1 n4 l$ h3 O5 w7 J count++;
]' D% v6 p9 I! f }4 y& g$ |& m$ X6 y
if(0 == length)
1 t# O/ l$ m6 |! o$ Z5 F {( t+ B& L7 L. G, Q( y' v; W6 f
// 禁用发送中断
" A. g* D; n, W UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
% M0 u% W3 E) @! a }5 P" o- D2 [8 @6 T( K- a& J) Y
}8 _1 `- Z* {. m+ }
// 接收中断8 l ~0 h' h4 s. \# m
if(UART_INTID_RX_DATA == int_id)
W, W3 }( F' V- z) v {/ H) F e" ?& {! Z& u9 h% ~5 T
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
! W: h, ]" Y" A: y6 H4 p UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
3 x) v+ S* e& n) \( B, A5 y! f }- d& F$ I3 x0 P. x
// 接收错误, P5 p+ B) O/ D" J' U
if(UART_INTID_RX_LINE_STAT == int_id)
4 S; H1 X5 M& |# M8 O$ y. P {& B# p4 G4 \& ?& i/ Z& m( F
while(UARTRxErrorGet(SOC_UART_1_REGS))8 Z! _$ [. \% N" B' f3 c$ S( V# ^4 ~
{
& m# {) c& v- Y9 g* l, B2 |8 s // 从 RBR 读一个字节9 r B7 b. s; A6 v
UARTCharGetNonBlocking(SOC_UART_1_REGS);
2 v! c! W+ Z! |. _ }" y' C" Z+ f3 y9 V `0 N
}
% X, X) V2 {- a9 d5 N return;
9 n2 j- e2 T; U! f& n: g0 E8 M}2 r6 B6 L: c! s8 I4 Z* [
Int main(), A( `% S/ F6 ]: E6 z% _# A& Z. D
{ , X5 J- I O* J" ?# ^! T8 p2 S# i' t& W
UARTconfig();//uart 配置9 v& S, U+ Y. x7 `
Error_Block eb;- T7 J6 z) f0 _ R$ t0 n
System_printf("enter main()\n");
@8 Q& U. ^! K/ r, D- W2 Z Error_init(&eb);
- D" z" w5 F1 z/ K& U4 j. Y // 动态创建硬件中断
: i1 j. F5 C# w( \, l# @7 d8 n Hwi_Handle hwi1;
# \, V q( _7 e3 G Hwi_Params hwiParams;3 [* A' t# Z7 N, J- p3 d( E1 _& s
// 使用默认值初始化参数
* J2 p" E" X; O& V" b; }! V Hwi_Params_init(&hwiParams);
* U! M: L8 I) C/ M7 o6 o, ? // 中断事件2 C, C5 D8 k0 K' ] Y$ l g
hwiParams.eventId = SYS_INT_UART1_INT;, s, Y9 V( z0 I4 E6 I/ Z3 N
// 传递到中断服务函数的参数2 R6 c, O8 a. D9 f7 M7 l
hwiParams.arg = 0;% l! {4 F3 F: p" T; w8 d
// 不允许该中断自身嵌套
: l" l1 O9 e' h7 S3 ^( w5 a hwiParams.maskSetting = Hwi_MaskingOption_SELF;8 f, Q1 M$ ^/ ^" B7 E
// 使能中断# \* ^0 G3 x7 u/ Z {; E0 w! y
hwiParams.enableInt = true;: N$ z5 Z1 f( ~9 `
// 可屏蔽中断 4( C# X; F# y% {* Z" o6 ?
// 中断服务函数 hwiMain
% x/ D0 e) e1 v( j3 y hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
' E+ ?: b( _7 r+ p' \ if (hwi1 == NULL)
' B4 F. b* \/ {, P4 z0 Q! d System_abort("Hwi1 create failed");
' K' I" R" a8 n# W" M$ ? BIOS_start(); /* does not return */
: Q7 V3 j# h* r return(0);3 q. N- M4 E4 V a
}* [& e$ i; ^" W$ c3 e8 H' |" }& n
9 A4 o. w& [/ z/ |4 q7 D |
|