|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下7 n p/ E9 H: m7 U0 n; b$ w+ y8 T M
// 发送缓存
' Q4 C c: S3 S0 n5 p* Fchar Send[] = "UART1 test......\n\r";" P. L: b5 V$ M- T) L+ E
; s6 Y0 h ]4 F: Bextern void UARTconfig()
3 ]- Z' a% T7 z; o7 v{
; P) z! m- f+ h/ C, i //使能Uart1& I5 A; S8 Z) \& b
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);% S; A4 z8 f' p
" J8 q5 Q2 p8 F" n // 使能 UART1禁用流控
( w4 s# M R# Y# b0 q UARTPinMuxSetup(1, 0);
! o8 s/ P; V" r. z7 g! M 0 a) Z3 ~8 l' k/ m
// 波特率 115200 数据位 8 停止位 1 无校验位
- W1 f# r6 k( f1 G7 m UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);" ^7 ]3 T- d4 Y2 {7 S+ C
6 q2 M$ {* g+ C# b. `6 z // 使能 UART18 c$ o& x t1 `) z ^) Y N9 O
UARTEnable(SOC_UART_1_REGS);
4 D. E% J9 x: G! `# z" H // 使能接收 / 发送 FIFO& Q' L( w% P+ d1 _
UARTFIFOEnable(SOC_UART_1_REGS);
* G/ g5 w& Z! N; e: q // 设置 FIFO 级别* L: N+ O/ S8 ?3 W# j
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
% J( P5 V3 G8 o5 i //Uart1中断使能, a! u. T* J2 c9 a
unsigned int intFlags = 0;3 M L1 A- g' @. j1 T
intFlags |= (UART_INT_LINE_STAT | \
& d, t- D9 e5 k9 `: D5 X9 C7 m UART_INT_TX_EMPTY | \ q v. _ F8 P5 S% C( x c
UART_INT_RXDATA_CTI);7 P! A; S7 |) l e* f5 G) W8 N
# Q; J3 z( ?- @" E5 G& Q6 H, X UARTIntEnable(SOC_UART_1_REGS, intFlags);
3 _# r" S3 x# G+ C0 c. F* C, @}
1 C# Q' V# d! a( R& n5 S1 R5 c//UART 中断服务函数$ F) l4 F3 C0 f
void UARTIsr(UArg arg)' m6 M2 y/ W$ q. w4 Z! g
{& @ u7 X: `' @6 b
static unsigned int length = sizeof(Send);
/ @% A0 d- q! J' `6 L static unsigned int count = 0;; I+ E' x- p: L3 J: i$ n
unsigned char rxData = 0;
# J! h5 _( w% ]* N, a7 ~ x; p* m9 V unsigned int int_id = 0;: M1 M/ A+ Z, |. g v# @+ b
// 确定中断源
" n% @% O$ A6 B* S% J6 H, O7 ` int_id = UARTIntStatus(SOC_UART_1_REGS);$ @1 [& i- p4 k3 X* D+ g9 u: \
// 清除 UART1 系统中断' U, m9 V: \) J$ N5 l, i. L
IntEventClear(SYS_INT_UART1_INT);
6 I0 E! H8 J. C( r // 发送中断3 A f5 ^5 N# {0 v/ ]7 {
if(UART_INTID_TX_EMPTY == int_id)
; B4 F+ s" a' T8 ] w* z$ W* @/ _ {
6 D, M6 U' }; ?3 c- ~2 e/ b if(0 < length)$ d/ w$ F9 B8 I# x, h
{) J) b3 p4 O( f- b& |
// 写一个字节到 THR
% w( N8 ] S: m, \+ g @ y UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
1 X! s: z3 b* s+ I length--;' D7 [ ?# R$ @' u5 Y# T O; K
count++;
, l: I- `2 i7 A" Z7 q1 [0 X }) ]/ A8 e( B$ M; E6 a- Q. |
if(0 == length)0 P9 l+ S, T8 N% ?8 q8 n
{; ~8 u+ n, M* `3 O7 r4 j
// 禁用发送中断2 I' f U0 S' A7 A1 {
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);. p. G$ y9 a* ?7 O8 @3 y8 H3 d
}
8 U7 `* E0 p& h" a }
O( I/ g! G- h x* X/ a // 接收中断
: O$ u: ^3 k2 W, ?# B. }3 B1 L) \ if(UART_INTID_RX_DATA == int_id): d- `$ S& j$ S
{. R: u9 g: I3 g( b: y% o; T6 T- D
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
4 |. r6 p0 v# G* c UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
: O3 D4 j7 t, j% [% e }; C t$ W( w' Y, V' m' \* S
// 接收错误
$ x+ w* t i+ l, ]$ ?- @ if(UART_INTID_RX_LINE_STAT == int_id)3 [' X8 [/ h0 s: s2 V; ^- z8 k; \
{0 q% i w7 n% v/ L& Y' R6 T$ X( l2 q
while(UARTRxErrorGet(SOC_UART_1_REGS))
_# A9 B& F) n( {# @6 o {
' I5 N- ^% X. |$ L' z O, Z // 从 RBR 读一个字节0 M" S% {! B7 {" J2 E1 k6 q
UARTCharGetNonBlocking(SOC_UART_1_REGS);
% k6 Y9 o% F; c7 l: G* i' u }
2 u: U: `) }% S* q+ | }7 C2 f% l4 ~! _) F6 [
return;2 T! t& ^0 i) D6 R8 a! w1 {
}) q9 V& L1 F: X
Int main()
5 j3 H7 a3 u( R8 K* X{ + A) ~4 E) v8 M2 g) v# p
UARTconfig();//uart 配置
- @0 @ ? }1 C4 h/ _9 u1 V Error_Block eb;
5 g0 F4 {( ^: @* ~ System_printf("enter main()\n");
6 Q; Z: Q- C8 a. I. R' V$ r Error_init(&eb);" S% D! C" B6 O, F* y8 Z0 g5 T
// 动态创建硬件中断2 v2 z* j! g. T" G
Hwi_Handle hwi1;
! C! r, q# ?; b% @# `8 n Hwi_Params hwiParams;" u$ e/ \( I+ M5 e+ ]+ w3 |
// 使用默认值初始化参数; e- d& J" b. D M6 r
Hwi_Params_init(&hwiParams);( l- a6 K& e) A" j9 j
// 中断事件
) y w! F- s) Y+ t8 Q hwiParams.eventId = SYS_INT_UART1_INT;- q) |/ R0 x+ u1 e' ]/ Q
// 传递到中断服务函数的参数
; u0 e: y9 [2 U/ {! y4 ~# O: g hwiParams.arg = 0;5 q( ], g" m9 @) R0 F) O
// 不允许该中断自身嵌套' v! S/ X, J; g" J, ]9 A) {" Y
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
/ h; V: `& s4 ]' n( H+ e; z // 使能中断
7 c* J! ?9 _ J1 \* c4 k7 Q( h hwiParams.enableInt = true;# w: D: X8 S0 X& S7 j0 a2 c; q" G
// 可屏蔽中断 4# w& n! E \! t) |* v) R
// 中断服务函数 hwiMain
- y% U9 N: o* d, G! Y# q" \3 ] hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);! N: Q" b, Z U8 \5 R3 L# U
if (hwi1 == NULL)
7 @% @+ [3 q+ s System_abort("Hwi1 create failed");
0 i) M z1 |7 Y1 O BIOS_start(); /* does not return */8 O& x1 `4 ^6 G
return(0);0 j; A& Y" M! ?/ A. I, X
}
# A" k4 k( }8 ^8 `
, {% ?+ B+ x) D9 j, B- Y0 M5 P |
|