|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
; C5 F7 G& J) G, x% b* N7 @// 发送缓存 S9 d' Z% O# ^, A' k
char Send[] = "UART1 test......\n\r";( L L, o( J3 c& o- ^ |$ w
2 N2 @2 n% v2 R0 g' u
extern void UARTconfig()5 p' k$ e" M( w! n, X
{
8 W1 ? J' a0 P; s* B //使能Uart1
1 d1 A' f. `, K4 c7 z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
3 R+ q* T7 |, Y4 D( ~
E B1 W; F# V. W$ {! Q // 使能 UART1禁用流控
: M- k/ |) U# u1 ]( g UARTPinMuxSetup(1, 0);
, N o' o% e7 H3 u! m" X+ |$ C
: v$ b1 v1 X$ Z // 波特率 115200 数据位 8 停止位 1 无校验位0 z5 y" m. V2 ?* D
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);$ H \& [8 V2 o. b
5 ]6 Y6 j- {5 F* Z- ~/ O
// 使能 UART1$ D+ m, U1 f+ c4 n: |& b; t
UARTEnable(SOC_UART_1_REGS);5 Q) Y$ ]( ]9 z+ H: X. `
// 使能接收 / 发送 FIFO6 R4 |) y# z/ D) Q# p" T# r
UARTFIFOEnable(SOC_UART_1_REGS);; g- E+ R$ J2 T2 T5 R
// 设置 FIFO 级别
" r3 g( U; a, g% I+ |. H UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
3 q4 a X6 q# S //Uart1中断使能
2 k) r- p! G* j0 |! |# i unsigned int intFlags = 0;
+ b$ n: Q, U0 r s# G intFlags |= (UART_INT_LINE_STAT | \
( W2 R3 J* J+ V" O UART_INT_TX_EMPTY | \$ Y# `9 a. z$ Z+ i: T
UART_INT_RXDATA_CTI);4 s5 O( `8 b6 ?% V# y5 D% Z) G9 {
2 U/ g) s! [( |; l) B, e# e4 [
UARTIntEnable(SOC_UART_1_REGS, intFlags);
1 w( H; ]; r3 G. W1 _: r}+ u2 ]7 `' ]+ I! M* F
//UART 中断服务函数
* B* T9 e2 n H& B" Wvoid UARTIsr(UArg arg)
4 D6 H6 W2 ^4 E) g1 q( x* e{
& _. e( G' }- v r+ { static unsigned int length = sizeof(Send);
- N. K4 V. K( i* C Q0 Q static unsigned int count = 0;
u+ W9 M+ }1 [( \ unsigned char rxData = 0;
2 w6 H3 ?' W% H unsigned int int_id = 0;& e& X, K" {; ]& ~, P1 D& w% W
// 确定中断源! `) k* w6 s3 M* J
int_id = UARTIntStatus(SOC_UART_1_REGS);, [; y2 c$ B1 ^" ?
// 清除 UART1 系统中断7 `: Q) o9 `0 ^' _4 ~8 M" {
IntEventClear(SYS_INT_UART1_INT);
+ g4 _2 F4 o4 ?5 R9 Q // 发送中断
7 P; i" {5 `3 }$ n6 D) r if(UART_INTID_TX_EMPTY == int_id)
$ \+ P' h$ ?8 g5 x& N6 w3 I {
1 z7 D6 w( ^) q% Y, C1 z; B if(0 < length)
( Q1 t* c$ U0 Z- ] {
# s7 y9 R. {* `6 z& \2 w // 写一个字节到 THR
; O8 u, C4 I' C% c0 N) G' N UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);9 W$ o# _9 {8 L7 u! v- l
length--;) U$ A5 J1 { k% Z
count++;% ?/ O7 N: S, p/ q' V6 e. Q
}7 C# L4 ~8 V; c% O* D: o6 J& ^
if(0 == length)9 W5 B6 x8 I1 [0 f' J4 Q
{) y0 l( D9 Y2 l2 h3 K% B
// 禁用发送中断
! `7 v3 z# n( I/ A. m1 Q+ {) i UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
2 t7 F- J8 ~ S; _) R9 y9 L% f4 C }+ H% u/ D1 _ g) s' ?
}
9 [1 r7 P/ g n6 m) \ // 接收中断
* a1 P8 r5 R: y4 t* ~ if(UART_INTID_RX_DATA == int_id)
: k7 ]% k$ c/ J* G! h8 j" x$ {7 c& T9 J {
" M& A+ J! M$ U' S6 q' x rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);' n$ ?7 j4 M, K
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);. u5 |5 Z5 i4 Z: ^, Y5 i+ V( Y
}
, V3 L7 V8 M5 R3 c9 d // 接收错误9 E' @1 j7 F+ b0 u6 c1 Q+ z2 n
if(UART_INTID_RX_LINE_STAT == int_id)
8 |- ~ `$ ^( B2 }; _, p {1 z$ x8 J0 w9 l3 \- ^
while(UARTRxErrorGet(SOC_UART_1_REGS))0 ]* a) p# l" w" \
{- a8 F) ?* z# q, i' B; D! A1 |% B
// 从 RBR 读一个字节
1 i1 |% Z% K/ p UARTCharGetNonBlocking(SOC_UART_1_REGS);
7 o( P/ V; Q4 p& r) P1 t8 z }2 r9 K, {) `! Z
}* O; Y, C; I& P! j' ^
return;1 I" d; h5 z& g! |: A$ n
}
! D& | G- F+ A$ WInt main()% e9 d9 h% _2 _1 [
{ * |$ b! I' ]& G- C% K% j( j& Q- \
UARTconfig();//uart 配置
6 T/ S2 n& _2 q Error_Block eb;" ^+ ?6 {3 Y0 V; R) g. p
System_printf("enter main()\n");% H. n% }+ A! o
Error_init(&eb);1 X8 P3 `* M$ T2 P( P
// 动态创建硬件中断
: _6 [7 a8 B! R2 v% N Hwi_Handle hwi1;+ \+ d. L) i2 B9 I x& x4 G
Hwi_Params hwiParams;% b* ` N( `! ^4 B' X# R8 U7 w
// 使用默认值初始化参数
, k D' d) i: e$ Y$ c: R Hwi_Params_init(&hwiParams);$ W5 _$ g6 [: C+ ^' M8 ~# V
// 中断事件) B( ^3 P; L) o1 O. D" J! E
hwiParams.eventId = SYS_INT_UART1_INT;
% i5 p7 v8 B" i2 W9 s // 传递到中断服务函数的参数
7 J I' e" w2 l- {+ @ J; U J/ G/ V hwiParams.arg = 0;( _( F6 X0 \$ |' r1 f
// 不允许该中断自身嵌套2 r6 |/ b2 \, p
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
, a( a( ~4 i* x$ i9 n( R7 E // 使能中断9 y; m( h7 q/ ~
hwiParams.enableInt = true;
; e3 P. w, Q1 k. p/ U, H3 a // 可屏蔽中断 4
' X- _( ~: |) c x" i2 u // 中断服务函数 hwiMain
3 J$ @( b* |% g hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
0 P0 C( a3 F/ L. V2 q( [& ` if (hwi1 == NULL)
# k: w* Z+ B1 o' F" M System_abort("Hwi1 create failed");
3 |3 ]# X/ N n9 D BIOS_start(); /* does not return */
1 Q) {2 @5 j, H4 z' j5 ^: u/ F1 u return(0);
& A/ L! r& D! Q$ Z}
) P* W" w0 g$ ]8 P
7 T; a( g$ M, T4 L: x; ]2 O |
|