|
/****************************************************************************/# {- j) ]7 L' B+ U- i
/* */! ~) [8 o/ a5 N# B: H2 G
/* 宏定义 */, x( v) f) z! M& L; e- Z7 y
/* */
~) X& G$ f- _ f8 y4 c/ D: d/****************************************************************************/
9 a1 p' Z* r- r! |, S3 f9 e ?0 ~// 软件断点
! q2 k) E7 n i% v2 Q) ^4 H8 _) K d* T#define SW_BREAKPOINT asm(" SWBP 0 ");/ W- ~- _ Y& ? V, ~ |
: u! J* o9 m ?$ D# |. j. ?
// 时钟分频
) [8 a0 }4 l; }#define CLOCK_DIV_VAL 228
0 S# k5 B5 F$ s1 e3 x9 z
, ~- f% X9 L) [: V. i7 V4 a/****************************************************************************/, m a& U- Z8 h! X0 r; J
/* */0 }/ ]- ]0 @. `/ ? P
/* 全局变量 */
# k3 o3 `# g9 ?2 H. i0 a2 S4 B/* */8 M( D$ V& T1 N7 F
/****************************************************************************/" b) k6 ^" ~+ ~% w
ECAPCONTEXT ECAPResult;
! s3 u4 M8 m- q( G! _' k8 W! \7 v+ F @; `+ l8 n) P
/****************************************************************************/
& J4 d; O# ^' M- E- P, J/* */
2 |' ~' ?, b2 i2 N# J/* 函数声明 */
3 h& m, L% k9 L/* */# m2 e3 _8 @) a9 ~
/****************************************************************************/
@, m- R) U w2 x3 f, P, F// 外设使能配置- k% N d3 ?4 Z2 a2 l7 p- r, Q
void PSCInit(void);7 w# y0 f5 x) d: u( Y9 ~! w( @
6 C7 s" l H- z8 {. @& q& l// GPIO 管脚复用配置: \0 l; V9 J- N6 G; I7 ?* d
void GPIOBankPinMuxSet();2 n& _ v6 k/ @5 [6 E
- }+ ^( ^' T. F& }7 K7 t
// 产生波形' Q/ U: x' W$ w# {. @: o- b! ~
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);' a8 T/ f% x% V/ f1 |# R
void ChopperWaveform(void);
" v9 O& N# O2 E# I- N1 d
5 X1 M4 o1 y" S/ E* o// ECAP初始化和读函数
6 m7 r& m2 L; t: w1 k: m* yvoid ECAPInit(void);/ n N% O: B6 i: E
unsigned int ECAPRead(void);4 {0 s# |5 K3 @ d. }+ X/ d: [
, J+ k; u1 p; s4 t
//ARM 中断初始化
6 ~8 A* U( S7 Avoid InterruptInit(void);
/ K; O9 i+ n: C8 I3 F) Q7 Q" c5 j& K
$ l- V1 F/ O- u! w$ c1 q! l// PWM 中断初始化
) x% c: n5 a7 Y. J& }! b* q& nvoid PWMInterruptInit(void);4 J% [8 ?: r; [& R: C4 V
// 中断服务函数
! k% n% l' l( J// PWM 事件, l. p c# \8 Y; a5 U8 R4 D
void PWMEventIsr(void);
3 S/ C) `2 ]$ {' X1 Y2 k; G// PWM 错误控制事件
1 e* r( H) }% o. q, Hvoid PWMTZIsr(void);
: t% z$ K& r) G( |+ A+ i3 I: O
* x7 ^/ }& e9 w% `/****************************************************************************/ ^. T) f2 X: i, C4 q% Q: E3 w
/* */
/ M2 s: U9 h1 w/* 主函数 */
. c( T- U* @/ j6 |! e2 i6 i/* */% E0 {3 ~' U8 V$ @8 l; ~6 B
/****************************************************************************/' L, f! x% N" C/ u: v* l( [. j5 y
int main(void)
: e& B1 x' t) Y2 H$ N{1 {& j7 o1 O, c/ G( H& ~) [4 p
// 外设使能配置
! G7 m$ ]( T9 @ PSCInit();
* Z- E* q2 ]9 ]5 m# o4 T* M6 F& _
// 初始化串口终端 使用串口2$ `! i+ j5 C s
UARTStdioInit();
E; Y" \" K% o7 }9 }# w
, i8 j% s* t0 J5 }3 }& P' w // GPIO 管脚复用配置% H$ l& J- E6 J" ?
GPIOBankPinMuxSet();
2 q( [2 k) M4 i% K# V
+ k! s) k! }+ h, Y. f // ARM 中断初始化
, I+ k7 L/ X8 M7 B+ A) k* V3 V InterruptInit();
, y8 O C8 u% C& M0 N/ X4 ]- |; R
; k: Q, |* Q8 e) L0 r // PWM 中断初始化
6 P+ m5 P% F% @6 z PWMInterruptInit();* t1 i5 H/ o$ e* u& ?" a& i
5 J/ B1 P: F9 [* | F8 ^
unsigned char i;! u* p( d7 d$ |3 O
unsigned int j;" t3 b& D4 [; ^
" p; S: m6 Q% I; x
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
^! C: c. K' O9 p6 h UARTPuts("------------------------------------------------------------\r\n", -1);% O! w% @# O. L% ]* @# f
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
# h% A2 x: T% J' f7 w // 产生波形
( E+ F2 j5 U& E: n P PWM1ABasic(25000,50);9 x) z9 Q! f9 R# @0 Z
- M6 `1 H* a3 ~( e Z
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
. f7 p) Q4 q% M/ e, S) m UARTPuts("------------------------------------------------------------\r\n", -1);
8 u) T$ l. A6 I0 E( h; t5 r! H U7 [( I8 T! v! g1 r
/ [& ^8 f3 Z4 S
+ Z0 L6 L# `0 r9 O" o1 _
UARTPuts("------------------------------------------------------------\r\n", -1);
5 I3 G6 m$ t: L; `% N0 |' f- G UARTPuts(" C6748 ECAP Test\r\n", -1);
% H( R3 \5 R$ t/ O // ECAP 捕获初始化
k5 d6 u0 o4 Y9 ~$ P/ c) V7 n! S4 R* l ECAPInit();
2 ]% U" c2 H! X" Q UARTPuts("Initialize ECAP.......\r\n",-1);/ f4 A! O1 y! t# T: y0 \9 G' a
for(i=0;i<5;i++)
y+ R5 r$ E$ q {- O6 o P& }. R3 v
for(j=0x00FFFFFF;j>0;j--); // 延时- M# R) x7 ]8 |- r/ S' ]) S
ECAPRead(); u0 I: B1 j, E; d" U* E- c
}, A) @# l& X, r: [1 f
UARTPuts("\r\n",-1);
) i& w8 s% r C2 g6 I UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
) D7 T; ~+ M3 m( J UARTPuts("------------------------------------------------------------\r\n", -1);$ w* M4 [( K, V/ X' {$ ]
6 U1 F* c0 ^& E4 i4 Y* y
// 主循环
: }* z! s+ _; c0 S& V C) @9 ~ for(;;)
% J$ [& y( @. Q' T5 Q4 m/ Y4 a1 u {
( `) x% g5 L- b, s1 o$ O/ x& k6 a A! Y6 l0 `! H: q( r
}' I% f/ M+ }! l- p
}
" n1 {- s% I) H2 y# F% r' q. w! f; ^% i. K( `6 Z; ]
/****************************************************************************/1 B* a8 p: u+ s; A% B5 h' M8 a2 N$ s9 z
/* */* u( Q4 y: X+ s
/* PSC 初始化 */
& M/ q) q: |# } t0 E& T/* */- f0 G' Q7 _/ K
/****************************************************************************/
' e/ J! R) ]/ z1 V7 }% {void PSCInit(void)
$ `; M. G5 U3 W{
5 T8 R$ R) |; O // 使能 EHRPWM 和 ECAP 模块; _7 s' c# c4 X4 T
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 E6 D" d9 v0 U3 }+ y/ \ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);: y d w7 B1 _. Z8 Z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- \% D; |0 d6 \3 ~. H h}. N5 c! M5 Z+ ~- h' B+ [9 V& U
# R$ Z+ p7 m, q+ [) _
/****************************************************************************/8 I8 R! `. M. V7 B' E
/* */
* U) b8 ]" i8 g+ |/* GPIO 管脚复用配置 */
3 X- [5 W! F+ O/* */
" ^+ Y8 H4 {; A' c% {* f0 [/ u/****************************************************************************/
9 t! O" o* U$ mvoid GPIOBankPinMuxSet(void)
4 W- T3 Q3 T: ^3 e3 p4 a% F{3 D3 v6 x+ b) R2 c: u$ p' a5 s, x
EHRPWM1PinMuxSetup();. s+ L: E0 o8 b- m4 \- N2 `9 b3 ~
* |: E- S" K! o7 }# x$ ~2 _
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP): j& ]- E; g# _) p# p* x9 W
// 作为捕获功能时管脚方向为输入6 X, k+ }* a5 r; Q' c; h4 {5 H
// 作为辅助脉宽调制时管脚方向为输出1 L" ^8 u# R) l- l3 D3 l
// ECAP2 / APWM2
1 Z$ ]* ?: U ~& ~% A6 M4 _ ECAPPinMuxSetup(2);
+ K. \+ A8 D. B j9 Y; ?0 \+ q0 b: _# A: Y' `0 }
// ECAP2 / APWM2方向设置为输入
+ r1 @5 h2 L5 P4 r: n( q5 ^. _ GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]5 X# B0 S, C2 g- k; A
}
9 Y; F# P) @& T4 p: t3 z; E L w2 f3 D" Q/ u
/****************************************************************************/1 Z5 V% w- `% \& V' L1 s6 O0 a/ g
/* */
! D- L+ l( t* z+ D$ A' C- }, l/* PWM 输出波形 */: E5 T+ n$ f+ X' m
/* */
- @- l6 b" a1 k3 A( C4 Z7 a/****************************************************************************/
( I+ Q; J. D( e! W5 ivoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
3 c+ \) ]+ [. {! {/ u) [{0 z: u# A z1 y1 C
// 时间基准配置
' l0 h& @ {/ k5 E! E$ k // 时钟配置+ \" h/ G4 r/ N5 E, l* j0 _4 a5 _
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);( u' m0 s5 f! P" Q/ u8 z3 ]1 `
0 K) e B2 w+ S
// 配置周期) e z+ Y# P) {4 y l
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,; H" ]9 T: f! h! B& s' d d4 w! W
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
3 [; S+ r- V+ x9 I( Q8 Q- a3 [: I) v
* l/ W4 Y' G) ] // 禁用输入同步信号* L3 i$ b# R5 o% e
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
# ^) ?) X* {* X3 |- J( v# B" l. [) W8 U2 p' h; m$ i; K
// 禁用输出同步信号
; H$ f2 S3 y' p* j; x# e5 q- ` EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
@3 [* l! p5 C4 ~8 g
! U9 {/ A7 V6 u0 s; \ // 仿真(DEBUG)模式行为配置
/ r( s: v. G8 D H) s EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
6 Q% ^& e! L. [0 C; h: u
- s* c8 }% {- y7 \0 E // 配置计数比较器子模块 a6 ~, l q* y, A
// 加载比较器 A 值& i. D1 c( g- x6 a! @3 A
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
4 x d) c8 Z) o: B5 l& d' Y% s EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);3 t: R+ G' J8 G% X& s8 ^, x& ~
) T8 }: {5 Z, u6 q- \9 L, T4 k& h // 加载比较器 B 值' a! ?3 y0 ~$ r( u8 V A* \
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,7 x$ A$ d4 \( _4 p _6 d* Z
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
W9 j0 T2 k! N6 ^% c9 r% T
+ Q2 _& C' S5 r, [6 ?; i$ _ // 功能限定配置(输出引脚触发方式设定)
( p* L+ G' N% n' i // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出! d; P' t) |6 a, t$ c8 T$ v
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,) L7 _/ m. U8 }( s
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,; v# }1 v) X' i
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
/ y5 e4 T8 P; S2 t
: p4 Y Y6 U6 [9 u1 r // 禁用(旁路,信号直接输出到斩波子模块)死区模块5 y$ w. T7 A& W8 K
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);( r% ~7 J9 X. X% \
$ I9 h6 p x. Z+ q8 z
// 禁用斩波子模块
. ]' Y* Q( s$ F7 n' s EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);9 [6 h6 u* Y# ]
) o# j5 S6 w/ u$ e1 N // 禁用错误控制事件3 S: M$ a* q! ^
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);8 b# z* @7 } ~
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
2 R% B, {6 B+ V( d: o; \
1 e$ R# C# q) _3 C; V$ d Z // 事件触发配置2 }; T! W) G; s- b+ F2 }
// 每三次事件发生产生中断
1 U, ^+ L" X& r1 B0 D EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);2 f' @8 i F: M. r9 e- i
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
$ D' U4 T4 b5 R. o+ e2 \ EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);' h6 i- `3 d) f$ r3 v
// 使能中断3 w2 F+ k9 L+ @1 y
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
7 K6 j9 @3 F, ]3 X) ^- w: u
1 n2 x* N6 n7 X$ j // 禁用高精度子模块6 n" s" k: M% ^7 ?9 p
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
/ ] e4 }8 v# o9 g: I
& C, y8 k7 n+ c, N UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
. ]8 {( p4 D; @' C}
2 W# ~% Z+ k# V' z" e0 F8 t: t3 C
void ChopperWaveform(void)
. \; D# T) I# T1 o{" c3 j6 n4 a1 k! X' V
// 50% 占空比
9 I) q. h1 t- k EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
~0 |# a5 w, \/ C4 @8 @ // 4 分频6 ]. [" ?$ `0 i7 c
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
/ R P" i* o& O // 单个脉冲宽度$ U4 p7 T* i" N: O+ d0 |* X
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
# M$ Z8 S, `0 y0 q; H4 @4 ~, I // 使能斩波子模块! O+ r/ |+ K1 G) O. M+ O$ K' F+ F
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
8 e1 _9 h( k! s' D( o}
* G3 |5 l, \( g7 N* _2 m3 \
' {- c& G1 H6 `+ S" N/****************************************************************************/
) ` ~* b! L& p1 Z K7 p/* */
) b. g* g" q5 [/* PWM 中断初始化 */
' y$ N }0 h! Z2 @4 U/ C/* */
0 l% k) ^+ k% M2 C* W% [, h2 {6 H8 k' u/****************************************************************************/& ?+ p" ~9 s: D7 U2 e8 |. ?% U
void PWMInterruptInit(void)
* @% H/ ~% a6 O+ r/ L/ \{
" r) R. N& K; d/ |2 { // 注册中断服务函数
: d: `7 u9 V" b& I5 p IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);- m; p9 z$ ^3 K* D
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);* ~9 S: Z1 ^. l) Y
0 u/ Q4 x( b/ O3 h3 I% u b // 映射中断
+ F7 I! T$ W% {: x5 P IntChannelSet(SYS_INT_EHRPWM1, 2);+ g# U$ f. I+ ]# L2 q
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);( k9 N# k5 S9 A- @
/ _; D4 s" l- v, W* c0 t* a& k# | // 使能中断
7 Z) y9 ^( _. I' X3 K7 [ IntSystemEnable(SYS_INT_EHRPWM1);2 j- R$ Z1 h8 z+ M0 ~1 n$ t" D
IntSystemEnable(SYS_INT_EHRPWM1TZ);% a2 X" r* K2 v1 k/ i% G0 M/ Q: F
}" M7 q7 H. o# X \1 F% y) P) r
/ y. V$ S/ [. m7 u/****************************************************************************/* _: h1 g9 d) m$ S1 q1 d! y
/* */6 i7 z6 F2 ^# f: _/ s7 {4 t
/* ARM 中断初始化 */( [1 }8 p- G- G+ [& v7 [/ U
/* */6 i) n) x3 \; R" r! o) B7 o
/****************************************************************************/
9 H- b: H/ |. q8 n; hvoid InterruptInit(void)6 V& {( N6 n( R- C+ [$ M* p
{. u: a- @. I" n9 q
// 初始化 ARM 中断控制器
8 n" m( s% x/ d' }2 D IntAINTCInit();* i$ S" G3 o \, `
& l* a8 K: e$ p s
// 使能 IRQ(CPSR)
9 B* m, o) S, r7 m- f; A; H IntMasterIRQEnable();7 H! _* G, U' U( ~
( r2 M, N5 Z' h& V l B // 使能中断(AINTC GER)
: `9 c# M) K) F/ `3 j6 u4 C IntGlobalEnable();/ f: A$ H; Z0 C
3 `' l& i$ F# f! W+ R
// 使能中断(AINTC HIER)
2 k9 u" O+ g. P: p1 B$ X5 p/ d IntIRQEnable();" C7 N2 v$ m$ N4 J# u% Z
}' K+ V6 V5 P; {
! r6 u. R2 F6 ^1 J! g2 h# |, x |
|