/ [; F0 Q- N) h, y( J, o// GPIO 管脚复用配置 ; s J/ ^, R3 V4 S9 c' ~9 Lvoid GPIOBankPinMuxSet();8 ^& W6 p) j# t" S Q; R% l
/ q7 l: H$ z; j1 }, q8 N
// 产生波形$ @- U6 v0 {( f! h5 M
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); 6 |- D- b5 \7 J" S, r$ l! z$ ?, zvoid ChopperWaveform(void);+ w V6 P% ^( q! G
& T/ A. x" C. t ]! }$ p// ECAP初始化和读函数! V( X* ?+ k# u! b
void ECAPInit(void);9 r: f7 m, J. T
unsigned int ECAPRead(void); " y L8 s6 Y" K3 ~ 8 A& K- i a) {- t1 u//ARM 中断初始化! @9 M T% U/ d: j2 P+ B _# S6 |
void InterruptInit(void);: S- e4 u8 d1 D
: f) z. V7 Q$ O8 s) F" ]' q# B" x8 O0 v4 M// PWM 中断初始化 / a3 X9 T% ?% R3 |8 svoid PWMInterruptInit(void); 2 K# }" \1 c$ K% m1 O5 W: V// 中断服务函数 1 [! M( z$ e# |& I- f// PWM 事件 % j! M0 V8 B5 |$ x) k; ~void PWMEventIsr(void);, w6 w4 g3 b9 j# L% {" o
// PWM 错误控制事件 2 u: N6 v" @3 Y; ?1 ^' wvoid PWMTZIsr(void);, ]; a' Z8 z3 }9 ?
J) J5 C+ F3 P' F% H
/****************************************************************************/0 h. U8 d0 N3 u) p
/* */ V7 g w$ a# k8 p, I! c
/* 主函数 */) F; p0 N7 R. {
/* */5 P6 ], Y- {. F$ B1 s# u8 r
/****************************************************************************/ - K% n& M- ~0 `2 ?int main(void) 7 M% J5 }3 ^" B# a" B{ * B3 |/ l( K5 F // 外设使能配置 3 N# T/ ?7 r# e' o( k PSCInit(); 8 h# K6 H u. S. F9 ?2 Z" A2 B 8 [$ w, T) x" D+ \4 g& W7 O // 初始化串口终端 使用串口2 7 ] E0 O$ D( U6 i& x$ ~ UARTStdioInit(); : }" l- j! F) } 7 [4 \9 I# Y8 B% m- x // GPIO 管脚复用配置 1 O5 j, K6 ~0 d! K& F4 S% a' p GPIOBankPinMuxSet(); v9 u6 a3 J; a6 Z
( ^# I' v: [) g9 Z7 O; M
// ARM 中断初始化 " `0 g4 E- \' s4 x InterruptInit();& i6 e5 m2 j: p5 K7 y" k
% B8 p' Z7 {) _5 c) J3 X! v: u4 f/ J // PWM 中断初始化% m* v5 j& d3 j1 z, e7 }* P
PWMInterruptInit(); & B) h7 N# m- t- i- h1 [# @0 b" L3 k2 d+ [
unsigned char i;. w5 x" W7 d+ t: s1 u: w& a4 [
unsigned int j; ( X! F" x, a3 W+ g. E4 j7 b 2 b0 X/ I1 R: |/ J6 B* Y UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1); ' O7 I Q5 R! K. O; e UARTPuts("------------------------------------------------------------\r\n", -1); 0 `4 A8 w6 J- F* S5 u2 d UARTPuts(" C6748 PWM Test\r\n\r\n", -1); " }( Y- V. l9 K( L' b% r; }$ n // 产生波形( o& O! X! P8 N2 ~4 j
PWM1ABasic(25000,50);- m9 X: b7 Q2 ]4 c. U4 V @4 ?) M1 j
5 n4 t7 e- e/ Z Z( }
UARTPuts(" C6748 PWM Test Over!\r\n",-1); - b% Q# z' C4 i6 N. _$ P9 k UARTPuts("------------------------------------------------------------\r\n", -1); & l+ r7 }. T: R 1 u0 Z- v& ~. ?5 X$ T' Y9 e) S : _5 r; @: r7 {8 V' y 4 q. P% w' h7 t3 A6 c UARTPuts("------------------------------------------------------------\r\n", -1);' Y; P; L0 ?3 O
UARTPuts(" C6748 ECAP Test\r\n", -1); 8 M5 ^! m. z- B) R3 O$ s // ECAP 捕获初始化 % T9 r) y6 H C' N2 E# b; Q# ` ECAPInit();0 \! i7 Z2 e+ x* ^+ F
UARTPuts("Initialize ECAP.......\r\n",-1); 5 i) N/ |# O4 ?9 H for(i=0;i<5;i++) 5 j$ u, z! T; m8 c: K1 o {4 P& k+ @$ o; e) J+ [/ d
for(j=0x00FFFFFF;j>0;j--); // 延时 9 Y( b$ H1 T/ ^$ v. w) k ECAPRead();+ `' R* n( n# c) p+ l
}; w) \. I7 s( L" a( L5 U5 J. `
UARTPuts("\r\n",-1); 6 E j' ^6 q+ O; n0 H( O- C UARTPuts(" C6748 ECAP Test Over!\r\n",-1); " W1 @+ [& t1 Q: k" b UARTPuts("------------------------------------------------------------\r\n", -1);. c! k- w: I0 y2 Y7 m
' P/ m- B# I- |" y% P* v // 主循环/ L6 L+ G% F- c2 V
for(;;)* k. q# I; x/ B& G$ b& d
{ " r1 {1 K; P( c2 i& y" z( A* A( e" E9 o Y* r& t i& D' G
}! ~' S: j/ o: U3 g. o' W7 M2 E' g
}/ O2 W) P5 q/ H: Y7 v% }
& h+ Z5 f9 i! w3 d4 j) w/****************************************************************************/& n3 ^( ?- v& T2 `; Y8 f
/* */! E$ Z* W" @. v# s% L) _: `
/* PSC 初始化 */ , S$ M& u$ H, Z b/* */ 4 H ~8 w& Y) m! N* s/****************************************************************************/3 r# Q/ S; f2 E3 m7 z4 o
void PSCInit(void) , r) V; a. d1 D1 t4 f& D* v& j{ 8 u$ x1 {7 @" v; R" b+ y9 c: Y // 使能 EHRPWM 和 ECAP 模块 8 c) n O& l9 y0 j3 f; l- ~ // 对相应外设模块的使能也可以在 BootLoader 中完成% x& f3 h! w/ H1 g6 k
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);3 s1 [9 e; t! h. O5 }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# O; r6 A% Y+ \& G4 b
} $ |2 M: n2 }& V1 d2 a$ M8 K) i2 T0 ^* \" Q+ Y
/****************************************************************************/ / ?# I4 k0 s0 x/* */: S. y5 z/ { Y& u p7 ?" t
/* GPIO 管脚复用配置 */ / m4 [' H) s6 K/* */) B) A7 l- d& e; }
/****************************************************************************/ ( n0 e9 Q. a) M7 H4 hvoid GPIOBankPinMuxSet(void)) v; i' S- X% J$ b$ g+ t2 F" E
{7 i. T- e6 h N4 \ x
EHRPWM1PinMuxSetup();+ T1 z! A) S# q2 S3 @
( w( Z+ t7 X& m) D+ p' A: | // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP) 3 O! G' w# |; g6 p // 作为捕获功能时管脚方向为输入- ]$ t' ^6 K4 L5 o6 }) f/ Z) ^
// 作为辅助脉宽调制时管脚方向为输出 & E& u* O+ `3 J& H9 o // ECAP2 / APWM2 : F p' b. {1 g( z9 w ECAPPinMuxSetup(2);9 E; @% D' N7 S, s+ E/ d" }
4 @; `" O4 `0 s H* ?- f- U' l8 k
// ECAP2 / APWM2方向设置为输入 & X& _3 H, Y9 W5 u, D GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]$ u6 O2 m* r- g3 h! B3 V3 f) u
}# @6 x. M H* S3 c R+ |8 T
- F% M3 |; E4 r/ h. E" U8 z
/****************************************************************************/8 @, {* C) s/ s/ b) A! V6 F L
/* */ * S) a* C2 M9 U9 \! [& u/* PWM 输出波形 */7 H% c( C* |. H
/* */ ; k. f3 }: E. z/****************************************************************************/ - b( C7 _1 T. p9 Q R0 ~. f ?: Ivoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)" Q' _& e2 d. L$ x9 a: U
{# v+ I: m9 p0 y- z+ X8 U! j
// 时间基准配置 $ t9 x) d# A" j0 l1 K! b! d8 v // 时钟配置 6 P3 }# p$ r, x, y# N EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ); 2 v8 a$ _/ n; M" Y4 e) `# p3 A5 @0 ` W7 z/ o% J
// 配置周期 % }! y4 S7 N4 e+ ~( N, _ EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL, 1 \' R; q" {* _# L. r8 V4 V" H) s pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);+ y* ?+ ^7 n6 R* z6 r
9 p, v1 n) ^* M( w5 m, Q3 Y
// 禁用输入同步信号% [* |8 p/ T! N5 Z d% x
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS); : O6 W( C% j4 @$ q* |$ @0 T7 m4 L% Z: T* I% q/ _- i0 d
// 禁用输出同步信号 " ?. g# |. G3 G& j1 z% Z EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE); : \% }' Y/ I# {- t 9 V3 T' A9 Q, Y9 K5 j) D // 仿真(DEBUG)模式行为配置 5 a. P P6 }1 ` p; W/ A* N5 V) _ EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);- e" y. f5 S) i5 y4 s: G6 @
( |& I, Y% H+ x$ r; Y! l- b // 配置计数比较器子模块 - |1 C* p8 U2 P5 i# v // 加载比较器 A 值 . } M! z' N8 S6 _; t/ F ] EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,+ f5 z, s# ]& `$ c
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, f$ O+ i0 x8 V0 G# ^
% W$ `6 f) }0 O7 h
// 加载比较器 B 值6 Q5 x9 V; o6 Q7 p
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,/ q, O2 n8 U$ t# B U8 y/ d
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);5 e5 }8 H0 W& W
# }2 t7 g/ d+ `- ?, E. C // 功能限定配置(输出引脚触发方式设定)4 n4 {# `" j- p7 B- G! _
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出" k- v* V& E" V
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING, , y# n. h( \7 r6 a7 U( ~7 n( ^" q EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE, 9 ~9 F4 q1 q, u: j EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);9 z7 Q \* O1 y0 H. V7 n
% {* h3 A$ x" i. g6 u
// 禁用(旁路,信号直接输出到斩波子模块)死区模块4 e3 ~3 M7 J; m3 `- }
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS); * D2 X2 a; I4 l9 Q9 t: g0 o z& W8 \# b
// 禁用斩波子模块3 v$ _% q: l: T3 |4 `
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS); ' p5 ^2 D) m1 K3 J2 e / w* x; R0 L* P c M8 v& V // 禁用错误控制事件6 H2 t' ?, _: U9 Q" W
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);1 D0 n! F7 _$ ^8 w; `
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);0 p8 [2 B( y8 D& Y
7 i8 w: f2 [- B. E
// 事件触发配置# c1 }9 B- k; Y* r8 g) ]$ P
// 每三次事件发生产生中断; E4 k p: F& i. \
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);. U) t/ f8 q; v8 ^. P* H
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件) e" B; I; @6 I z5 I+ E1 f$ Y
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC); " o0 W0 ]7 d9 Z" ] // 使能中断 % Q; y" J$ j8 k6 Z( E( i EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);0 _5 K) J" V: Y; }8 [, x* q% _
6 Z% N/ p- [5 X i; [) Y // 禁用高精度子模块$ T# e$ U3 s& v- S7 x( T5 k% L
EHRPWMHRDisable(SOC_EHRPWM_1_REGS); V5 \, F* W, ~& z# l 7 p+ X: p0 D5 X: p UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio); 1 q9 m1 C4 s: J) ^ m d7 a}/ C/ U. D. S6 b; `
6 S% Z( P$ R- S3 W
void ChopperWaveform(void) $ O$ A3 U I4 j{ 0 g! c$ p! s2 w, A# X1 a1 D) F // 50% 占空比 4 |3 y8 i2 U7 C' C EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);4 n# p# R, R ^5 x4 g
// 4 分频 8 l1 X$ x: F* `) r# G5 X( U: m3 T EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);6 R0 W( P9 ~- q. e3 A
// 单个脉冲宽度 & P/ q9 Z) j/ Y+ y8 h3 _- B, r EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF); e$ ?) g5 ?* P // 使能斩波子模块 1 y- H' N, w: Y& N: \( k( a! E EHRPWMChopperEnable(SOC_EHRPWM_1_REGS); . ?7 k% t- f# C}2 H( \2 v% A$ N
- y6 a3 i1 S( u' S- [* d
/****************************************************************************/5 f# h) Q2 `* O9 s5 G; `' t
/* */ 1 W% g3 _+ k: e2 r/* PWM 中断初始化 */) H* J3 u( e" D6 \" o
/* */ 8 y& |/ c4 z! L- _/****************************************************************************/ . k/ B& d, J8 o O: zvoid PWMInterruptInit(void)" V. r e/ W: o2 q, h& }
{2 h6 V, X" R0 R) J H: w
// 注册中断服务函数 - J) u% s( @! K. m( h' K& Q8 c IntRegister(SYS_INT_EHRPWM1, PWMEventIsr); 7 v" E8 l' {$ R5 t IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr); % V: b# G6 q8 y5 X' x - F! N9 W$ }+ u) Q. ]' } // 映射中断, F k% B2 _1 I/ C
IntChannelSet(SYS_INT_EHRPWM1, 2);+ |7 y' s4 T6 Q7 H+ P4 E' y
IntChannelSet(SYS_INT_EHRPWM1TZ, 3); 3 S9 ^1 I: b* \( D ( f1 R9 i# x4 C- M+ [3 z // 使能中断 5 E. K r6 x% g- ? IntSystemEnable(SYS_INT_EHRPWM1); ; k) a0 b1 O8 I7 ?! B& g( L IntSystemEnable(SYS_INT_EHRPWM1TZ); 9 W. k+ {+ p1 j; L2 V1 H' V5 L7 R} ; L& Z5 {" E& j% X `/ ]+ U% C8 A0 s# i+ d2 @2 O! X
/****************************************************************************/* V4 S! o" e0 i& _, ]9 Y) o9 U
/* */1 |! N- D; z9 u9 Y: G' K, K
/* ARM 中断初始化 */2 h7 U/ ^" _0 X# v y
/* */ 9 R0 o" _% t8 O8 f' A) m& t/****************************************************************************/ 3 A; K. Y1 o7 d; lvoid InterruptInit(void) - L/ t f2 V$ z{" M; w# `' t# l# j' Z7 X; k2 D5 S
// 初始化 ARM 中断控制器9 t2 h/ O: C& | T( b' ~
IntAINTCInit();: @. x4 [9 s [6 ]" ?4 e
3 D, z2 @& t1 o* w5 m# t // 使能 IRQ(CPSR)7 k o( q5 M r3 |0 _. X- o# E
IntMasterIRQEnable();7 t# e5 v/ G- s1 j6 d% j9 }