|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
& { Q! P! O+ @: Z" W. F( h// 发送缓存- B8 c# g, z4 I& K0 I( O( q9 D, b
char Send[] = "UART1 test......\n\r";9 h0 A! c* J( F* y
- D* z3 a6 _9 u8 ?* s8 U3 W
extern void UARTconfig()
, O/ w% r( y2 o& Y{
1 C9 ~, t3 ^1 O! a1 F+ \) u& p //使能Uart1( Q* H& d6 V8 i0 F7 [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);; p. p# c2 ]7 F! `; ^
% i: V/ l2 H2 S/ `
// 使能 UART1禁用流控
' E! z1 ^. N9 q1 g UARTPinMuxSetup(1, 0);
4 q& Z" B2 e6 v* F6 y! A/ ^, y2 t" D
$ a5 B5 ^; k3 Y, a // 波特率 115200 数据位 8 停止位 1 无校验位
$ A2 ]6 ~# Y& N! N" H UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);* g8 C! d' X4 n! Y w
5 d8 q# u. q' o+ O8 O0 R+ T
// 使能 UART1
9 t' z6 ^) j+ C* R& m' A' O UARTEnable(SOC_UART_1_REGS);
- e- i: T# Z# O // 使能接收 / 发送 FIFO7 w/ ]/ T d( E! S) f
UARTFIFOEnable(SOC_UART_1_REGS);3 |% i( P/ j$ S
// 设置 FIFO 级别6 O) D3 n! r, E. x1 a" r4 O# O' U- i
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);8 D1 V# K9 i2 u- H; Q3 n
//Uart1中断使能
& k: s) s& ?# S$ e4 ]" y6 D5 t unsigned int intFlags = 0;: z4 f4 i! `9 y4 {) z, |
intFlags |= (UART_INT_LINE_STAT | \3 U' ~4 X: c6 j( I6 m4 o
UART_INT_TX_EMPTY | \7 ]% v& B! T! ^- v; I
UART_INT_RXDATA_CTI);
2 w& J9 F6 I1 m- M 6 C( v/ N' `5 N$ } t! @+ o' V, p
UARTIntEnable(SOC_UART_1_REGS, intFlags);
h0 G& X3 W1 D5 f | |0 n. \}
9 [% t. Z3 D: `6 f% j//UART 中断服务函数 d/ n: k- p* q$ o3 d0 d
void UARTIsr(UArg arg)
" r6 \ h5 l. \ A ]8 @( g{
8 C3 P" h% a6 r static unsigned int length = sizeof(Send);
6 S3 q9 E S7 s static unsigned int count = 0;/ h! C& N$ V) R- |
unsigned char rxData = 0;
( e2 ^# L8 L! q4 [$ ^5 }: q6 o+ U unsigned int int_id = 0;7 ^! C6 a. ^# h8 B
// 确定中断源
& r K8 B0 m% |$ N6 d" R! |5 Z int_id = UARTIntStatus(SOC_UART_1_REGS);
" K" P/ y4 ^- E! O a // 清除 UART1 系统中断/ e+ X: H9 I+ v r* @- a- h# A
IntEventClear(SYS_INT_UART1_INT);' T. Q4 u4 B* G- F5 D
// 发送中断
1 e+ ]2 L( H! y/ E+ E if(UART_INTID_TX_EMPTY == int_id)
5 v% _1 r( f$ @: v" p8 t; @5 h {
5 O- F9 e. t" b# B: y if(0 < length)# h5 `' E( J5 Y" g! Z9 ^ T: Q2 u
{
9 I4 F, ]2 p4 J1 r* h0 e6 } // 写一个字节到 THR+ {9 w' f) A' n: M7 h
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);/ d& A# ?6 {' n5 z& u6 w8 z! T- F
length--;6 p b4 }( T' ^* S. o, F
count++;
" }0 E/ f2 p0 z: {9 x7 D }
% J$ i# p" j8 F# {( }3 g c if(0 == length)
" S& \. J W3 } {
8 ]( e& h6 S7 h( P/ I // 禁用发送中断
' ~$ P! r) P: |( C UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);; S3 ~# @+ x0 p4 g" u& D# q: Y# w
}
; R# g# k5 ~. q }! d% B- B2 s+ \+ G2 e& l3 j) u* {5 M
// 接收中断
, w9 t) S! R Z. k$ }. G if(UART_INTID_RX_DATA == int_id)
/ `' W- _) C# Y/ Q {
6 i' P! B3 }- I rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS); r* J/ w1 L8 u, E/ N+ k" {
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
0 z/ D$ a# C9 t" q# ?# z* E }
! J. k& L6 E M" x // 接收错误
( F4 }+ S' z$ s9 s5 \5 L if(UART_INTID_RX_LINE_STAT == int_id)
9 i1 T* I0 ?% Y0 U7 B/ @. K0 O { w+ z9 q. D* Z
while(UARTRxErrorGet(SOC_UART_1_REGS))
; n3 G, \4 ?8 k1 M4 U3 S {
0 u5 ^/ |# X9 E4 q' Z0 c+ a' \ // 从 RBR 读一个字节
5 |' A2 o6 c% o n$ W0 j" b# ? UARTCharGetNonBlocking(SOC_UART_1_REGS);
` z$ z D8 g& ]! V }$ E: J* z. ]5 J9 Y" a5 L
}
: d$ O" L$ k# H* D return;
# w+ G! J+ C0 B% p% X0 s7 E: e N0 w}
9 [! r& i* ]. E* Z: v# j# kInt main()
/ K' \& v" O$ \& y1 `. J{ , y8 }1 D' D( B9 j0 g
UARTconfig();//uart 配置7 Q! h# u( a; v% g
Error_Block eb;
; N; {5 C7 ]5 b System_printf("enter main()\n");& [( C7 b0 ^' d+ F) z# o/ R
Error_init(&eb);7 K7 G8 o) v! z) z( P, g; L/ p
// 动态创建硬件中断
! z! n' w; V ]8 a. a Hwi_Handle hwi1;
- V; L4 W$ \- G5 b Hwi_Params hwiParams;& ~" g/ @ s6 {" C# `- O4 m
// 使用默认值初始化参数) Z& r0 s; s: E" d; t( n& J
Hwi_Params_init(&hwiParams);
4 V! [5 b, Q! p( v1 d2 M // 中断事件
& H9 j9 Y; [: m) t. D* `$ W hwiParams.eventId = SYS_INT_UART1_INT;
8 P \; f9 E, W2 \ // 传递到中断服务函数的参数
/ x4 ]4 J' R* F) x8 K3 C$ ?& f) Q hwiParams.arg = 0;
7 L2 ^& T. N4 y, n // 不允许该中断自身嵌套: L5 [9 f# q2 F3 l9 d
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
. ^8 X! o: N" {% R- i // 使能中断5 H3 D% ~( O- M# b
hwiParams.enableInt = true;& ?1 q- q' S- ]9 K' c
// 可屏蔽中断 4% T) q5 C c4 z; _. Q8 o1 b
// 中断服务函数 hwiMain
, |2 o. I! c& S$ A8 q1 W% a hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);2 \1 y7 h; L2 _8 e' F4 s# z
if (hwi1 == NULL)
6 u: ?+ R# n2 ] System_abort("Hwi1 create failed");
! u, X) D( X5 ]8 U0 a BIOS_start(); /* does not return */
) d: e( M# C/ m" K+ X return(0);
* K$ ^$ n" i' ~' E4 Y2 ^! J7 S}, r1 ~, t% E: e8 d. O
1 f" N7 v: }, U0 C5 y2 U! U) o |
|