|
在sysbios下,uart中断收发数据,程序无法进入中断,代码如下" x. O! n" P$ ~, ^+ [" O6 T( b
// 发送缓存8 L u2 r" k, `- U
char Send[] = "UART1 test......\n\r";
9 D4 x# c( b) | ~3 a2 y4 c, _" ?& ?' @: ~1 f$ }& c
extern void UARTconfig()
% ^4 W3 I8 Y. {$ C. h1 G D{
% Q5 g: B9 E9 R% o* P. b0 n //使能Uart1
" e# V0 L" s. u+ K6 s) i0 O" H PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);+ o% u5 k1 o0 ~* o( q9 A; |" w
1 r" h7 O) Q9 m. P2 W- `: e% r
// 使能 UART1禁用流控
0 m9 b4 U# e! x. n# j UARTPinMuxSetup(1, 0);7 y( L# @* e2 R7 Z, I
; ^7 o/ q! d6 ? // 波特率 115200 数据位 8 停止位 1 无校验位
# f$ k3 j: h" q& Z UARTConfigSetExpClk(SOC_UART_1_REGS, UART_FREQ, BAUD_115200, UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
6 L; Z: {. M' {* r # Z g$ k6 j$ Q5 a* D8 d$ i
// 使能 UART1
1 j2 e& v: Z* {' N) K/ @) D) o- N UARTEnable(SOC_UART_1_REGS);
, c) d4 a$ _% j+ X. W // 使能接收 / 发送 FIFO
/ r5 y) I t, s! @' K: E UARTFIFOEnable(SOC_UART_1_REGS);
9 [* K- J; V8 @9 j4 g // 设置 FIFO 级别
8 v3 v" M0 `, x$ A UARTFIFOLevelSet(SOC_UART_1_REGS, UART_RX_TRIG_LEVEL_1);
: i4 q4 g1 ]8 T& D1 ]% \: x- y //Uart1中断使能
3 |: S+ C, U9 @: S6 ] unsigned int intFlags = 0;/ c0 K) Q/ ]. [8 ^0 O
intFlags |= (UART_INT_LINE_STAT | \# L& d; u2 u6 k
UART_INT_TX_EMPTY | \2 |4 O, B* e4 H7 W6 x1 s" z0 h
UART_INT_RXDATA_CTI);
, H$ X; \1 y8 a8 d2 w- v) G . Z3 X. M$ l! v0 p4 B
UARTIntEnable(SOC_UART_1_REGS, intFlags);- c+ W4 o; G2 Z n9 o8 s
}
+ c# \; K I/ R4 i, M, ^//UART 中断服务函数
, u1 K/ u0 B; `" U7 |void UARTIsr(UArg arg)
6 h1 K4 w3 B9 u4 S/ z6 d/ h{" Z$ B& ~3 c1 W3 P/ J( g D
static unsigned int length = sizeof(Send);7 e; S8 A* v8 K6 J
static unsigned int count = 0;
2 ~" B' j3 C9 A unsigned char rxData = 0;
6 U7 E. J' w- N; H unsigned int int_id = 0;
+ m' C( x1 F. `, \ // 确定中断源
& `* u$ Z4 M5 z b int_id = UARTIntStatus(SOC_UART_1_REGS);* R7 D' o% W/ I( Z* {! f
// 清除 UART1 系统中断& m- R( f& y( X. h7 R
IntEventClear(SYS_INT_UART1_INT);% o$ L( t$ `7 A( P% R
// 发送中断
z) I' N! U; l3 v+ _6 B2 G! m if(UART_INTID_TX_EMPTY == int_id)- Z) c/ ] {4 [& i; Z0 Z
{
& `4 i" R6 j1 h# J4 R" h( L5 N if(0 < length)
8 _! ?" O3 S" {3 B {
4 Z$ ] m/ m) c' T2 Y // 写一个字节到 THR8 S% ~' B8 W! z- J2 H. q
UARTCharPutNonBlocking(SOC_UART_1_REGS, Send[count]);! j }, m$ o7 l! a5 H) j, N! g
length--;* b" _% t0 X& F! h
count++;
% q6 {& M0 T0 q( z! W |# _5 i }, J1 C6 E! K# {' w; w
if(0 == length)
+ v$ W7 C8 Q: M7 k {
( G0 Q2 k3 P8 M+ \ // 禁用发送中断5 H) `( W5 a( [9 I) R' P; _
UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY); a/ V1 p& z+ r( b
}; W) O' e6 X1 b0 J) P" z
}
; R7 o3 x( p8 K" L* v; ?9 L // 接收中断
1 b% ~' E2 X2 S6 w; \. w( ` if(UART_INTID_RX_DATA == int_id)( H6 C$ X8 L3 P8 y% } h
{; ~" ]" G6 r8 V! E9 C
rxData = UARTCharGetNonBlocking(SOC_UART_1_REGS);
: M, P$ m# S. \" | UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData);
' L% x8 r9 Y) N q }, v5 Z- ?& Q/ R; X# j9 ? u
// 接收错误2 W! X. k# ~2 _
if(UART_INTID_RX_LINE_STAT == int_id)
( R. L7 U; R( m M1 \0 h {$ M& e) N+ h! w+ A( W
while(UARTRxErrorGet(SOC_UART_1_REGS))1 k- k. L( j6 }# L) [
{
' Y/ h) Y" d3 j$ J3 \6 @* g8 _. c+ D* ~ // 从 RBR 读一个字节0 b* o1 m3 Q5 \9 n0 z. n
UARTCharGetNonBlocking(SOC_UART_1_REGS);2 s2 y! y1 B& ^% E0 u8 E/ i- s
}
% c8 L: U0 b% w- h2 _ }) [# X i7 A* b* x4 Q$ d; H! ~3 I
return;" }0 X( m1 F+ w' Z- x% R
}' Q {8 d. I: q# d) }; H# k" s8 z
Int main()
9 f% T# Q+ x/ F7 s1 o% |5 f' E& ^+ Q' W{
0 m+ l4 B# d# x6 S7 v; E' w% \ UARTconfig();//uart 配置
3 U4 n# \! T8 ?" J: v Error_Block eb; W0 h& l& C5 X. q3 x4 K$ P/ ]
System_printf("enter main()\n");
M7 u o1 s ~+ v% L' ~" s Error_init(&eb);8 K! L# b B6 f0 T) k1 c/ ^
// 动态创建硬件中断
( i; E6 i- Q- J: [# [6 f3 c Hwi_Handle hwi1;& q0 ^- l& v( t7 d3 F
Hwi_Params hwiParams;
* F8 Z, m# v. F // 使用默认值初始化参数! A& ?3 X2 R: M, L' W1 _) M/ Q/ Y
Hwi_Params_init(&hwiParams);* ]. ~1 P0 U+ ], C5 {* j
// 中断事件
6 ~4 ~6 |7 m T6 C2 q hwiParams.eventId = SYS_INT_UART1_INT;& O) M; {$ [ b6 }7 T
// 传递到中断服务函数的参数
, h6 o+ n: |6 q8 Y8 ^ hwiParams.arg = 0;
0 ^$ G& t; {! X, o5 _. o2 R // 不允许该中断自身嵌套3 j; l* b4 V/ _- ?4 G
hwiParams.maskSetting = Hwi_MaskingOption_SELF;1 q K; i& R8 b# d# ^2 V0 J
// 使能中断
/ f3 ~" F$ O' }) c4 X; c" {' H, f hwiParams.enableInt = true;
- ? g5 Q5 H5 b$ o8 _0 u; |0 v4 y3 ^! |" H // 可屏蔽中断 43 U* o! ]* }. a" o- ]8 X. U
// 中断服务函数 hwiMain
# C3 t" r h( G hwi1 = Hwi_create(C674X_MASK_INT4, UARTIsr, &hwiParams, &eb);
1 N3 W: J. h9 q" S: H if (hwi1 == NULL)1 j& C( S; R K8 c
System_abort("Hwi1 create failed");0 Y! @, f0 m3 A
BIOS_start(); /* does not return */! z! f5 p8 w7 U* q. W! B2 z
return(0);
( k' D! g8 B& f}
5 E4 j0 O3 E" Y2 @# o/ m, D% D, S! a: {
|
|