|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
+ F4 f) Q( e( O Q3 q$ z/* */9 |4 W) I7 ?+ q6 W" |" o
/* 宏定义 */
; {9 l$ M& ?+ Z( I; I: C3 ~0 d/* */8 e6 P. u$ b) ?9 w% ^; I
/****************************************************************************/4 m) T1 N. Z6 [4 K/ j: v7 l
// 软件断点" D: _6 u$ C, x# M. S! b4 S6 Y
#define SW_BREAKPOINT asm(" SWBP 0 ");
5 Z. P' ~; V% a7 m* s! b; H4 p- S6 p+ e! q8 L) O) J8 {
// 时钟分频) C5 g; [$ U% Y0 o
#define CLOCK_DIV_VAL 228% l1 J9 d D+ ~
* ~: |$ \7 K2 o% C l/****************************************************************************/1 x p! T) V! K* i8 ?1 `8 X- G3 c
/* */! a! B0 h. H8 e' c
/* 全局变量 */
+ ` o7 M. I9 Z5 W/* */
; _: A% d9 n7 q* K" c% J/****************************************************************************/
7 A! U7 f6 O; a S- r; ?ECAPCONTEXT ECAPResult;$ u' _/ r, _: p
9 C9 L9 B5 ?; h# y/****************************************************************************/' f+ p2 @; H/ S9 S3 u
/* */
% I7 V& C: c! C4 s. F7 f3 j5 J/* 函数声明 */
6 Y( D9 G- f7 ^7 t9 y/* */. W8 R5 }! W7 H! ^% x4 W! _
/****************************************************************************/9 U( p) t/ g* X7 b% L' @
// 外设使能配置* O* J8 l, n$ D. I% y( b
void PSCInit(void);# f* ]' N2 y4 g3 q. l* ?/ _- ^
3 ^- o& e# W. M9 I4 }" u' V
// GPIO 管脚复用配置
8 C, j7 A: r# |0 t) fvoid GPIOBankPinMuxSet();
! C7 |" Q* L6 q4 ^' }$ m) \$ I" ]- K1 i
// 产生波形
$ c9 x8 z4 d4 Kvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);* _/ c% u3 j8 M
void ChopperWaveform(void);
( F! s4 ]3 H; `' i6 p
1 u9 O, r1 y% x- n* k, h# K f// ECAP初始化和读函数
- H, |2 _% E5 ]2 r6 }+ ^void ECAPInit(void);$ C. f0 {+ p2 r4 O1 R
unsigned int ECAPRead(void);0 N' t" e' m6 _. a
: Y! Y9 b6 Q2 w) _9 n
//ARM 中断初始化7 F( W9 J' I- v8 o) ?1 F
void InterruptInit(void);' F8 k! v1 U6 b$ N5 t# q; R$ d- e
3 G% {# y* d% }, u0 h9 }' D' U, T
// PWM 中断初始化# X$ ^* z, n/ M% P0 {
void PWMInterruptInit(void);
% x& Q' p9 W) v" D5 Y// 中断服务函数
$ |4 f& J* N* \) U. z% X// PWM 事件/ p$ b2 M; \' [$ `
void PWMEventIsr(void);
7 k: g4 y5 u. F// PWM 错误控制事件; `( j d: M; C
void PWMTZIsr(void);
8 W7 e' M4 @; K6 s) \: ]4 D: C4 D( X, l. W& S
/****************************************************************************/* G; z/ l1 {% O3 ~: @6 W& B# A2 w
/* */, r; s, E" E t6 k, a: O
/* 主函数 */ U5 ]( P2 w b0 e6 B& U
/* */
" A3 v: u5 K _/****************************************************************************/
# V' v* v1 d! r- T- Nint main(void)
+ u$ V! b5 e6 q. s- S1 g; t1 h{2 J1 N# g& h% G: y+ p! ]
// 外设使能配置
7 t' q. `/ f$ p- V- i PSCInit();# J0 w# ?1 p$ V( R9 K
! u& F0 p' E% s4 l, q) [5 D) T
// 初始化串口终端 使用串口2/ d( p" N; |0 C5 ]$ }" |- L. F
UARTStdioInit();5 ?9 j4 ]9 k4 a2 M; e
" |( h0 _$ g. g/ ]0 l // GPIO 管脚复用配置" A2 J K( Z T) i
GPIOBankPinMuxSet();. m2 x6 {& A" r/ E
2 n2 o/ j8 W5 ?$ b
// ARM 中断初始化6 ^ z5 T# D. m( T9 n7 D
InterruptInit();
% f# }9 D, }1 _/ H2 Q1 f" [& w& k; n; D1 \! ]; D
// PWM 中断初始化* V1 P, W% ] H: B5 p( l- D
PWMInterruptInit();
: j2 V) I7 E; O1 A B8 u Y7 L# e" z+ F, ?) N* {, ~
unsigned char i;
4 ~3 V# r% \4 u" B- G6 K$ M& F: a unsigned int j;7 Q5 E0 G1 X: p6 \( G
7 W/ n+ m( c0 D+ F ` g UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);' B' V5 m! ?( }
UARTPuts("------------------------------------------------------------\r\n", -1);8 @1 N' {3 V. S6 @4 T
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
8 [! d9 Q; o3 ]/ [7 b4 O // 产生波形7 V! p( O D0 R) D3 h1 m
PWM1ABasic(25000,50);
, p! u% k) Q( k3 j; F4 f. }+ m
: }! {3 w5 H/ _/ s1 _; e3 _ UARTPuts(" C6748 PWM Test Over!\r\n",-1);
$ b' f1 o: ^/ O. e UARTPuts("------------------------------------------------------------\r\n", -1);& ]% \7 z$ b& I6 L+ _+ N
3 I g4 A/ _) @0 x2 d# c5 q ?) A
! a5 H5 H% t( x7 e! K
" |. W6 Z5 Z3 Q+ Y6 P
UARTPuts("------------------------------------------------------------\r\n", -1);# L$ I9 c- a* V4 B
UARTPuts(" C6748 ECAP Test\r\n", -1); l# r5 \$ E# j( t! Z ~; x
// ECAP 捕获初始化
$ b$ Y1 o# \) ?0 t( N& J ECAPInit();" ] u( d' ^: t/ v! R
UARTPuts("Initialize ECAP.......\r\n",-1); E1 _6 A% s4 W1 z
for(i=0;i<5;i++)
/ P5 [4 v$ a' C/ _; m4 s. K" b {$ Y3 k( h/ Y u% R* d: x5 y
for(j=0x00FFFFFF;j>0;j--); // 延时
! n3 d8 P/ t* n ECAPRead();4 A7 _* G, w: i; z" u" z
}
! n- @. R2 G1 E. r! U UARTPuts("\r\n",-1);
m1 c9 V8 K$ \( d6 h6 s' ] X UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
: B' w% B" H; h+ } X4 a/ [ UARTPuts("------------------------------------------------------------\r\n", -1);- ~) P. N5 T- b S# e- v5 L
4 R+ }( h1 h1 v* S/ c* ]8 R // 主循环
. `* x6 I2 k: L for(;;)7 X6 u, \# c3 ^8 k M; x- C3 M. N0 k
{
0 B" s9 a# x9 f; k9 Z% a! @% j
, j1 V T$ O4 o; }3 N }$ `7 m2 C3 O* y9 \, S; e( ]
}) _) F. `. [7 x
% \/ B! Y& Y/ ^$ h$ Z) h6 ]/****************************************************************************/5 @5 ?/ a8 H3 j% s& G
/* */
* P6 C ^$ [. V- n/* PSC 初始化 */
* N2 q. R; _, _! \, v- j/* */
, q+ c H9 u, {/ l/****************************************************************************/! t* P# _7 s' w' I
void PSCInit(void)
( [1 G W9 L5 E R Q{
1 E; b. ?# _3 h- K // 使能 EHRPWM 和 ECAP 模块
+ T* a& Q) h7 i2 ]" M" A, q // 对相应外设模块的使能也可以在 BootLoader 中完成
) ]) p8 t) z' h4 i8 R0 q PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
S. g$ p6 E0 P' S5 B PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 n6 {9 i/ C4 r, Y5 ]. B9 [2 W6 q}
" z3 M' p. q) J+ H! E8 P
; ^- @) ]3 L- F! N2 e/****************************************************************************/
$ u( H, m1 K; m ]$ E- O+ W/* */! S( H6 W0 C% A' a3 O
/* GPIO 管脚复用配置 */
" Z) l% u! I2 T6 g8 A1 S- w3 W0 F/* */5 M0 F: O: E; W$ A) l
/****************************************************************************/
+ j. R) C! s t' U) b" G& pvoid GPIOBankPinMuxSet(void)' E0 F7 N6 A' [! e( {
{
@" S8 G; c7 B% o6 z7 s EHRPWM1PinMuxSetup();
" e; [6 P1 E4 d1 X6 C0 p' R$ z& Q3 v* {5 y/ y; P% b
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
5 M. z) K: R5 r6 k+ y$ Y // 作为捕获功能时管脚方向为输入9 d+ O) f, J" R8 h, g4 W
// 作为辅助脉宽调制时管脚方向为输出4 t9 I' g) E8 l
// ECAP2 / APWM20 Y! G) H4 _- h% o8 ^
ECAPPinMuxSetup(2);2 ^( H) U$ O2 x2 B. A& q% m
# l! O j, N& E+ j' E; ?+ k) Q
// ECAP2 / APWM2方向设置为输入
' J- @+ N: E/ e7 A- C7 z! W GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
) X3 `" l8 E: k1 x}; A8 U( _! A9 O) S
/ X! x/ x/ a0 O3 b+ ]2 ^: V) M/****************************************************************************/ X% i" }# Z# z5 k
/* */0 U0 K/ [: g6 S$ q2 O* a4 o* g$ Q
/* PWM 输出波形 */
( B8 a; u8 d1 r- s' M( |& ?% L/ T/* */- C7 W- L8 F6 U. t$ U
/****************************************************************************/
W% T* [9 B ~+ X) p+ R& d# yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio) D* l# H7 J3 I B: t2 N
{
3 e6 e" H+ Q' ~0 }7 Q v! G" n) k // 时间基准配置8 l6 @# d X) G1 _4 }
// 时钟配置
- K! j' ]6 y5 h N) d. X3 E% F. V EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
8 Q( x6 h. ?3 \7 o" J _4 ~" q2 B$ H, |& z
// 配置周期
! R( h3 l3 q8 p: d0 L0 I EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL," S; y% } M; r# E
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
0 K, M6 d1 K, n1 a' o4 W8 w3 r7 H/ y
// 禁用输入同步信号
% ~8 u- M7 [2 s; ?! } EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
' G4 n; M; P! k' Q2 S
- |6 s" p. u# C- |1 Z* ?8 L // 禁用输出同步信号
& R7 E3 r% g. h5 w* _7 A2 s EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);% B+ l* b9 D( F+ p
! h* G, E8 u2 R // 仿真(DEBUG)模式行为配置& f6 e3 e! s! x# T" s4 G
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( v1 X2 X6 ]& T+ U9 X! A% m0 R' l0 u
, `* k c9 V( F! S7 p- J // 配置计数比较器子模块
) Z& D# t8 W7 ~1 {" M, T' w9 k3 V // 加载比较器 A 值
! B+ W) ~) T) i# b EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,/ h7 j+ e1 M/ \2 Y* P
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) x* t$ z6 [1 ?+ {' E: C) M# m8 K5 J. p
// 加载比较器 B 值3 v1 ^; Y m5 e1 M7 `) Z5 Y/ D+ j6 o
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
4 r, d( b+ U/ N$ i: V1 V EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# d$ D: e* M' D$ B/ [3 j- U3 r- M9 m& `- Z# w2 z/ G
// 功能限定配置(输出引脚触发方式设定)0 A* V; d6 U. G# n0 F- w7 @0 }" w
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
$ F' K# y* D! F4 g8 q EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
$ X5 R+ ~, z1 F" w$ e, M" ?' K EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
! y V( D- e4 l6 Y3 j EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 Z, G' X+ f1 |
0 N2 E k) Q% ~% x, M // 禁用(旁路,信号直接输出到斩波子模块)死区模块0 [+ b( ?; G4 B5 {$ B! B3 A
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);7 T5 j/ M6 f* x9 k. m
+ H8 E3 ?5 q# C
// 禁用斩波子模块5 u( _5 w3 R u
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
1 k4 Q, |- y x* s, ^3 a* @6 k. H1 N0 M
// 禁用错误控制事件
# G+ \ ?. L% `4 ~+ k2 I EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
/ l3 d7 x) F2 Z4 c EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);! `8 z) ?8 M6 ]+ s! I7 g. ?4 f- l
4 Y, c, C& U$ b& s2 ?4 e4 o // 事件触发配置
m: u. P ~8 m* \3 L // 每三次事件发生产生中断, q0 l1 Q0 g( y4 x8 j0 N3 C
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
. c3 M( m, G/ d! D3 ]2 c // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
. }% l5 d' u8 I+ d+ S y2 y EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);( ?1 ]3 t0 C$ P5 }$ \! R
// 使能中断2 ]3 c c5 d6 s" J1 v
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
2 f0 Q4 n5 |8 U2 S9 m, P5 ^ w! V. D1 L7 K
// 禁用高精度子模块
# T$ U* ^3 \, g- i5 u EHRPWMHRDisable(SOC_EHRPWM_1_REGS);, S8 J$ C. Q, i& s) R
m* t+ d# U% p: @
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
) n' R! b/ P* M0 F& O}
* d6 t/ [/ U7 @1 t0 o; K! G0 M8 c# q) d; G9 h+ C4 w7 o
void ChopperWaveform(void); h( }" _- _- x9 w
{# v0 f8 c0 Q: h8 H6 P! s8 p. H
// 50% 占空比
7 K: ~2 j, c1 U" ?% w; Y8 Z% @1 q EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);' K1 R4 M9 {* F4 R; F
// 4 分频
* P- `' p# r' n, ] EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
! j R2 d7 p8 E% D! _2 r // 单个脉冲宽度
/ }6 I' C* s" d8 Z% }+ { EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
5 E; ^9 V5 G; L2 w# c! m, L) T // 使能斩波子模块
1 w- ?0 W* V2 a- \ EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
" W- e# m1 a5 G}7 f. y# z' }6 v9 d6 ^5 U* G
1 J3 P5 I" |4 B. C
/****************************************************************************/
* a( b; `- ^1 X5 C: w" g1 s1 g/* */7 e* t8 c7 Z5 f. Z# T7 [5 X
/* PWM 中断初始化 */8 G& R) P9 @, l6 I* p, c" d
/* */
& q( u1 z3 j7 x4 S% R: a6 D/****************************************************************************/
: W( K/ G* h' o( j5 avoid PWMInterruptInit(void)9 E3 t& K2 b3 Z. N; Q7 L
{# m; d- I1 G/ f
// 注册中断服务函数- o: V; q; B6 p# Z
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
- c: F7 z& [8 f' O) t @! h) } IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);9 _4 E% e- T1 C) j
2 V8 d! X3 \! J& J: @& E2 ?
// 映射中断
Y, U" R5 i9 Z IntChannelSet(SYS_INT_EHRPWM1, 2);
" l% \+ k2 {: K' A$ S6 q# P IntChannelSet(SYS_INT_EHRPWM1TZ, 3);) [3 g- q6 c1 M) T: a0 @
5 p' B0 H) C) N7 F; z // 使能中断
' n3 X. h% K8 O7 i IntSystemEnable(SYS_INT_EHRPWM1);
' ^7 L4 M5 A+ @7 x1 q7 v+ u IntSystemEnable(SYS_INT_EHRPWM1TZ);9 l* y W$ R1 p
}% L# u8 t8 ?- T) L ^9 c8 m* Q
: \9 x; [4 D& l$ R; c( R; U
/****************************************************************************/0 ]+ S+ I, m' c; b2 G, g& G
/* */
+ F) w$ K' w9 g l' M( X) g/* ARM 中断初始化 */9 ~4 W: ~+ B6 I# p; y" X
/* */9 f& P7 v; X% P, g" C p
/****************************************************************************/
7 r. p5 m+ @1 Yvoid InterruptInit(void)9 u7 `5 z8 m& K2 m) E# V$ ?
{
8 \% Y' t) P n6 o i // 初始化 ARM 中断控制器$ v9 _# X/ p0 Z ]
IntAINTCInit();5 w! H1 t: k. Q& R
) a! z1 \( W5 H ^
// 使能 IRQ(CPSR)) t' @- d7 M) P$ ~ t( U8 l
IntMasterIRQEnable();
/ { e$ c4 y9 {4 V1 B |+ c5 G9 Y" g% q( {" ?; D6 P* J
// 使能中断(AINTC GER)
0 \& e3 p. d# `7 ? IntGlobalEnable();3 d% h: ~. ]9 U: `+ ^! |1 S
, I7 r3 ~5 O) P) V. K4 f# |) M3 W4 c // 使能中断(AINTC HIER)
( Z7 ^$ C8 E% G: J IntIRQEnable();, p6 y5 U/ r: K4 X2 b
}3 V5 Z) D" U2 l6 ~) T' T
: _& U+ e( c3 k# g t5 g |
|