|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
2 g) k" ^0 p+ L// 发送缓存# F/ J% ^8 ]1 J/ J0 N8 q" \% ?
char Send[] = "UART1 test......\n\r";* K3 O- v& |; C! }: p' r$ w- v- z
# v3 W9 z9 B2 ?5 q4 G
extern void UARTconfig(). R3 `+ u8 z& [$ z v/ W
{$ A( D6 K+ u) C' W
//使能Uart18 o3 K) p) O: p4 L3 t, e# ^
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ i" g( H2 V; m
9 E1 U" F0 c0 K
// 使能 UART1禁用流控9 K4 [) S8 v, B) B7 p* x
UARTPinMuxSetup(1, 0);4 `/ F: d/ ~ \& X
7 T! [5 t9 q C: w* ?5 @) p
// 波特率 115200 数据位 8 停止位 1 无校验位
' K/ i% s3 l9 I8 {0 h% f9 I4 a UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);1 m; ]" i8 v- p; |
! q. d$ [, p4 |+ T // 使能 UART1* x. B. W8 P: v
UARTEnable(SOC_UART_1_REGS);
7 p z& q6 {/ P3 X3 v9 s: g' J // 使能接收 / 发送 FIFO* K: B9 C+ c h5 X. ]0 c
UARTFIFOEnable(SOC_UART_1_REGS);
! S: n X/ T* u6 J9 ]7 K% T# x // 设置 FIFO 级别9 G& C' s4 J0 K. J N
UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);2 F1 p0 G& x, l, c% G$ M! R
//Uart1中断使能
1 R' O* Y+ c' g* K+ K/ j unsigned int intFlags = 0;+ h( t2 g7 b, v% A! V! s+ \4 L0 H$ D* {
intFlags |= (UART_INT_LINE_STAT | \/ W# h% n; ~0 Z6 `0 J+ d
UART_INT_TX_EMPTY | \! X) U G3 a! @ d$ N
UART_INT_RXDATA_CTI); r: U7 P3 D( d. ?$ S, q% j
0 L9 u/ w- j$ n8 _; C+ _4 ~8 A
UARTIntEnable(SOC_UART_1_REGS, intFlags);4 e0 q2 Z- y: h* c
}
5 {3 A" h& A1 T7 C% n, M& I//UART 中断服务函数
& f4 V' D% ~/ Qvoid UARTIsr(UArg arg)
9 K; v; Z8 n% t6 D$ V. s{
3 B. O1 R! F1 N2 J3 A9 [9 _5 P7 K; l static unsigned int length = sizeof(Send);2 u; |2 f: T$ D8 E' q) v3 d
static unsigned int count = 0;
7 i# J+ r# O. L unsigned char rxData = 0;( D3 C1 G# K8 k
unsigned int int_id = 0;
' H+ S* w& S9 H: c; T7 p1 j // 确定中断源 e' o0 y. K- F" P( n9 \# l! L) _' b
int_id = UARTIntStatus(SOC_UART_1_REGS);
* b8 e' Y/ V: Y. h // 清除 UART1 系统中断
$ Z( {1 g( s, H) T; O$ k6 J IntEventClear(SYS_INT_UART1_INT);2 W1 Q' B2 u/ q7 j' G/ X- l
// 发送中断
& v( @) b" S y- ^) ^* @; a9 j2 V8 e if(UART_INTID_TX_EMPTY == int_id)
; z2 N( A6 q# z2 L( Q; c {
" G$ D: `" L3 Z9 r if(0 < length)
' C' U0 o0 F2 ~& T( u5 M {
0 z' s8 b" Z" r# m // 写一个字节到 THR
+ D( U; I' A) S" {; W UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);
/ c3 A: R. T. A8 [6 ] length--;
0 k6 K9 Y, I; t- B- w9 D count++;
5 z* p) ^; v! N7 B }
# j( O& F' _/ }# p+ E, \, t if(0 == length): T% x! z. \% z2 f( |! i
{
, j4 M8 w, m( i/ t' u3 f) d // 禁用发送中断
1 f( \+ i: h; x$ o UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);; s6 n3 T' g! u! q* l; k
}; c- m+ x8 U) L0 m, c k
}! w' V% L! a& u$ H7 `# J! @! z. j E
// 接收中断' {- g: a+ y; o8 `8 W
if(UART_INTID_RX_DATA == int_id): g f' q$ j' d' a5 O& y
{$ M8 Y" ]5 W8 b: j
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
" a% g8 N- ^ [5 `% ~ UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
2 k( K% N! u8 S0 u, m" J1 B$ f }
Y. l4 Z* V a2 w! u // 接收错误
% w& Z' G' d+ | if(UART_INTID_RX_LINE_STAT == int_id)
. d3 x, E' ~1 b! P* l {
' X9 c9 H; [; b! f! c6 a while(UARTRxErrorGet(SOC_UART_1_REGS))) V; R' [% c. Z) H
{
% i& F$ a# C8 {1 O // 从 RBR 读一个字节. {" j! P+ H# l5 ~1 X0 M
UARTCharGetNonBlocking(SOC_UART_1_REGS);6 W4 q% C0 r" s& i
}
; k" ]% b9 r& H }: D5 \7 v, g* Y9 y9 n9 [; b) _
return;
' `; U3 r# Q" i/ S, M$ d4 o}
& ~. {* c" a) OInt main()) ~$ [: w& L, G* T% a' @
{ ) _. Y A l! f2 {* |# t
UARTconfig();//uart 配置: X4 H2 C+ v( d" V
Error_Block eb;$ V8 ~% w$ I5 J9 k8 p; U U
System_printf("enter main()\n");: A- T& Y- P# Q7 K3 W
Error_init(&eb);
+ K u5 y( _; P# N s/ o6 y // 动态创建硬件中断* {& o. i- O3 G2 w0 r
Hwi_Handle hwi1;0 C$ O" B E C# Q0 R5 y/ |
Hwi_Params hwiParams;6 U' D; @9 u( Y+ r% d: V# B* _
// 使用默认值初始化参数5 N5 O7 r4 E4 k
Hwi_Params_init(&hwiParams);
# M- d' x. g( s8 D // 中断事件
m# Q5 \; M3 ]' s hwiParams.eventId = SYS_INT_UART1_INT;
7 ~, g- L! X' b/ C // 传递到中断服务函数的参数0 R; S% h. _/ {) ~2 e
hwiParams.arg = 0;$ @1 b2 D- C# d8 h4 ^- v
// 不允许该中断自身嵌套 o* W8 s' _/ p4 @
hwiParams.maskSetting = Hwi_MaskingOption_SELF;
% |8 l9 g7 G- U // 使能中断( a \' \6 o6 R( N
hwiParams.enableInt = true;/ x. S3 J* O- n9 p' k6 l
// 可屏蔽中断 45 k& W4 i$ A8 \0 w% M
// 中断服务函数 hwiMain$ f8 o, w* L S, c7 I& q1 M
hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);7 D9 F: g% P; C+ U" Z4 E
if (hwi1 == NULL)4 q0 S8 _9 w( Q& g, z. t
System_abort("Hwi1 create failed");
D. L% b: h0 N: e3 B7 ~ BIOS_start(); /* does not return */
' ~; I$ D: y) a! F( [ return(0);
2 o( i" @ r7 X$ S}
; f, I m# U9 R) T$ p% x) T7 o# g/ {& D' x
|
|