|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
. y( W( u9 ?3 a5 |; \% y1 V// 发送缓存! ~. R0 X' _- r' M" C/ Q
char Send[] = "UART1 test......\n\r";
( E# W$ o9 B7 y2 i4 s8 v! \5 G9 h5 U+ P5 O) R" m
extern void UARTconfig()
, {; Y6 I7 q+ n0 D) G! g" I0 M{
) w& [1 y, M: X4 ~4 @ //使能Uart1
! x0 |9 k& Q6 ?4 v! h# m PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);' B* _( S. {' s
9 {& S1 ^# n) {
// 使能 UART1禁用流控
) M0 l, a* u& I. [) _: ~$ [ UARTPinMuxSetup(1, 0);5 N6 w8 m! f! l5 X: G9 N& {
1 y7 m; P7 c3 P; m, b) m$ P' `% I. V
// 波特率 115200 数据位 8 停止位 1 无校验位! K4 s( X/ Q% ?4 U* t9 T$ s* Y
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);& q x1 k3 P2 c$ d7 U( z5 V
* X! W$ |0 b3 {. G1 Y5 z
// 使能 UART1
; O: u& t4 L( j2 A/ T UARTEnable(SOC_UART_1_REGS);
1 g0 f# |/ }3 A3 K: m& u5 h, k // 使能接收 / 发送 FIFO
( h$ S0 e8 l4 E& S- f" E9 _+ i UARTFIFOEnable(SOC_UART_1_REGS);1 B8 H, D/ a# M. n
// 设置 FIFO 级别
- D$ h- G4 S$ I7 o& u- r+ d UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
) e3 k2 ?. J. o# x //Uart1中断使能( A. D" j9 G/ \& ~6 _; w; w
unsigned int intFlags = 0;
4 T# R8 R0 Y4 o* e' J2 [# m" p intFlags |= (UART_INT_LINE_STAT | \' w1 n" c; i, E, ^+ }: R1 \0 \
UART_INT_TX_EMPTY | \" e0 {2 a+ Z: H& `1 W
UART_INT_RXDATA_CTI);
; X6 `5 n( G7 a% `
' W1 P2 I/ ?0 `# u UARTIntEnable(SOC_UART_1_REGS, intFlags);
7 l" N& x+ o8 d3 x7 p}
' A- }" }& }8 s//UART 中断服务函数
0 D( a/ _7 `6 I# d$ E# jvoid UARTIsr(UArg arg)
0 w4 s1 o7 K7 I9 {! `1 `$ z{
( h! X9 w J& j5 Q1 {4 e) { static unsigned int length = sizeof(Send);
& G7 x' \2 k6 |7 P7 V7 S5 r: C static unsigned int count = 0;
3 F& g4 i8 n0 S O4 E9 ]" i5 b$ Q unsigned char rxData = 0;8 j2 C. x8 ~* }, w, n7 J- Y
unsigned int int_id = 0;
* r _# @- \1 X3 k2 Q // 确定中断源
8 G" ]; g- I" Z$ Z% p$ }; W int_id = UARTIntStatus(SOC_UART_1_REGS);0 R+ F4 w- z6 ^9 \% h' c# \6 Y5 Z5 s8 |
// 清除 UART1 系统中断
2 |7 m n# @9 Y IntEventClear(SYS_INT_UART1_INT);
( b3 B) L" O t6 [: ~ // 发送中断
7 A( x1 p3 `$ p if(UART_INTID_TX_EMPTY == int_id); W9 Y" H% o) J5 S T
{
/ o, v+ {1 ~: k8 e if(0 < length)/ m# v( [0 v7 k: ~/ B0 K
{1 y8 X2 C# z+ Q" L6 C1 {0 E
// 写一个字节到 THR0 d2 U4 s! w3 C/ F* ]3 }6 Y4 Y
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
8 l" ]' P6 }- ]/ W length--;
0 A+ G: Y8 }5 Y8 p8 I+ ` count++;# O. J5 J" H4 D# R' ^8 t
}
8 ` T( a/ z. [ M& ~6 k if(0 == length)
7 U; i4 z& ~- r$ U# }! X {
/ O5 V/ t! P4 u // 禁用发送中断
# I v* J" z; g0 V UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
C" G+ s7 c6 i3 n+ I& A w" P }
2 k3 @: E' m7 A9 D. ^ }
, m' G9 Z0 p4 T3 j2 B: U! ^5 t E7 F // 接收中断
8 r. G c: ~" o. t4 ~+ w if(UART_INTID_RX_DATA == int_id)2 g; v, a, U' s9 c, e6 |! ]
{
2 a8 o0 I+ U* L! ]- h5 U) g7 U rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
9 V5 y% o: M' x- T8 p& ^( @6 A UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
; I7 b+ [& n+ H" b5 _ }
& _, q+ I: ?$ R // 接收错误! V' ]/ ]: [# r/ R5 a* y
if(UART_INTID_RX_LINE_STAT == int_id)
! O0 H8 i" g/ a" m5 X+ }6 o3 l {, D! A' V, ~: d6 F
while(UARTRxErrorGet(SOC_UART_1_REGS))
/ K* d$ q& v2 e: F4 X% i: R {
- z8 J5 M" D/ b3 h. i // 从 RBR 读一个字节
/ \5 ]. R6 m: W& a$ D% }$ ?0 k UARTCharGetNonBlocking(SOC_UART_1_REGS);
+ p+ K' A- v+ T3 Y C, K1 E }
& b Z# l, P3 z) s( `) A }5 i- c5 O1 p9 ]" T9 N
return;$ F% a; E% s- ]3 l: z
}1 z9 g8 y) w3 P: _- u4 j
Int main()+ K; X1 _$ c( @# N4 {. M3 f' t9 {
{
! M' ?( B n9 B7 T" S# C# x UARTconfig();//uart 配置
% \5 `" F/ C" ^5 P5 @ Error_Block eb;
: B- z& x/ g5 e0 F& E- N System_printf("enter main()\n");% A: k8 S/ f& u2 L
Error_init(&eb);
0 ]- ]# v( ~% X5 F: B // 动态创建硬件中断
7 D! @" G: ^9 I, l# Q* A/ ~- W Hwi_Handle hwi1;
: k7 Q5 a5 L. K5 w; K D! I Hwi_Params hwiParams;
$ W. z4 l- k' c5 \ // 使用默认值初始化参数
% e9 s' e0 f; N) G Hwi_Params_init(&hwiParams);
5 U: o! H4 _; v; W; z: d( M) Q+ y! U) a0 m // 中断事件
|& R% W( q* _0 G) X hwiParams.eventId = SYS_INT_UART1_INT;
+ N) b3 e+ y6 n0 t( h% R! m // 传递到中断服务函数的参数
' y4 m l+ s* g& e; u. H7 x hwiParams.arg = 0;
4 B0 i3 w0 V# Y6 M // 不允许该中断自身嵌套; {7 B) \9 s* z# ?* g* p
hwiParams.maskSetting = Hwi_MaskingOption_SELF;' S3 M( s9 p; u2 q s" t
// 使能中断; Q6 {* F$ M) T
hwiParams.enableInt = true;* m7 y! U l( A! X* P& f3 @& ^ |
// 可屏蔽中断 4
' J9 U2 c& B% G, n$ V4 h // 中断服务函数 hwiMain
T: y2 @% r! N# G/ C* | hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);) J- O$ l/ B m2 |+ \% @
if (hwi1 == NULL)2 R1 H- X" x& F* M, _
System_abort("Hwi1 create failed");
N+ T' t' j7 E/ K) s6 d" q8 K BIOS_start(); /* does not return */
) e2 F, j: |( o% R- Q return(0);
" v" ?. j9 g7 k2 e+ g5 T) G}
( _0 C9 R* x+ k
1 N0 A: K4 i& t% T3 p# O9 k |
|