|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下% v1 d5 `' ^9 ?- p2 Q/ B
// 发送缓存
3 G( C# @7 S' z5 V( ~8 hchar Send[] = "UART1 test......\n\r";& A( g2 o/ c+ M& G- U
, c( Y. Z5 o. D7 v
extern void UARTconfig()7 r& Q3 s% B0 g' r5 u7 K
{
9 i" N7 i! I b" |: }2 r //使能Uart1
: M0 P- f3 q9 Q# a: ?( g PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);& w; e! z+ U5 \# m5 w
" P1 e- f, K( }! f // 使能 UART1禁用流控
/ e% t7 \9 i2 _. U* H UARTPinMuxSetup(1, 0);
( h/ _: G( p$ l- m' {, u0 ^% C
' C) G8 s6 V# n6 u( Y% O // 波特率 115200 数据位 8 停止位 1 无校验位
; b+ M) v4 A$ Y+ c UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);8 l3 l! o4 a7 u- A! A
2 T8 F. ]7 `* w) C+ `$ b
// 使能 UART1
! O3 Y! k' U# K( t$ D K UARTEnable(SOC_UART_1_REGS);
* Y5 j0 D4 |' @) A3 U) z6 j: u // 使能接收 / 发送 FIFO
# I0 r& ?3 D7 c: G. u& J! E% U UARTFIFOEnable(SOC_UART_1_REGS);
8 \5 u6 ~ J6 |, d/ S; ] // 设置 FIFO 级别2 A9 q* h# e7 ?. p7 j# |/ j
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);) A% I1 X) K$ `# l# ^5 C* O9 L
//Uart1中断使能( T" i& f3 s+ J# ?9 k
unsigned int intFlags = 0;
5 y! |& }8 q7 j* B! k intFlags |= (UART_INT_LINE_STAT | \
* g) F1 m! A' J0 f/ z5 j0 ~* ] UART_INT_TX_EMPTY | \+ S+ x" L/ A% O' n3 A* |
UART_INT_RXDATA_CTI);
$ o* J; d: J( ^0 n
& H! t% d; h1 J+ Y& Y UARTIntEnable(SOC_UART_1_REGS, intFlags);1 j8 K& j' V5 r5 r# U8 W# F4 L
}
+ E! k4 r+ {1 |5 B# C( o//UART 中断服务函数
# ^; N9 n# G7 _void UARTIsr(UArg arg)
! t' J) k) L0 r{
. F' v+ g( M. X) }- @+ |4 C static unsigned int length = sizeof(Send);. q2 T& B( p8 l8 f& N8 a( _
static unsigned int count = 0;
% Q2 N9 o+ M0 a: ^: S7 S$ j unsigned char rxData = 0;
+ O- H K, l' D I unsigned int int_id = 0;$ v8 l0 s8 U2 ^; L U+ }- o# s
// 确定中断源- x m" A+ |3 m* Z( T, P
int_id = UARTIntStatus(SOC_UART_1_REGS);
6 D& P( P% @4 e, V; W3 J; R$ ] // 清除 UART1 系统中断+ @ E j& {- I x. Y
IntEventClear(SYS_INT_UART1_INT);5 H1 \) O" }% q+ K* X
// 发送中断
?1 ^; L% e, N3 B! E! C! D4 [ if(UART_INTID_TX_EMPTY == int_id)7 g& {4 V* p; K$ ~0 W
{% H1 {2 w/ U- \- ~- j
if(0 < length)
% s7 g8 m9 h, d {+ j4 J; q2 t2 c/ ^
// 写一个字节到 THR8 m$ h1 y( ?+ c! z
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);1 d3 l- o6 U5 V# w
length--;" p( u, A1 a) ]4 ^8 d% q
count++;
1 W2 I: [3 t) `9 [4 S6 w }" H5 | G# I( `" i
if(0 == length)
, p3 H2 N, K9 o {
, P1 N. H% k1 Q2 W# K+ q! b+ i4 R // 禁用发送中断5 d: \& `% `/ A9 [6 r& k3 ]
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
4 N1 a0 O2 i2 I, t! ] }
+ K9 K% J# D" q z& @4 ^ }' P2 E+ \1 ]* U
// 接收中断
' Y+ M c2 a7 U0 l% @0 a$ A if(UART_INTID_RX_DATA == int_id)
$ f, N8 r; g( k6 e( M {% T9 S1 c! X$ U, `$ e; |- {7 l [; r
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
8 S8 l0 U0 v& }0 v$ W; V! ] UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
, g9 q3 F* N* ]- U! U- Z }
4 @: u% g* `9 s // 接收错误1 _) |: {% h; P# m+ I4 W/ q* f
if(UART_INTID_RX_LINE_STAT == int_id), N" t+ C, ^8 ~: X
{$ N$ E$ i" u% u p+ |6 i
while(UARTRxErrorGet(SOC_UART_1_REGS))" u9 Z/ f4 T( L) M. u0 F
{
+ {* P. ^. w Z: A. U# X {6 | // 从 RBR 读一个字节2 H) d- p1 f, T& @
UARTCharGetNonBlocking(SOC_UART_1_REGS);
& t: U8 z: I% Z3 E }' K! M0 Y5 W$ x) l8 L
}
1 r2 Y! z/ d G# c return;
6 O: f+ Q; m& D}6 t+ v0 I& m4 q* {# `9 T
Int main()7 k0 r6 u0 m4 h
{ - [( P8 Y/ W) v( i8 j
UARTconfig();//uart 配置
7 Z* [% |+ O$ G7 |( M Error_Block eb;
. n! u* @, [1 I, ~& c6 A System_printf("enter main()\n");
& d5 Y: x5 S$ S7 a/ H+ x Error_init(&eb);
+ w7 z1 f+ F" E) C A9 l+ j9 x+ n // 动态创建硬件中断0 X3 x8 N, E" V9 S
Hwi_Handle hwi1;
* m" w5 K3 I' R" c7 w4 L% a Hwi_Params hwiParams;% k& c/ q* t4 G- p* w: M2 ^* r
// 使用默认值初始化参数
) d9 d% f: c$ O Hwi_Params_init(&hwiParams);
f! q, v/ {+ [ // 中断事件( `$ v" m; v; M l
hwiParams.eventId = SYS_INT_UART1_INT;
4 [; l6 x. U) M0 \& C8 K% { // 传递到中断服务函数的参数+ R: o7 S% z9 w. a5 s
hwiParams.arg = 0;
* {* }! d6 j8 t5 _- i$ o // 不允许该中断自身嵌套1 G. p$ `2 Q3 _, `4 h
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
* K- L( {8 O3 F6 a // 使能中断
/ G5 z1 j4 |% B2 x- S: ] hwiParams.enableInt = true;" a1 Y2 X( @7 @0 L
// 可屏蔽中断 4% Q9 I- K- e4 h% K% S. `
// 中断服务函数 hwiMain
; g) a! W6 }% r8 g7 u! e6 Z hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);4 S, y/ `! m/ W3 q3 {
if (hwi1 == NULL)
3 f$ c% M; K: \9 K" P5 p' Q* R System_abort("Hwi1 create failed");
3 f3 L8 ?# C1 M9 o* v8 z BIOS_start(); /* does not return */
7 s0 @; C( J! } return(0);
; L4 \" v7 n2 m& O' F7 H& q3 A! u}
3 w5 y3 K1 M' j2 v5 `
7 R$ V: z% y" m" } |
|