|
|
沙发

楼主 |
发表于 2019-4-30 19:45:08
|
只看该作者
这个是例程,麻烦老师帮忙看一下,怎么进入的发送中断?我根据这个程序改的程序只能接收数据,不能主动发送数据。我用串口助手试了下这个程序,不好使啊。$ J. A" N9 P: A1 {1 W& s( {
9 p, t5 ^% b3 u7 K8 |# `#include "TL138.h" // 创龙 TL138 开发板相关声明- p" P7 P; ?: p5 E
/ ?. g5 z3 y! o0 R/ L, z: C/ M- Z#include "hw_types.h" // 宏命令
7 k6 d: M, x# C& u& W. T: t#include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器
, O5 o7 }8 P1 `#include "soc_OMAPL138.h" // OMAPL138 外设寄存器
/ S5 \2 h+ |* M* y/ s% G$ a* F+ y. q* f) K, K
#include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
3 V$ }& y f7 B1 p/ Y7 F#include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
! F5 ?7 b1 I/ j3 I1 t#include "uart.h" // 通用异步串口宏及设备抽象层函数声明3 t1 u# v9 T3 `& K
#include "interrupt.h" // OMAPL138 中断相关应用程序接口函数声明及系统事件号定义4 W1 X4 f$ F0 r/ Q, `% l
M3 H2 m$ x2 }# @- A) Z" g/****************************************************************************/
6 n2 C' e' Q) U3 N" z _& C& _7 Z/* */
$ G+ F6 G' V( f. M+ f i/* 宏定义 */
( _! K. @0 p3 e* @9 C/* */
6 T$ \& @" h& [3 V/****************************************************************************/+ I7 U E% Y+ ?0 V, l G, a f* O% z
// 时钟
- W, k4 `! |, i& I#define SYSCLK_1_FREQ (456000000)
8 f5 D1 v& f- m, _#define SYSCLK_2_FREQ (SYSCLK_1_FREQ/2)
8 | I% o: d* i5 Y0 x: s6 |#define UART_2_FREQ (SYSCLK_2_FREQ)& i" P' V+ d5 s- E$ v) M1 f0 B$ [
5 q p8 e: V" c t! V
/****************************************************************************/
, ?0 q3 y4 }& B" ?/* */7 M8 I2 V. c& \* E6 e4 W0 \
/* 全局变量 */7 T- \# X; X' ?2 P9 k7 A" F
/* */
* i/ Z; [ I/ m, Z! h/****************************************************************************/
6 }! A6 d; s* K6 ]2 |5 t" a' Tchar txArray[] = "Tronlong UART2 Application......\n\r";) ^$ p% ^ ]- ~" P5 O
, D4 R6 J2 c6 c' C
/****************************************************************************/
$ _: C, z, N" _! ?: H( ?/* */
4 `3 s# f+ t$ P$ y. c/* 函数声明 */
/ \& M; D3 g) U/* */8 _4 I$ [# q6 t3 L. s' |5 r
/****************************************************************************/
* b- X0 P) l+ x// 外设使能配置
l1 A6 {# p: Wvoid PSCInit(void);% ~+ d8 h* }9 t& M' n) L% M
* E5 \3 S5 d$ d' a0 P// GPIO 管脚复用配置
" ^) k- L. F# M" p" u6 x( bvoid GPIOBankPinMuxSet();7 O9 V: Q" O, N' b( }
3 X* P3 U, ~/ o8 ~$ i/ P% g( y& v: S// UART 初始化
+ F$ C1 T. W" M1 Rvoid UARTInit(void);
; u ^) Y- ~0 R// ARM 中断初始化$ b& \) d8 U' T* Q
void InterruptInit(void);" \7 c) g! V5 h/ e0 P6 x
// UART 中断初始化3 e7 W3 f+ u( n# h- p1 W3 g" e1 L
void UARTInterruptInit();
- H! o( w2 P3 C* i/ k// UART 中断服务函数
* C& \& H, M/ n! @: bvoid UARTIsr(void);
. v8 y+ w# j! @- Z* `7 A8 [) N
: l# m; B& W, w. S( T, S4 T/****************************************************************************/* A( S. C) a+ _1 d' D3 ?
/* */
$ L! a+ n: p( [0 b7 R8 a% k/* 主函数 */
, {- g4 E& L- ?/* */2 S% h* d9 `$ y
/****************************************************************************/
/ o2 I6 N& _0 h' v {8 p' c6 _8 }3 `int main(void)
/ o) u2 \4 i3 i9 l! p2 @9 w{
^& k1 ^. s6 U# ^+ R R2 c // 外设使能配置1 a/ T6 O. p* [8 |1 i+ K
PSCInit();" y/ h" X/ w g" K, E+ |
+ P3 Z/ v2 X9 g // GPIO 管脚复用配置6 T, D+ r8 z, A5 K1 ~: t4 x l, H
GPIOBankPinMuxSet();9 z0 e; U& z9 V+ L; @1 V
, t9 f% p! h6 u8 S* V
// ARM 中断初始化
$ W, C. M" u9 e m( @$ [ InterruptInit();
9 f6 n% @8 D$ ]% U. z: L4 ?$ a, J) ` ?! @
// UART 初始化9 _9 u% R0 [3 b. \6 M
UARTInit();
( H# L$ ^0 K: A9 {* |8 R$ r8 @- v0 L' r" Y
// UART 中断初始化- J- A/ G' k9 |
UARTInterruptInit();# w1 l, H1 f1 a7 F) T N# }
! z7 g; w/ ~' n; U( F; e M // 主循环4 E$ _3 s4 C5 v1 T
for(;;)
1 W0 {4 E1 h1 I. ~ {
: E; W' b |3 q- A) w. g. S. N
/ I! E( Q* I# W- p& y- P( g2 m }
~7 q$ U- e7 G. I1 {}
, i9 z- k5 I' D& a, e* z/ A& J
/****************************************************************************/
$ k9 W) c; S& Q$ f6 |9 S; i3 {) F% ?/* */
7 ^' W [, q& q/ y' h2 J |' ]/* PSC 初始化 */+ ?* r! C" ~4 b/ F
/* */
) q8 w- i2 M8 [% \/****************************************************************************/
+ J- w! t7 u8 z! {& L: }) uvoid PSCInit(void)9 P' X* Z7 b! Y; C
{1 p" F9 o9 Z0 b2 \- z; ]
// 对相应外设模块的使能也可以在 BootLoader 中完成2 {' o6 K2 `5 w; h" D
// 使能 UART2 模块
( X, a9 y: h! J2 }" E PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_UART2, PSC_POWERDOMAIN_ALWAYS_ON,PSC_MDCTL_NEXT_ENABLE);
+ R# x6 Q, @# }/ f& T2 ]! l8 r}8 `4 T y/ p0 `/ ~3 R- s2 X8 |
8 |7 R, X1 Z8 S
/****************************************************************************/
- X* C9 g. @. T# d# F$ J& y/* */
+ g7 S' |, g3 c+ H8 A/* GPIO 管脚复用配置 */" @7 L- x! i- ]
/* */2 J/ k* [5 O# b) t& ^. A" {' E
/****************************************************************************/
" \( @* g8 Z% g9 ~void GPIOBankPinMuxSet(void)! U. ^; I- \: ^* ~* o
{
) B$ R- q% |5 X; p6 y3 M5 F" \ // UART2 禁用流控: e0 E% M3 A! j1 V# X& \2 E
UARTPinMuxSetup(2, FALSE);
7 C* B, ]: R" \& ]# d7 W& _} |- [7 {3 m. w1 C( ]8 y
3 x, |& d4 u, X
/****************************************************************************/
# K0 c6 G' f1 ~0 E/ N/* */; ]9 _0 D9 t: L$ I
/* ARM 中断初始化 */
- T5 f; y, V6 y; [1 |8 G- W/* */# \* g: B, @ z5 J/ u1 j
/****************************************************************************/
) {0 F& }) A( [6 h _: T) Avoid InterruptInit(void)
% B K1 O0 w" a& M9 N, G! n{
/ x9 M0 [, @ g* [ I // 初始化 ARM 中断控制器. e8 U2 S j: L! a" C4 u( R0 h& \
IntAINTCInit();
! s% z3 ^+ N9 W" l& H+ \
- Z1 b; X0 z0 O$ e) F // 使能 IRQ(CPSR)
; o3 M; }( P: P' D; H {* w IntMasterIRQEnable();3 S0 ?$ R8 K- D* T5 S( B" @) h& h
; @& L9 x5 r) a& ^, B0 `6 O
// 使能中断(AINTC GER)0 R9 L' E3 p0 @
IntGlobalEnable();
& ~( [% B* L8 F0 t" |5 o O
8 I! V C6 p( ~ // 使能中断(AINTC HIER)% ]! Y0 \& q4 U1 p, w" H- X
IntIRQEnable();
! A2 F/ W4 \ Q: u4 h}' V5 r, g/ f/ W' b& l
# T' c' X( I/ x% T* _* s
/****************************************************************************/
/ O( R& H* ~" i3 G1 T/* */, j8 J6 D1 k. I: a; x) ^
/* UART 初始化 */
# \$ G) X* ]* R; H$ a1 U8 [/* */8 p6 b6 C Q; t* X5 X2 s& A, ~
/****************************************************************************/
* s- [6 P+ u U9 s' d% vvoid UARTInit(void)
# l, D4 a0 b: m{
3 |- @( i. e* d1 h. x6 l" | // 配置 UART2 参数
5 I" n: U" n" O! \) E // 波特率 115200 数据位 8 停止位 1 无校验位
. ?! g4 N* q7 C UARTConfigSetExpClk(SOC_UART_2_REGS, UART_2_FREQ, BAUD_115200,
2 @, u$ m: ^( z9 k! W& v4 ~: ? UART_WORDL_8BITS, UART_OVER_SAMP_RATE_16);
# s9 A5 C7 B6 w$ G0 ~7 n5 v // 使能 UART2
* V* u" ]+ ~, ]4 W0 @; M) _4 U4 C$ b UARTEnable(SOC_UART_2_REGS);
; ]# L2 K8 K: p$ w
$ M: N; A: X( k) | // 使能接收 / 发送 FIFO$ z6 G% W, S. f) u/ h
UARTFIFOEnable(SOC_UART_2_REGS);* M+ H5 x6 Y7 |( [- _
4 ^. v# _5 B. f7 J. F) `8 w& J // 设置 FIFO 级别
- f F" M: h! M+ I/ L$ |* V+ G' t' W UARTFIFOLevelSet(SOC_UART_2_REGS, UART_RX_TRIG_LEVEL_1);; |0 I2 R) M7 R/ C4 q% u
}
. {/ |4 _. J+ f' L4 T* s6 z% I: v( N
/****************************************************************************/% D7 U9 ]* k' |/ @: c7 E, ^
/* */
$ a- l8 G6 M3 K/* UART 中断初始化 */! C0 U, S4 g! d3 K7 R
/* */
% C K7 w7 {/ C- C0 V3 M& T" O/****************************************************************************/
! g/ [' M7 |) R( w! Svoid UARTInterruptInit(void)
) Z; N& }7 c+ I- `$ u9 Q/ g{
- H- @- m' H) H" }% J# | IntRegister(SYS_INT_UARTINT2, UARTIsr);# _# @5 P! ?$ l7 ?; F9 _
IntChannelSet(SYS_INT_UARTINT2, 2);
S X: c/ q; b& b IntSystemEnable(SYS_INT_UARTINT2);! l& E/ R7 g1 q
% |0 i4 Y9 k A' l! q8 B // 使能中断, b( R; J& L4 u
unsigned int intFlags = 0;
* @" f$ I- V J* F: O; A intFlags |= (UART_INT_LINE_STAT | \
' p2 V* V1 B' g" L! `; x UART_INT_TX_EMPTY | \
$ a$ d# U% _" E0 @9 _) P H" C UART_INT_RXDATA_CTI);$ S8 _6 X; m4 b5 Q. |) C J: C
UARTIntEnable(SOC_UART_2_REGS, intFlags);
q2 O3 @0 j1 d4 I9 }# L# b1 F}: S# {! u0 [0 @0 F/ f4 v
2 b8 v; e" R, ~; {* t/****************************************************************************/: [. P1 q! N$ I' T' d4 n
/* */- ]# m& Q$ v4 E/ E7 M4 Z
/* UART 中断服务函数 */0 C2 t, e2 ?( ]0 |3 S8 ?% G
/* */* ? x# U, O: O5 O+ T1 z8 _
/****************************************************************************/
4 ^ {4 e4 g' ~1 n2 rvoid UARTIsr()
" Z' E6 o' s/ c- X$ U' j{$ b; P0 Q/ f8 M
static unsigned int length = sizeof(txArray);
1 v- `7 w: S% l6 N static unsigned int count = 0;. B+ C" h) x! n3 Q# E9 s1 J* _5 ]
unsigned char rxData = 0;; U* ~. ?% W. Q, v9 }
unsigned int int_id = 0;
' S* [ m& D6 ]/ R+ k& R2 t$ U2 i1 \- M$ x1 o* Z" C5 }
// 确定中断源* d3 \5 N, z* C
int_id = UARTIntStatus(SOC_UART_2_REGS);8 ]4 U- k4 V+ `2 m% g$ I
6 d0 E9 p2 R. k. o9 D5 X5 U r; _ // 清除 UART2 系统中断! \& R5 L( U7 _" Z+ M/ ~
IntSystemStatusClear(SYS_INT_UARTINT2);
1 \# N9 \; |3 H
" c/ Y, y0 l |9 u0 u, ^0 D // 发送中断
3 T; x( {$ O) d* L3 E if(UART_INTID_TX_EMPTY == int_id)
* A0 A9 |- V& M" w {3 S* O7 S) e9 g9 m- Z; h2 \
if(0 < length)0 g. y1 J0 f5 S4 \7 K) g
{- V% N' k9 S! X2 P: u9 j3 R
// 写一个字节到 THR
M3 h- U1 x. n/ b UARTCharPutNonBlocking(SOC_UART_2_REGS, txArray[count]);
( Z* d) r1 D: _2 j, T+ I6 R length--;
, C- H& C7 I' |6 @! j count++;
g- X8 W% F1 ?; D; S2 ] }
- f" t) ^7 J0 E4 R if(0 == length)
. a% ?; u+ F) _4 V {/ f1 b: e8 p* ?$ H4 Q9 _
// 禁用发送中断' V ~1 D% y3 o0 x' X
UARTIntDisable(SOC_UART_2_REGS, UART_INT_TX_EMPTY);2 t0 a2 S2 U- h1 H% l
}9 f' [. D+ t5 y4 z' C$ s5 L
}
7 }3 c9 X3 r+ r0 z
! d N4 E0 a5 p4 p3 J! z, Y // 接收中断
2 J$ C1 w/ y- q0 P( G if(UART_INTID_RX_DATA == int_id)3 W3 Q! u% }( e! Q4 O( H) |
{
: }$ b( b! ~& |0 |) I8 h! U) A rxData = UARTCharGetNonBlocking(SOC_UART_2_REGS);
* I- Z7 k5 @1 {) d9 @& ^
0 M1 s z4 x( H5 H9 ?! } H0 Q UARTCharPutNonBlocking(SOC_UART_2_REGS, rxData);
$ e) d/ j9 A& X- ?* S }' @( \4 U3 r0 P+ W: g
' b# O* y9 a6 a: N# f
// 接收错误
- a' I. T4 H) Z/ A4 f if(UART_INTID_RX_LINE_STAT == int_id)" ? P; m" z" }
{8 q3 K t. ` X4 Y8 T- O$ H
while(UARTRxErrorGet(SOC_UART_2_REGS))
0 Z9 d2 L3 a F" R/ o {
) R! O/ v/ f) M8 J9 m // 从 RBR 读一个字节
' D& p; ]! |8 E g UARTCharGetNonBlocking(SOC_UART_2_REGS);
! m; p4 j# T3 M- r( s4 } }
2 u0 c; V* h+ R( L( g Y+ Y, H }+ U$ m3 D3 z7 \; ^
' @1 {$ t# Y: H) u5 l: N8 i
return;: \7 R7 P# K3 K2 V4 ?
}
4 l( O. p& X* B$ z* [0 S; o |
|