|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
1 u. U/ X( ^- R7 _// 发送缓存
$ c1 t. g2 v2 t" nchar Send[] = "UART1 test......\n\r";- X# Y3 H/ z1 \' E) Z& t
: ?- R5 c; _$ G* D1 Q( R
extern void UARTconfig()
" x6 g$ _9 a5 H7 [0 M! p$ }. N! _{
, {$ I2 H8 L& ]7 S. l //使能Uart1: t( m( t5 D; @$ p
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# b4 `" `% F7 [$ p" c/ N* x' k
: m2 B% E. m; Q1 e1 H* u
// 使能 UART1禁用流控4 E- J- B2 c( K6 u( o
UARTPinMuxSetup(1, 0);8 j0 F. c, \! A# `
" O# |3 `8 U5 ?# e3 z% R) U! V* f- [ // 波特率 115200 数据位 8 停止位 1 无校验位
6 d b0 Q- E' T) I2 v UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
* r; O0 Y+ U. e- [8 q; W# W: I 2 h! }; M1 z; t* z5 [7 d5 U0 k* f/ E
// 使能 UART1" a7 A; O& V1 Y8 D+ |, K: Z( ^
UARTEnable(SOC_UART_1_REGS);& X* L9 b" `3 p
// 使能接收 / 发送 FIFO( V4 O6 Z# e- Y7 s0 y
UARTFIFOEnable(SOC_UART_1_REGS);1 H9 A. c+ y0 b. P; Z
// 设置 FIFO 级别
" b: F2 K1 `- M% \9 G8 V0 I UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
- y* @$ f; j ]- O' e //Uart1中断使能
% x" X# f d3 b unsigned int intFlags = 0;
- v# y1 V, |9 b9 p9 @" s6 F intFlags |= (UART_INT_LINE_STAT | \* m9 L7 Z9 Q' T+ n$ V# H3 m
UART_INT_TX_EMPTY | \9 Y: r* q; i/ X
UART_INT_RXDATA_CTI);8 N# l0 M" S p3 ~2 G: J8 V: y
: j4 g& A" @- ~" Y% K" l UARTIntEnable(SOC_UART_1_REGS, intFlags);
0 D1 R+ V( [. j}
3 W1 p2 z/ V7 I6 |//UART 中断服务函数
# b5 n. d, g# |: Y& Evoid UARTIsr(UArg arg)
2 B7 q4 l0 j6 o. ^$ j8 A$ c{
2 y; W% ?+ q1 M3 f, T! f" `0 } static unsigned int length = sizeof(Send);
3 F+ Z% d- R( Z' R6 M) _ static unsigned int count = 0;* ?+ `+ g% s/ a& G2 } K
unsigned char rxData = 0;4 a; F1 \: r, p1 {2 l% \9 C
unsigned int int_id = 0;
* K6 b" T7 i: ?9 A // 确定中断源# v0 i3 ]! i1 W$ }* c6 X4 f
int_id = UARTIntStatus(SOC_UART_1_REGS);
' A9 ?$ N# F% m8 f w! l' \ // 清除 UART1 系统中断. E# P) [' X+ b2 E' s0 B: |3 Q% C% d
IntEventClear(SYS_INT_UART1_INT);
2 V* u" s& {% |4 [ // 发送中断$ F# w+ x/ {% c6 ^) }7 w2 T. b
if(UART_INTID_TX_EMPTY == int_id)
# E+ K: f: }* d# O5 Y* _: j# {! G {
3 \9 n( Z2 e0 x. ^; _ if(0 < length)
1 W) Z: j( o# t! W. X& P: e1 w {
0 `8 M9 V# e) A. T ] // 写一个字节到 THR
* u* Q1 O9 t3 p UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);9 S$ i$ j4 B$ R
length--;
" |& H0 @9 S8 k t" W2 g5 k' f count++;
' F' Z+ O! n+ R }
( X6 t% R; u1 z V if(0 == length)8 R. w6 C4 s- T& o
{
; [0 g& d3 n8 V( N; |( K# v // 禁用发送中断
8 {3 Y% m7 A0 q" K! R- T0 J/ z UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);" P3 S1 p* E2 F3 P2 |+ V
}1 K$ f7 |" F+ R# N9 h
}
$ }8 U2 O' w! ] ]# f9 ?% r // 接收中断
1 y6 ^3 A/ _7 ]0 ?6 o/ m4 w if(UART_INTID_RX_DATA == int_id)
! n/ `+ Q, C/ c# ^+ W$ I {
& G7 Y. o B$ _ rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);; i; x; U% i' \3 T' l1 O# U) N
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);" d' {& T9 l. X1 ?2 Q: \
}
. p# n4 m+ r8 X$ k- b // 接收错误
; V. x U; S8 L; g0 x% O% c7 s if(UART_INTID_RX_LINE_STAT == int_id)6 w. K* v9 h% e9 E9 N* i
{
& `8 X& w: S# ~6 {+ j$ m# p& U while(UARTRxErrorGet(SOC_UART_1_REGS))7 G% z1 R" P" W; I) \
{. q: p* N, ^" q
// 从 RBR 读一个字节
L! k k6 ~" [6 M1 b$ R% Y UARTCharGetNonBlocking(SOC_UART_1_REGS);/ X* F" {9 j4 g' c( s; M
}* ]6 Y& T5 X- n
}
. G$ q- D6 P3 I: x/ n8 u return;
& g$ m' {) d3 P}
* Z& d) x) ^5 W" bInt main()# R" g; d8 T' V9 E S2 m' b
{ 6 e6 l" y% X! y. e; b4 q
UARTconfig();//uart 配置* a6 k; k, M8 h5 ^1 r+ h
Error_Block eb;* n! T1 t1 o: e+ ?, D5 `, `
System_printf("enter main()\n");0 Y; e7 p: r9 b
Error_init(&eb);) @3 K: m3 x P& ]$ ^7 l
// 动态创建硬件中断
1 Y* H8 F) F2 r4 M$ d. U Hwi_Handle hwi1;
* K$ @# E4 V, C5 j8 r Hwi_Params hwiParams;3 }# L( p6 Q N
// 使用默认值初始化参数
) o4 f3 Y) f& l1 H$ Q0 B; i Hwi_Params_init(&hwiParams);3 s; f8 D+ G: D1 C
// 中断事件) B5 H! w* I! N2 N
hwiParams.eventId = SYS_INT_UART1_INT;# j6 T/ f5 e3 D; l7 D h8 [: Z
// 传递到中断服务函数的参数
3 t7 M" t% `- {3 u. n% U hwiParams.arg = 0;, C1 G5 X8 k4 B& Y+ c
// 不允许该中断自身嵌套: [- z+ Y. t4 q8 |2 q2 }+ T
hwiParams.maskSetting = Hwi_MaskingOption_SELF;$ a) I( M- s; e& V) W2 |
// 使能中断
" ]" `5 d# u1 ?" f! s; T( v hwiParams.enableInt = true;
4 n% C: V; d- ^- O3 p* x" u& g // 可屏蔽中断 45 ~6 A& K+ O j" d: ~
// 中断服务函数 hwiMain
* U% {% \, m4 x1 y% M hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);) t, W% @ w" S5 S1 k
if (hwi1 == NULL)
1 V9 q) a3 W( y1 Z2 k System_abort("Hwi1 create failed"); d+ z& j* \1 U [- B
BIOS_start(); /* does not return */
, g) e! o3 W0 o! g return(0);
/ E4 M' o) e( `; R+ X} ~$ O5 q* X$ P* c1 T
4 u G* y$ y, q |
|