|
|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下
, f2 d$ M1 u# w8 J5 O0 g: I// 发送缓存2 ? e5 E& e- S. v' P
char Send[] = "UART1 test......\n\r";. s3 C4 _ w- d4 |. b. ~; C' z* N
' Y( u' r0 C* u5 E1 B/ yextern void UARTconfig()1 x' S5 o) M! a7 p! ]# ~/ g K
{
7 ?3 {, R- C# ]( o //使能Uart1' d! ~ r: z |* U' E
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ V6 [* {) e# R5 z$ y4 W
+ O: }3 @' F B' r6 T // 使能 UART1禁用流控
: H- ~0 j0 `- F1 ?# g k0 a UARTPinMuxSetup(1, 0);5 y: u5 h( l$ v
: _7 v8 T: c2 R8 B! L1 [
// 波特率 115200 数据位 8 停止位 1 无校验位1 V5 j5 q7 Y7 B6 U) S
UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);! p2 u) q+ B8 l; S; W) x
5 {0 |/ P R0 Q. S, f
// 使能 UART1
( B# F( U- x( ~ k UARTEnable(SOC_UART_1_REGS);- g! k( Z, N4 }
// 使能接收 / 发送 FIFO+ J& ~6 e$ v% ^( k
UARTFIFOEnable(SOC_UART_1_REGS);' ]* X9 f: f& k7 o! x" h
// 设置 FIFO 级别
/ M h* {- G( Q7 D0 M UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);2 L" u8 K2 L a/ G
//Uart1中断使能
! Y2 c7 j: K( ] U c. n& x unsigned int intFlags = 0;. A4 y) G4 p0 \1 q0 Z+ x
intFlags |= (UART_INT_LINE_STAT | \+ s& f4 s- H" X6 R- c
UART_INT_TX_EMPTY | \' d! B8 @% V$ Z' N5 u
UART_INT_RXDATA_CTI);
8 H8 b. K& G/ @+ |+ u
( k! C1 G3 l7 ~4 v5 ^ UARTIntEnable(SOC_UART_1_REGS, intFlags);
5 H3 e5 Y" o$ \}) F* v% K+ O6 A6 i6 z
//UART 中断服务函数
2 }" I5 z9 S, c& pvoid UARTIsr(UArg arg)
$ r" H' e4 L7 ~' `1 J{
# k7 ^# Q8 u1 D: Y* k4 N1 c static unsigned int length = sizeof(Send);& x- K7 j$ T- Y7 B; l+ q
static unsigned int count = 0;
: C n; g- i c unsigned char rxData = 0;
+ i( _7 e4 Q( J unsigned int int_id = 0;
1 D. j; t. G1 h l2 K6 ~ // 确定中断源/ @4 V0 C& u! C% j
int_id = UARTIntStatus(SOC_UART_1_REGS);/ E, O D/ t. z K/ e1 ^6 r
// 清除 UART1 系统中断
) [; P# j1 G5 F) E IntEventClear(SYS_INT_UART1_INT);5 W' G; c4 \8 ~; `( X) i
// 发送中断
& s/ o7 u [# L* a* [/ Y if(UART_INTID_TX_EMPTY == int_id)
# y3 g% x ~& G3 C {3 r% a/ X: e$ o& y$ E' m& m" ]
if(0 < length)
7 g# ? w2 B. K/ W' T: P/ L" s {
" v, D1 ~3 A8 v v( G // 写一个字节到 THR
% d5 C" G) o& E. H0 h0 Z UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);% c& a/ L5 K7 B h& l" S6 ^
length--;
, ^4 U' j: Y$ C- F5 r8 }/ C count++;
" W6 u1 a9 j3 t: l6 A1 Z# t }
% { t; ^ V9 ]3 \ if(0 == length)
( ]( o" c8 N1 x) k d {
; Y2 h4 V" v4 V& l/ B // 禁用发送中断
: W, k, C* f6 y8 B* _7 E* F UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);9 G" C g) E" Z2 x: Q! n
}
. u9 G7 ~; c. f, o3 k. C# p6 c/ i& P }; \# G- u, @* P- S4 Z* t) _
// 接收中断
R, R! p* G& K; g5 k" @ if(UART_INTID_RX_DATA == int_id)/ F U- }+ v1 D0 f- M* R# }
{
' O" F u- R( M$ f+ }# O rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
. ^! ?' o& G5 @$ B! M% i6 a UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);. D6 D% A9 F& Y. K$ O
}
- p4 w2 w3 _! T6 V& T // 接收错误( p* U1 h$ i8 w/ _" d3 ^7 ~( V/ u* u- J" f
if(UART_INTID_RX_LINE_STAT == int_id)0 k, j) Z* U7 T" R
{( }4 P+ k3 p0 {2 y/ W4 o2 w
while(UARTRxErrorGet(SOC_UART_1_REGS))
% x) i) L1 y9 q& i1 r( e9 {. j! j m {
! h- P' G3 j/ @- V% D5 v // 从 RBR 读一个字节
" Y' ]7 r' H4 U) ^& r/ q# y UARTCharGetNonBlocking(SOC_UART_1_REGS);/ m# g6 |% W+ r
}
, |& d0 |; m6 ~ }6 l8 \: Q$ f& u5 g
return;8 u) m. m% w/ k6 B. x U
}$ P- W N7 y- r& w* k( V6 Q
Int main()
: h* Z+ U4 F5 D# N8 U% R+ i{
2 P3 L5 J) g' r7 m# x2 l UARTconfig();//uart 配置
$ X$ B, v; Y- ]$ |' \6 ]2 N4 p Error_Block eb;
& Y& C4 y' r2 A; x. N9 k System_printf("enter main()\n");1 O/ M W0 `9 r$ [
Error_init(&eb); F& q& K5 r& K
// 动态创建硬件中断. i% p3 j7 ~$ m8 J
Hwi_Handle hwi1;
, U) }& i, U) ]) A0 u6 M Hwi_Params hwiParams;1 j0 p& O% d( ]) w& C. A7 T, X
// 使用默认值初始化参数
! z# V3 w J3 b Hwi_Params_init(&hwiParams);( x- N+ m3 [0 f2 x' R, _" f
// 中断事件9 L r3 K7 I+ V
hwiParams.eventId = SYS_INT_UART1_INT; }9 k0 M* n, E, M( |
// 传递到中断服务函数的参数
+ q+ V! F4 w1 o* v, f. C hwiParams.arg = 0;
6 e: Y+ o7 Q4 K7 r+ ?9 V+ B" b // 不允许该中断自身嵌套
* ^) e& ~* m, d& g3 }1 y+ g hwiParams.maskSetting = Hwi_MaskingOption_SELF;) C+ I r/ F) K9 s" @1 `- _; X
// 使能中断
8 z' j W% }: A: p4 ~9 W hwiParams.enableInt = true;
2 a( ~8 t/ F7 [& L8 U- q8 h // 可屏蔽中断 4" R. k8 V& n1 M8 g" F) m
// 中断服务函数 hwiMain
5 U% h& F0 A7 N8 m hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
+ F( M) D! D1 m% l if (hwi1 == NULL)
, ]+ C0 d% R9 \/ E: E& [4 Y' |9 B System_abort("Hwi1 create failed");8 c8 w8 z4 p+ g% ~
BIOS_start(); /* does not return */
: G5 x9 D0 C" ?8 ~+ i t return(0);
; ?5 W; H# @+ E" |4 _, I}" Z0 G& X- r$ G6 `0 ]3 T+ ]
& x, V1 ~" J' q) }% ^ |
|