|
/****************************************************************************/
7 d2 J% B/ k6 V; F$ _, O/* */! N3 I+ q4 }. @2 _
/* 宏定义 */ |# R& { e) G3 b+ F
/* */
. d' X) p! ^* N/****************************************************************************/7 g& G1 y, O9 x. e
// 软件断点
$ T5 O; w D( ^; B; B#define SW_BREAKPOINT asm(" SWBP 0 ");8 g* F+ i- V: c; n
1 m% j- j" z% F: U8 a
// 时钟分频
- b4 I; w/ z8 X! K) }#define CLOCK_DIV_VAL 2282 N/ l" _% r' u
* ?$ ?4 \- X4 v2 o2 k" }$ F
/****************************************************************************/
* ?6 C4 ^9 x1 u& Z; T/* */: g! V2 B+ V5 E9 W. J
/* 全局变量 */4 D0 J; e M; K+ i8 C4 n
/* */
6 s9 ]+ d% y+ _: A6 ]) C; U( E/****************************************************************************/
% u- M1 l* x( |& G$ TECAPCONTEXT ECAPResult;
' {$ j2 b1 r- x4 e6 W: W/ j# Q1 F0 T: o
/****************************************************************************/* j( z7 x" [0 a* b* Q
/* */, Q; F* ~+ i3 t P1 ^
/* 函数声明 */# S$ W$ s& E5 G1 _) e% X
/* */
( z: Q0 G5 B" S. J% x. b! w/****************************************************************************/+ `: j0 d* ?1 t7 T7 L2 o
// 外设使能配置1 J$ T! A* c9 H$ k' n; d
void PSCInit(void);
8 R4 U0 b# Q( ~- t g0 @5 E. I! J& t$ }
// GPIO 管脚复用配置! c" R+ s0 f2 B" m0 P: ? |
void GPIOBankPinMuxSet();
1 k8 e: m6 i( j, |& {, F F0 S1 g8 r2 {% C! @7 o3 ]
// 产生波形7 U; m4 |" g3 w9 M. |
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); j2 l/ d# i8 [1 m7 p P6 G) j
void ChopperWaveform(void);
* [# u) \* ?' g% m& A* w7 `6 v) k( [" l, @
// ECAP初始化和读函数
7 p# v' F. b* Z# T( }; I9 O% c$ fvoid ECAPInit(void);0 I9 L/ ^. u% w
unsigned int ECAPRead(void);9 J2 Y5 J. _8 S* I. t6 P+ U
4 a! Q4 l9 |# x/ x Q% B+ D
//ARM 中断初始化
" b8 y7 u' U# Q& dvoid InterruptInit(void);! \ B2 {5 k% u6 F
2 Y4 _+ r. e; w+ m- D: K0 `
// PWM 中断初始化
- }- I# I- [; y- i/ s1 Xvoid PWMInterruptInit(void);5 [' J( `$ Q+ H7 O# `( m# V+ t
// 中断服务函数$ a# e# R* v5 w [
// PWM 事件; V# t1 _+ Z# s( l4 d2 K- V
void PWMEventIsr(void);
8 B! v: W1 T f# W7 Y// PWM 错误控制事件, r7 ]5 y+ e6 x: a) N b% M6 p
void PWMTZIsr(void);
3 d6 l% i8 E9 Q# {, l: i
- b' d( {: ?3 f6 S6 m( A, `. G/****************************************************************************/3 u7 W9 k; U8 G/ W! r
/* */5 l* F- {" C0 P! Y! l& j k7 h. W) r
/* 主函数 */
4 N; Y% r$ m2 \. W/* */
/ C& x& b2 i! ]/****************************************************************************/
/ N* ? n8 X) [; M' ]9 `! ]3 g. Nint main(void)
* l, [ e0 w' Z5 V{
( L7 p+ ^3 F S9 v; T4 @- P9 R8 a // 外设使能配置' Y% ]. b7 c* J5 f4 x' G
PSCInit();
7 u) T5 E: K1 `# l. c
7 W7 `8 K3 ^5 N o // 初始化串口终端 使用串口2! v3 ?: _& I | c( v6 `
UARTStdioInit();
8 }& T% y: {/ s . r5 L/ L% y4 x3 \' n
// GPIO 管脚复用配置
( l% M, g; Z* J8 Y8 ^7 H6 r1 V GPIOBankPinMuxSet();
( _( Y4 j9 P: J# b! l0 h$ q% |
- G) q. o8 R4 F$ M& G `+ c0 N // ARM 中断初始化; a* V; U0 j w. K7 c# Y( f5 I
InterruptInit();
8 D' K8 K" M* w: k5 i, L, ?$ n. @+ \* a8 W# }3 j' ]
// PWM 中断初始化
9 [0 H- k$ G6 S, ` PWMInterruptInit();" Z! L' [: p2 M% x
8 x+ O) I5 Q/ C: h unsigned char i;: w* C& V+ r1 L! g( U
unsigned int j;0 e+ R7 L' g! b5 `% B) L
' ~) Q# J' ^2 _, ] UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);0 ~6 `4 C; {$ r; K2 A5 q, b6 n
UARTPuts("------------------------------------------------------------\r\n", -1); l; N! P2 ]: G4 ]8 n% w
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
0 p) w: {5 k; s9 O/ _ // 产生波形; `4 M2 l7 H. B
PWM1ABasic(25000,50);3 z# ~: X7 h0 k$ C6 C
6 B& [/ M, I) P6 R
UARTPuts(" C6748 PWM Test Over!\r\n",-1);/ C% q# R6 i6 e% u3 K I0 j
UARTPuts("------------------------------------------------------------\r\n", -1);& J4 ?& B* d. f @8 J
" S: V( d8 I" F4 p
1 e( `8 M; v" Q* i, X
" _! j q9 q0 Y4 e! ^. ~ UARTPuts("------------------------------------------------------------\r\n", -1);
( f7 I9 X% N0 _ UARTPuts(" C6748 ECAP Test\r\n", -1);/ K9 |! n! _) H" F
// ECAP 捕获初始化 n, W, ?, N, g8 K8 @" R
ECAPInit();1 e: V5 z, b& h1 P. A
UARTPuts("Initialize ECAP.......\r\n",-1);9 p0 _2 A' l' F" G# k, t
for(i=0;i<5;i++)
; v }. E( W# Z9 J+ J. X9 Q* O8 k) j {% G! }5 e$ v+ v0 U" z; R9 A
for(j=0x00FFFFFF;j>0;j--); // 延时! Z, K, E* C! C3 n
ECAPRead();( }! ]! Z P+ {- {
}
' g \8 A, l/ |/ n: Z' U) ] UARTPuts("\r\n",-1);1 \3 g# c& u, U+ @
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);" G" b' _) x: \, f( L
UARTPuts("------------------------------------------------------------\r\n", -1);
|, O; S4 a3 N2 z* O# H, J @) ~( j% n& W6 j
// 主循环
3 O/ R6 k6 o: ~& j8 e9 z for(;;)
4 {: @( m" }0 G, A {
1 a9 h2 Y, ]% e% h6 z
! P! J, p0 m8 C7 c }
% } Q1 F0 e5 d3 O' Y' t9 Z}
0 \) D' V7 X7 O4 x: Q5 X# l- Y1 |* k% b2 j
/****************************************************************************/
/ g4 \0 m% C& `) `% `" B/* */
8 i% q0 T1 k: F' |: B2 ]4 L/* PSC 初始化 */: y) v2 U' n7 O/ e2 @
/* */" P8 }2 M+ o% D: \) m' N
/****************************************************************************/0 Q( u! Y5 j: r7 r6 }2 |/ K
void PSCInit(void)
+ i7 ^# I* h) M- z{8 {/ j, Q, W' z4 [
// 使能 EHRPWM 和 ECAP 模块
- E8 E3 k% u1 n0 i // 对相应外设模块的使能也可以在 BootLoader 中完成1 n; N/ g8 K% O
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ r& _ v1 P6 n# Y$ u- b* f* L PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 O0 u2 }% B% N7 F' ~( \$ e \}; E5 G% r% k. z1 V
5 G; R2 I( s# i# A* j0 _5 q s1 L7 ?/****************************************************************************/
, M! u. V& u' }. _4 y4 N$ I9 h! l/* */
' o- t- f* ]9 i' W% N! \1 g/* GPIO 管脚复用配置 */
" F. D# e$ v" r q: {, X2 x/* */5 L5 l3 \' r, L1 o9 b3 s5 }6 \
/****************************************************************************/% L/ t# u8 {% |4 p9 @
void GPIOBankPinMuxSet(void)
$ n4 j8 k5 @' q+ P9 m! ?% \{
3 X7 D3 P E! C. [ EHRPWM1PinMuxSetup();
8 t/ ]& I6 J) M9 \6 g7 u0 ~
7 ?( f" k9 ^5 x // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)" b4 X! d1 r0 l7 o- g1 l( p2 q& {
// 作为捕获功能时管脚方向为输入- o8 s8 [ g8 |# {+ m( }; ?1 S
// 作为辅助脉宽调制时管脚方向为输出$ b4 E# G- v& ~. _6 c' S
// ECAP2 / APWM2
7 c3 e# A# v# I% r$ Z$ d ECAPPinMuxSetup(2);' P2 q$ `) |/ k: w2 K+ q
3 k3 G3 o `! h
// ECAP2 / APWM2方向设置为输入
2 b, J3 x/ J! h GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
; S7 E" M, W' y1 g}
! Q, V7 _+ ~) l6 E3 ?2 W7 j1 Q/ b; n& Q! [) L3 P
/****************************************************************************/7 A: ^5 J4 `. T5 o
/* */. a w. \! Y# ?
/* PWM 输出波形 */7 E$ h0 t0 K% i- q$ Q* I# B7 i
/* */+ F& N# O, B8 q
/****************************************************************************/
. w) K0 H* u$ w6 H+ ^void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
. g3 ]/ d6 x' s2 Z& g! E4 X{. n8 Q2 C4 t) m. b. V7 J- [0 g
// 时间基准配置
3 _( l6 ]( L& v% s s( I // 时钟配置) W6 U- Q2 q R4 K4 g/ h! e
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);. p4 g, L4 L% o5 D2 L9 H
6 b! U' a) ^( k" @* h s6 S+ D- f
// 配置周期5 f! \9 y) ?, Q* Y. }* @' B
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,- I2 h$ H; X& ?, b7 u
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
# e/ D$ B1 R W8 @
" t% p9 f6 h6 l" x' _! }) ] // 禁用输入同步信号 L( @+ [" R( `
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
" ~0 h% o" X& x9 w, F& P/ T; V' W
+ B1 o2 w) G6 b+ v" w // 禁用输出同步信号
, Q! U0 z" z; @; W& p EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);- O& u- t# a9 \& U9 l
- [: ]* E, x" J4 w# @ // 仿真(DEBUG)模式行为配置* V& a8 j5 o1 j7 B1 B$ L9 D% j' c
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
# M4 o- _% s( L2 }/ Z/ F
2 \; y# @) V4 b4 m+ w // 配置计数比较器子模块( E9 ~& L% X* v% M% x8 P T; _
// 加载比较器 A 值! S% r6 x0 d$ F0 |
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
# K& _' v9 q* o }" p4 ` EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 s @) ^% I* a- y, y4 A% u# M- E
1 B+ Q' L8 B: N9 d! g( [0 m' c0 ~ // 加载比较器 B 值& g% D5 J3 S/ z% d0 z
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,9 R8 |" A; _5 O: w0 K
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 N* a- E9 q9 i2 k3 {/ C& S3 v
7 O4 I9 X' g* @) w; b: B2 ^ // 功能限定配置(输出引脚触发方式设定)
8 Y/ y+ Z+ u: ^ // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
h x4 U' B2 o EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,$ M0 d0 y( `+ R( p, J0 V! A
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,9 }' C1 L1 N( e0 X
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
- g7 D- l$ x; T( `4 ~1 l+ `" Y$ F5 Y2 Y8 b
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
6 U$ h! P% E! d EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
) y( K3 y5 }( s" E0 O5 b$ y! w2 z! P$ G: G0 H8 o' M
// 禁用斩波子模块
1 H/ y3 L( ~7 h( {1 w) P. H EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
( |: A7 V5 y1 W$ h+ z
6 U! z/ Y' l1 f // 禁用错误控制事件3 [/ n! b X8 E4 G! K! J
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
/ D( q' ^- V% x: i6 m- W* [" S EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
7 F5 d* ^4 l9 z7 F1 m# K
/ \9 b8 ]. s+ l: p8 O+ s // 事件触发配置4 Q+ U) _- G0 H j8 X; v
// 每三次事件发生产生中断" F; h h. c$ q9 N+ q
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- K$ Q# ]+ [( f/ n; |2 g4 J // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
( l$ C/ E" ]# }7 l EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);: K* i* X6 X% J) f
// 使能中断
0 E8 w7 ~! `1 k# G* w6 ?: d6 m2 B( A EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);- P% n& K% p' `- N. c; Q
9 e' y. ?% L5 P8 R
// 禁用高精度子模块
: N) G$ _0 g2 Q2 M% T EHRPWMHRDisable(SOC_EHRPWM_1_REGS);# T+ L6 z- i) p- |( ~$ N
r' h7 Y( a1 V/ w4 K9 ~0 T
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
3 Y) w1 _ ~8 }* y# N}+ m' ~# }# {( M, r3 k1 |, Z
4 M; M: }! _1 t( F5 s- x" Z: Z% s! l
void ChopperWaveform(void)
% J) G9 G: [* ]6 V; u9 U{6 ]3 Q1 s% T2 {; g) ^% l1 m
// 50% 占空比
7 v( H1 E7 P. W+ U) \ EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);6 z) e/ ]0 s& k( I- f# V
// 4 分频
2 `" F U: c5 Y' a6 c4 o EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
: O/ ]4 x3 d9 z) a3 s" ^5 s) J I // 单个脉冲宽度9 n8 W4 G' C1 z! _
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
% m$ Y9 m8 f, l/ q8 E. r // 使能斩波子模块- k: I# ] u- [) g* E% X2 b6 Y8 {$ _
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);$ Y1 k5 u% Y! d5 {; B
}
" K: c8 A& J* @# Z3 L
* Q) t! q4 X: s+ E6 L( V$ u/****************************************************************************/' P& S. G' ^+ G7 A2 d
/* */
2 U; [7 K. D2 z1 c* T9 U/* PWM 中断初始化 */3 G$ J+ w$ j* m1 I* h
/* */1 D% P2 p9 Z# M, g6 v
/****************************************************************************/+ V( u- T0 e1 O P. i
void PWMInterruptInit(void). @; G, N2 p9 G. U
{
! s- J, [4 g% F // 注册中断服务函数
# m8 Y; D' c- ^5 k IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
' ~1 c% f) l# E4 R" {7 j! a; s IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);6 z) K1 Q1 e* Y4 V5 S2 \: K
0 C1 j, _+ y* J M$ E6 d
// 映射中断
6 F( G$ `% S/ p6 M+ ? O IntChannelSet(SYS_INT_EHRPWM1, 2);
. C3 c, V; G) G IntChannelSet(SYS_INT_EHRPWM1TZ, 3); v$ f2 B5 M1 A- f; T6 d$ V3 e4 Y
. U9 h. z# r9 r$ L6 z" E! h @
// 使能中断
n5 V5 c1 P. p, R) K0 B" R, A, ] IntSystemEnable(SYS_INT_EHRPWM1);# p( x, N: r7 p! \! @
IntSystemEnable(SYS_INT_EHRPWM1TZ);% ?- W9 n$ Y9 x" S9 w% v
}1 n4 T( @6 u+ z% |% r! S& ^2 K
/ f6 j* q5 {$ P4 W0 i8 e3 Z1 A6 \! v/****************************************************************************/. K9 t- z& G9 E/ w7 F+ k6 \" \$ h& f
/* */; [/ t+ W1 U) F2 ^3 }
/* ARM 中断初始化 */
, y: {) D; v U& G/* */) ?$ m! H9 D1 V
/****************************************************************************/
8 k2 W- q) U0 h2 K, E% }( d! Vvoid InterruptInit(void)
G% V) m( p7 H* O. v{. Z$ s4 n$ E+ |* Q. Z; e6 |
// 初始化 ARM 中断控制器! I$ u2 R1 H9 a2 }" Z, ~
IntAINTCInit();
+ F$ i _/ {& v9 ?# I0 [3 }8 P& U; ~4 p3 k4 `, [
// 使能 IRQ(CPSR)5 a z- J, x( c; g8 H. c
IntMasterIRQEnable();5 a$ m7 J) k4 t% F' @
% s" \" Y4 c6 g$ O$ v1 Q7 e* f. ?& { // 使能中断(AINTC GER)
3 O+ `: W" G6 a; R/ m! q6 v IntGlobalEnable();
* |$ `4 X* ?5 ]9 v+ {
5 f; N# p/ p) N9 y0 |6 B y // 使能中断(AINTC HIER)5 v9 N0 V' i. _, M7 k8 q; w9 u7 j: [
IntIRQEnable();
' E' u1 _/ l4 p! D# a* l; p}
; Q% X) C4 X6 X/ r3 K9 d
4 E/ r4 P9 j! {8 l# o6 R$ } |
|