|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/! f8 p; ^% b6 u' h) x9 [
/* */& Q, P) O& t% V, g \* R% }
/* 宏定义 */
6 w u5 e# q* x" \ a4 j* n s/ R/* */) L5 v n' ^* C" h# R
/****************************************************************************/
- ~; z, r# S( O// 软件断点
. X4 i" S* ?5 y9 Y) ]9 O0 ^' l' k#define SW_BREAKPOINT asm(" SWBP 0 ");& ?6 i: f% G9 }
8 T- k) F' m) C2 {% j6 b// 时钟分频( I Y' e; F+ d1 j8 l7 p
#define CLOCK_DIV_VAL 2289 I7 ]1 ?, S- K; v/ T9 m* g
A; C2 U) ]4 i- F. H5 U$ G
/****************************************************************************/2 S8 G$ x6 m; x7 t
/* */" i$ Y! H7 B# }9 c
/* 全局变量 */
4 ^! O/ K& ~" ]# E, H/ f: D! D1 l/* */2 x3 t9 T/ Q) |& w
/****************************************************************************/
. I0 _9 J; \5 R# W' FECAPCONTEXT ECAPResult;7 H) m9 j: C$ E) [% i
+ `; [. [: D5 u; g$ x/****************************************************************************/
$ ]: }: k, q! ]' n/* */
; \/ M5 W" V8 D: k/ P/ l; G/* 函数声明 */
- S; ^ m5 s+ X9 o: |$ |/ ]+ ^/* */
" e6 L6 H8 d( _/ U/****************************************************************************/
+ h# N3 d8 n1 f7 u+ U2 x2 z// 外设使能配置, V8 \0 n! l8 ^
void PSCInit(void);
. Q+ U- }! A( z2 O* ~& r- P
5 `' i* B2 w1 X// GPIO 管脚复用配置
5 N+ A4 p! c, a% ]4 Gvoid GPIOBankPinMuxSet();
5 O9 `8 E2 |8 V+ w9 ]3 h7 Y' [( D9 R7 r+ p& }6 {
// 产生波形
9 |4 n& ^( X, I) Ivoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);7 T4 D6 F# C7 P* c3 Z( D
void ChopperWaveform(void);
) J" ]3 x4 E5 [+ v8 k" ?/ o( M2 K7 b: m
// ECAP初始化和读函数7 r6 g; D6 l3 t+ R9 \5 w, Y0 R
void ECAPInit(void);3 h9 k8 |: ]( J
unsigned int ECAPRead(void);. a3 J4 V+ e/ S0 ^- M0 x
; G2 |8 Z6 q1 k" f6 T5 m. n. {//ARM 中断初始化$ H4 o0 W" B, f; Y- f5 r2 z, \, `1 ?
void InterruptInit(void);
/ ?/ t- d! v' a6 k, j. E( r3 _5 u J! z
// PWM 中断初始化( w4 {. j+ j {5 N6 ^
void PWMInterruptInit(void);2 ~8 _! T( U8 q1 r8 b9 c/ \
// 中断服务函数
# K/ \# }3 n" C" [9 b// PWM 事件
3 E% l0 u! ~- @# pvoid PWMEventIsr(void);, A; S/ |. T1 Z2 u$ `" U4 V; a
// PWM 错误控制事件$ O2 I2 I4 n+ N! @
void PWMTZIsr(void);
4 ~- ]2 E- E4 n2 c+ u3 l3 o3 W# b
/****************************************************************************/# C! p+ Z- f4 e* A1 R1 q# F
/* */: j* `% j" X8 [: F% L8 T8 R
/* 主函数 */
" r) G. c- j6 C/ J4 L: S1 C/* */ Q7 J' t& E5 j, R: s) ?
/****************************************************************************/7 Q% G$ A9 {# ]6 s y- A
int main(void)
/ i) S) k" ?4 m: e8 d6 N' |{* r; d/ M2 O( v- H
// 外设使能配置! e; H2 Q+ n; [6 v0 E% F
PSCInit();
3 u$ e0 e- q& t$ ?% P* C3 M/ q/ N- |% k. U4 n0 ?
// 初始化串口终端 使用串口2
1 F* J8 k2 b) J/ s# e UARTStdioInit();7 v' I% x1 {8 E, f
* [" ]( H$ `5 l3 x+ s6 v // GPIO 管脚复用配置. |+ T* G# K0 p! B
GPIOBankPinMuxSet();0 C/ L- i& Y: S' M
" \ {/ V; {7 o& Q6 N) E! O. { // ARM 中断初始化6 u1 b' }" S6 m
InterruptInit();
/ ?* X) i3 v6 d3 K" x+ w! _- p1 p0 x8 s ?" m7 h; s; A
// PWM 中断初始化 E5 ~$ j; P' s& g j& @
PWMInterruptInit();7 r6 q, e8 G. S8 r1 |2 [6 Q! p$ r
' A8 W A9 [2 O5 g unsigned char i;
! ^. Q. u4 D; g3 u7 V, ^; \ unsigned int j;
$ J9 o+ d# n, I" A
Z3 u! i& h" i. A: U2 Y! j UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);: Q3 @" L' p8 H. B% c7 N2 v
UARTPuts("------------------------------------------------------------\r\n", -1);
5 ~; K- d. H! t# S: v UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
2 E- f( e5 J% Q // 产生波形
& J: K% ]; U) V PWM1ABasic(25000,50);
( A7 Q! P& \ A" m$ _! H, Y. l9 ^
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
) I2 z( P; G: |# S, N% ?+ ? UARTPuts("------------------------------------------------------------\r\n", -1);3 ]5 b' ~0 `' m0 t0 @
- y0 n4 L# Z) i- U
& V$ Y) ~7 f& B8 X4 f# B- u$ [$ D
- R4 w$ ] N$ s; k8 ]* [6 p& c$ J8 K+ p UARTPuts("------------------------------------------------------------\r\n", -1);
! g# a( A& G- \* b/ t3 k# a UARTPuts(" C6748 ECAP Test\r\n", -1);- B. Z$ ^. w& I( l9 |: N
// ECAP 捕获初始化4 t# A1 E; C1 i1 k
ECAPInit();- T( V) o" T/ F1 |/ c% B
UARTPuts("Initialize ECAP.......\r\n",-1);
3 Z" \# O8 a+ _6 B for(i=0;i<5;i++)
r" G+ l3 ?+ a# f {
7 ?) L( B( l; b. |* W for(j=0x00FFFFFF;j>0;j--); // 延时8 F6 T4 d# x8 Y. ^* h+ }# ?
ECAPRead();
) q* x# F7 j) M# M/ M; ]% l( F }
; a4 t# n! p0 r& M+ s: e' l" q+ @ UARTPuts("\r\n",-1);/ J. ]9 p& V5 p( ^
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
" h6 @2 r& u- _ UARTPuts("------------------------------------------------------------\r\n", -1);
% ~8 x5 g [2 y h; N6 [/ Z- {- B6 W- }" _, T
// 主循环1 F: ~4 x6 ~0 }( |. @0 w1 g" b
for(;;)+ S% @: K+ s: g% h& x9 g( c3 D
{$ U( s P3 z( X) y+ C
; y Y, B7 \( v+ t# L
}# D5 F* v$ t2 k& j. l5 H3 c0 q4 }
}
' H& [) w. n8 l b: { U6 |( y" y0 l5 b0 `: x: @! C
/****************************************************************************/! Q: c `0 p# B1 p1 o# O, S9 R3 w7 d( ?
/* */
+ F( Z4 v2 I" m! X/* PSC 初始化 */4 J, T7 c+ [3 Y4 K* Y
/* */ `% n# ?& \. ]# r6 F6 Y
/****************************************************************************/: i4 {3 V0 P# P2 T! Z
void PSCInit(void)
9 f( M, |& \" k* ?' E3 U* x' W{
3 c& e+ t4 ?% N9 D L- }8 v // 使能 EHRPWM 和 ECAP 模块
6 H/ G" w( Z- O: T- Y0 a, {4 o7 N // 对相应外设模块的使能也可以在 BootLoader 中完成4 U* \ j0 a! n9 p
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ T* e% X6 e D% S4 J2 h1 R$ m PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 b5 W3 g* U; k- q}2 L0 S8 _7 }- C4 m# l' N% g# X
" j4 B* W+ c/ |6 g
/****************************************************************************/; h- W8 |2 a0 _9 o0 Y9 N
/* */
( D# O+ H d; r- b" t/* GPIO 管脚复用配置 */
8 p1 Q; v; @' x/* */
7 l( f: U1 @! A/****************************************************************************/
5 j! D$ X' c9 C& S1 E7 Qvoid GPIOBankPinMuxSet(void)
9 [$ U+ q+ N- q3 k{
! ~' k. ^. z3 M3 p" o EHRPWM1PinMuxSetup();6 k5 T# O; e8 U% e, T7 V4 c
- M3 E# G C2 M& X) z F // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)9 C2 p' C6 M5 _; F8 Z& X& _
// 作为捕获功能时管脚方向为输入$ s) d1 H" g* }9 j4 c( @$ P
// 作为辅助脉宽调制时管脚方向为输出$ h0 W: K9 |. a' D! H
// ECAP2 / APWM2
; o% n4 e7 r- P: D8 F( \; ? ECAPPinMuxSetup(2);
4 I6 N0 S @( d$ {, N/ O. ]3 a% t( B! {/ ]9 R6 |
// ECAP2 / APWM2方向设置为输入; |- S& c6 ^3 P6 z( ?
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]8 N1 u! |9 V q$ U
}+ b0 ~4 C( A: d$ D
/ d1 S6 [& [( @% d3 h
/****************************************************************************/5 }0 K2 o5 ^9 W) c# l; K1 U. Q
/* */
. `9 f6 ~# U- e/* PWM 输出波形 */( H' C0 w0 U+ v* _* [, @" C: N9 h
/* */
( \3 x& o& Y/ _/****************************************************************************/
+ H, b$ S: K5 d% m6 Y' _$ svoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)/ I5 J7 k* |4 V6 P
{
. q" R; a$ N! o& L* _ // 时间基准配置& e+ G2 Q" f+ R) ?( z7 r
// 时钟配置
0 O' K) X4 I8 G. E: |0 Z: J/ X EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);0 @; `# n _5 t
; G }. A0 G1 P% e" |* b // 配置周期1 n/ ]! h# h! m: Q2 ~1 @
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,: \3 v/ X& `4 c( H- M
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);5 R1 R) p7 ~8 j
" @+ c6 z5 a# s$ s; e( c
// 禁用输入同步信号
1 ^# L7 i; P) k EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
2 I; x7 Y" o. f, e* d' K/ I v
: k* E2 p& e0 m0 f // 禁用输出同步信号
$ M5 L6 U. Z9 }6 E; L, y EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);: M7 @% j% W5 \5 b% Z- y# I
) u9 Q ^( q3 P$ H s; |( @
// 仿真(DEBUG)模式行为配置( v. ^# m1 O' v
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);: X+ O- M% w% V8 w2 d( [: K
# b2 ^$ Z2 T8 o+ [# J0 r // 配置计数比较器子模块
9 J* `6 O8 O( S: m3 D // 加载比较器 A 值0 I% @6 L* _( n; c. y) E
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
6 m4 h+ D7 ?& ^) ~. |& u EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) c. u) M) \: f
; o/ y0 T3 g# V( ~ // 加载比较器 B 值, e: z9 l/ t7 Y5 `' k: J
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,' e/ } l0 ?# M% k1 }4 L6 L& S
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);4 t$ R* b/ Z' N9 L" Z
1 G$ u9 x4 s( x* M // 功能限定配置(输出引脚触发方式设定)9 g; u: O2 Q4 @6 Y
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出+ c5 x! V7 M9 W7 @' r
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,' ]& z% q' G) v- B% N/ |4 x* I
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,; x, s- P4 c5 ^$ h c% }; l
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
6 n; x3 R) Z5 k( B9 o4 {
/ Z- j! i5 r5 B9 x8 R // 禁用(旁路,信号直接输出到斩波子模块)死区模块9 R; I8 A5 p: f. }' u
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
3 }% I- o7 y _$ _, _% P! i$ ~1 [% p
// 禁用斩波子模块
7 }! E; f- {! ]9 E9 R- K H EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);0 |/ M1 ~) @0 N9 T
9 p: `- D% L' J, a# x4 m* A: T
// 禁用错误控制事件
& d) I5 d( A# {; h4 y4 p: ]; M- ^ EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);: p8 G, e4 Z! D# ?2 o7 [& b+ D' [% _
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
' h$ x% x2 @8 u9 M0 `" A; Z! C* B! @7 x* a& p
// 事件触发配置1 A* |/ n# q7 [; P! F, s+ ^5 w2 n
// 每三次事件发生产生中断7 @% _/ Q: i" {5 o
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
) d. I0 O/ y" W! D // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
& d3 [; C" K. Y5 R+ c) k EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
4 z: p" c( J5 J$ A" J$ _, l // 使能中断
6 k8 E; ]8 L/ ~% `: `) U. G! J R% t EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
3 X9 U5 h8 T% A! {; `3 v/ `: K4 W0 k1 p& y) F5 N. ^4 A5 K
// 禁用高精度子模块1 R4 |6 w! A5 g7 w6 o# T0 ~5 v/ Z
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
7 o- w' V1 ]- {1 }) S- c6 r! k( a b# X8 D7 m
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);. Q' M Z; G4 O# O* F# [
}
: y# X7 Z# t3 M7 g7 K' {, }5 ]7 w! B5 W
void ChopperWaveform(void)
* ?; F3 Y R9 a W9 k( i{
6 ~$ s$ e+ t4 B3 {/ j // 50% 占空比2 n# R" z- X6 p$ |4 E5 V
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
3 n% J9 Q, D/ q4 S4 y // 4 分频
( q; `" q% p E' V5 c: y9 T EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);3 Y2 w, l4 u: k' }" v
// 单个脉冲宽度
! Z4 k. n5 U7 Z EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);) ~5 \& j1 g; r5 [' Q2 v
// 使能斩波子模块# A3 {; {! e! u* k- v: ~
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 A: P+ i9 m' a} K: O2 Q, ?7 d
Z8 X$ m7 w) C* g
/****************************************************************************/" D1 c+ d, \$ u, L+ J8 J
/* *// n+ `) ] W/ y. B# @1 S) c/ ]
/* PWM 中断初始化 */
h) s+ u J, \! f/* */
" R! }% L1 @2 E! u/****************************************************************************/
) w- V8 d' m5 i7 Y( W4 uvoid PWMInterruptInit(void)' n' s0 L% t. o7 F
{7 B M: x7 ]% }# U; X
// 注册中断服务函数
, k0 B8 b, H% A9 {; R5 G f& ~! X# g IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
% }+ M% ?: B/ i$ ~ IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
6 J* d6 {1 k( _2 f; ~( {- k+ B1 `
5 g" j" O8 N: Y/ \1 M // 映射中断
5 k' b- L5 R1 H- h) l* W0 y IntChannelSet(SYS_INT_EHRPWM1, 2);
- A+ e0 v9 L( m4 N! _ IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
2 [8 V/ l4 d# }. h* `5 \
( b/ z2 n5 E) i* b# I( n X // 使能中断 }4 @/ L; K( v9 i" I5 o
IntSystemEnable(SYS_INT_EHRPWM1);- m" q1 }6 p: ?5 i# A$ {0 f
IntSystemEnable(SYS_INT_EHRPWM1TZ);
- ~4 Z$ h3 d+ C6 P }" n# [}8 u$ x- X7 n. D' y: r7 @
2 @& g' b7 t8 ^+ I" `* M
/****************************************************************************/9 @- z. @7 v: x
/* *// F* [8 E' }0 E u. x' N
/* ARM 中断初始化 */
1 E$ p1 I+ m- p8 R$ r: K/* */7 a; T- h* E# Z7 B/ p* N* j
/****************************************************************************/' J, x# ~5 j+ s+ s& h, [9 v& n
void InterruptInit(void)3 `8 `- ~$ X* S X* X& @
{
@+ F7 D9 N# o* c4 _ // 初始化 ARM 中断控制器) f7 M, s1 W% o$ ~# }3 P3 F2 ]
IntAINTCInit();" }# {% X, `3 Q7 d1 Y4 s
2 G# g* r- M/ Y3 z // 使能 IRQ(CPSR)4 C. g1 W, r# x( I9 _. v+ ]2 S
IntMasterIRQEnable();% N3 O$ {( u/ |7 z
( G* W' b0 j9 B6 @, C- W // 使能中断(AINTC GER): ?/ J+ ?0 O" g. z
IntGlobalEnable();( U* f/ }9 H3 p! w a. \+ ?( I
' X Q: \( t! N2 q, {! i$ _5 J // 使能中断(AINTC HIER)
( ]) Z, n/ z) y0 |' l$ m `" P IntIRQEnable();3 h' A' k! Z/ c4 C( W3 ?! W% h. v
}) u) }4 [- h+ P6 V& |1 l+ Z
# V, a9 M7 G( J: i Y% T |
|