|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/- L! T( a: S3 d8 A' r# X& F8 O
/* */
3 j7 W9 ?2 p- O- @# q# c0 S* R9 S/* 宏定义 */& K7 Y* Y2 h$ ?5 Z4 F& D: L: ?1 C
/* */* E# K1 U" \! A8 g% i; Q
/****************************************************************************/
0 M" r6 ^- y) f// 软件断点& ]' u# M4 [7 R& I" Z
#define SW_BREAKPOINT asm(" SWBP 0 ");
, u$ S! n0 w* v' v2 ^0 I( i6 F# m x
// 时钟分频+ ~" X4 _( J2 i' ~" ^
#define CLOCK_DIV_VAL 2280 n0 X3 A R& k" K
4 H. Z `2 s" Y, d& B) h
/****************************************************************************/' ]) Q: s4 o; w5 n/ ~3 h/ x
/* */
2 t+ M Q2 J, Q3 m/* 全局变量 */1 J; g& a+ X6 N/ k: k" m
/* */3 I; s Q9 |9 q5 p& ^: f
/****************************************************************************/
" S; O' s/ Z# Y; r& Y# t* p) n: MECAPCONTEXT ECAPResult;5 \, B4 N. O; G. O& z% h4 v
3 X2 Q, d# O: G7 r+ u/****************************************************************************/
Y/ \: X1 B7 L- f2 @/* */+ q1 v$ X% u( w$ b$ f7 X
/* 函数声明 */8 u) X; a9 C$ G" K
/* */8 k/ L) d7 i% A! b& N' H% f
/****************************************************************************/( `+ |, p0 r6 g$ ?3 _
// 外设使能配置
% T6 W5 p0 [% wvoid PSCInit(void);
! q6 p2 e3 ]9 Y1 z6 O" k" j: W6 u7 `& y& L) _3 x% ~) T3 _) G8 v
// GPIO 管脚复用配置
1 i; Y, K: u0 h" t- Mvoid GPIOBankPinMuxSet();, E7 v0 f: k$ X0 N3 n2 b
" I3 i: V$ a; c5 E
// 产生波形) [* N, x; s4 l
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# Q) [, {, W( u9 W8 c6 o9 fvoid ChopperWaveform(void); ]7 T" I/ |) z' b% y% z/ G9 a" @
3 Q3 p" v& C( L& ]
// ECAP初始化和读函数9 I3 V& T6 B# P+ Q+ u
void ECAPInit(void);
" g# I z$ G6 h* N3 vunsigned int ECAPRead(void);5 k, D& p9 e, ?% q4 E0 R
3 ?, i( w/ z2 X+ z2 S
//ARM 中断初始化; D+ F/ {, \2 n8 F5 E7 `( `% _& k
void InterruptInit(void);
3 Q4 r9 e8 H* t! Z
5 V- _6 y/ Y1 s: }2 k# _1 ~// PWM 中断初始化% w) z) @5 h9 m- U6 y4 L9 V
void PWMInterruptInit(void);
* G. n( j! K# a9 n// 中断服务函数
& W" d& m, W* z4 w8 t// PWM 事件+ l3 c5 r) i/ M) `
void PWMEventIsr(void);
4 w9 I2 Z5 |& }: x+ x/ o// PWM 错误控制事件
* w# j) e1 X h7 a- [void PWMTZIsr(void);- j% y( X4 c5 V$ n
6 S, g8 m" q1 m5 I9 @; E
/****************************************************************************/3 [4 u2 c1 n8 t) G2 z. b1 p
/* */
$ R) X3 h' Y `3 U- f2 s+ C/* 主函数 */
$ q5 y M4 C6 m" h% K/* */
$ F+ r" q. B8 ?/****************************************************************************/
* y4 r6 _/ g. I$ y9 u- oint main(void)0 r1 Y# E0 z. e6 C, K$ j1 t" w
{
1 z) r! K( ]) u1 v // 外设使能配置
& c: [: c; K; x! A PSCInit();
7 q/ a) v2 y! L! K+ B, [% ^- ]
- t3 {: O+ ~% B" y8 n! ^ // 初始化串口终端 使用串口2, X5 F ~, O7 Z1 q2 l5 y. c) _+ l! N
UARTStdioInit();
% o+ V) ` g, Q+ y9 {$ j( g + ?3 P a4 u" I3 ]; b% M+ ?
// GPIO 管脚复用配置& W- l2 _' o+ ], C
GPIOBankPinMuxSet();) @; x& r; k) G' D7 z; j0 y
/ F* S0 X2 t* H- Y$ w' P // ARM 中断初始化
3 B4 t4 N2 ^5 L7 _7 [1 m! S) A InterruptInit();3 a. w, [2 y, m! v! O
( U5 r% F, O# s/ x9 ^ // PWM 中断初始化0 u& {9 I: k" G4 n9 b* c2 p- b: m
PWMInterruptInit();/ C1 z- ]& K0 f0 D$ d$ L
0 Q, A6 P4 y* B: I% \: ~7 y) i7 Q unsigned char i;
) q: F1 I3 \. F3 r% g unsigned int j;
: K0 \8 a: G4 K+ A( M% \2 g- y9 O5 d: L1 q0 H. Y |
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
0 R+ z2 B$ Y# P. n UARTPuts("------------------------------------------------------------\r\n", -1);
7 u! G+ s5 J: S y. `! x UARTPuts(" C6748 PWM Test\r\n\r\n", -1);# r% S/ S) t6 R$ f r$ ^, K
// 产生波形
& t. l& G3 P4 } L9 C6 V PWM1ABasic(25000,50);7 o' ?# t8 o, Y. ^
0 s2 o T# X8 q1 T UARTPuts(" C6748 PWM Test Over!\r\n",-1);
7 W( B6 K: g. t, q. F( q UARTPuts("------------------------------------------------------------\r\n", -1);
, N8 ?( Q {& L! x
9 D5 E( F* B1 h9 {" U: M* D
+ X+ y4 k; ~' \2 ]9 V$ g4 O$ X( E" R3 @% x$ T; H8 w
UARTPuts("------------------------------------------------------------\r\n", -1);
3 N" A& y) _, |# A" B' Z; G UARTPuts(" C6748 ECAP Test\r\n", -1);7 M; O# M' B7 E! o
// ECAP 捕获初始化3 d3 `( o8 D* `: @3 S z
ECAPInit();% z/ d# X0 K1 E. E- @2 H6 A
UARTPuts("Initialize ECAP.......\r\n",-1);
; W$ Q' k7 z% _1 l$ A7 R for(i=0;i<5;i++)
8 g. ~" }2 [2 ] {% m8 l2 U: t# }+ Y& a
for(j=0x00FFFFFF;j>0;j--); // 延时8 R9 e# i" U% U, D2 I' P- K
ECAPRead();* u( I- k8 ?& }8 U, y' s2 y) b) B
}1 h$ i6 W- x* @2 Y) P/ k
UARTPuts("\r\n",-1);) H3 y" K% A3 o& }- }* L$ C
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
, V# h* {& Y& o2 v, K. |' U3 S UARTPuts("------------------------------------------------------------\r\n", -1);
5 V5 I! U& ?. a# }/ q) i6 d& q W" ?4 I: d
// 主循环
3 t( g+ l! ?$ v( y- ]0 _8 b* [ for(;;)
0 b. s2 M' I+ q+ i {- x! [! e1 t3 y+ e/ k$ @& V
1 C/ F# k% L- u4 P- j5 a
}) U0 V4 _& ? i
}
. |" g( r6 M* V! q/ H8 A
2 R/ G) s' B, o/****************************************************************************/
F4 B1 z" m. |2 K/* */
[9 R* d+ |+ V+ r1 H! G! c8 H/* PSC 初始化 */3 T( t1 {$ e9 s! u+ {
/* */' l' ?+ q8 v t0 d
/****************************************************************************/1 Q* Y6 G6 Z$ a* h1 z
void PSCInit(void)
( Z% T3 ~/ y k. s% h5 \{( o/ t( \0 `2 B; B2 k+ g0 d7 x
// 使能 EHRPWM 和 ECAP 模块
* V# ~- t3 M# c% N2 h5 I4 e // 对相应外设模块的使能也可以在 BootLoader 中完成8 d- e1 D6 Q+ ?5 d& S0 Z4 a
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; o, }9 E! q( E* ~6 W/ K PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( l! O, o `- S9 U! F
}6 D9 B' t% T2 D
* k7 [3 s+ S( z1 W2 R( V- Y0 a, V/****************************************************************************/6 D$ z9 A0 ~2 @8 |
/* */
5 Z) I) L/ L8 ~+ F/* GPIO 管脚复用配置 */
6 h% d% W1 m+ H2 D# S( W/* */5 x4 E& f, b# k. n% U7 l
/****************************************************************************/5 K+ H) d6 a" O8 ~1 W$ s- [
void GPIOBankPinMuxSet(void)
1 m0 \" F3 V( D- F{
2 e( P, u7 w/ S EHRPWM1PinMuxSetup();
. w3 {0 v+ ^! V* l. L$ v9 j/ Y' \/ u
: w4 n) V; V/ c2 K // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- }9 a3 u2 ~( `- N+ y6 h // 作为捕获功能时管脚方向为输入 K( M- v7 t/ V o! |4 ]! w& ]
// 作为辅助脉宽调制时管脚方向为输出2 F1 h r; s7 P& [' A8 Q0 z
// ECAP2 / APWM28 s0 ^4 ?5 t$ U. b ?- n3 x9 W
ECAPPinMuxSetup(2);
- |* |' ~/ {: D% j, j _! @% p7 `
5 e2 U& O! ~$ S0 Y, @ // ECAP2 / APWM2方向设置为输入& V a: z- ]$ J8 ]
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]. L% d( o- a: b. C! F4 c6 {
}
; L: S9 X% U& a9 v$ t: [: E }% }' v: N/ x1 O0 H8 l5 l
/****************************************************************************/( g9 j h: N6 |/ h/ P, X
/* */2 [ ?' A4 e7 X* ^) M' J
/* PWM 输出波形 */
8 }2 k5 J. B9 _+ D4 A/* */7 J5 u. N- c3 R
/****************************************************************************/) V" \/ ^2 ?4 j; G( t7 }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)) f( o) C4 b9 Y+ i* r& {
{
! G6 p$ _7 Z7 b- X% p% k4 x: }- y // 时间基准配置4 g, g+ B" N) t9 c3 M7 `4 O$ t
// 时钟配置: I, ]6 D [. E5 Z2 r' M7 {
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
# [. U/ i$ m) ~& k' T) N- |+ m
% N! x! ?! G+ }: }' i- q // 配置周期! c/ U. V0 N* J; x D
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
8 G0 G8 K) C8 H; R* ^ pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
4 P, d" T* n7 O+ C" h! T
" \7 b0 C: x+ r+ U- ? // 禁用输入同步信号
6 |. P! v8 W8 A& Y# ~, L- ~ EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);6 p9 R7 u8 q7 P
2 D+ ]8 x% j, M7 I1 \& x3 w& S1 m // 禁用输出同步信号
% Y! _+ ^& a( e6 l3 F+ F) B EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
* K. u8 s4 p9 k$ h! \6 Q
5 M0 a! w% }8 X. \7 ?% v) a1 L! U // 仿真(DEBUG)模式行为配置5 V3 F+ S) k H
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
( X) A& _, c! \1 q; ~, N% ?* T( k/ [ N
// 配置计数比较器子模块2 n Y- }, }8 c& [/ n! {
// 加载比较器 A 值' h6 Z, _4 ^. F( a
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
1 m9 k( x5 j0 w( b+ C' O" o EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
4 h' M5 \. E* k7 j) E* P) h6 b
( e* b* b) R/ n" e. b3 T // 加载比较器 B 值" J4 N$ A! q- [# l
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
8 p3 Z3 W) P! Q& h. } EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);$ q$ b$ o+ N+ t7 y( J
7 V! u4 u+ G6 s& z: ^$ A# G" P // 功能限定配置(输出引脚触发方式设定)
. ?5 F3 d. A M! h$ k1 E- c // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
3 E% W. U1 _& a: u- n- N EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING," ~8 ~6 b6 i, c# K2 t* ?1 C
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,1 j" ?8 E4 b$ g3 G5 G" C# M
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);$ s, B& c1 I' P, ^" C! l
0 K- k" E- _0 s% P* ` // 禁用(旁路,信号直接输出到斩波子模块)死区模块+ X, c: _& m+ T
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
! B. d! Z- s) i( @* A9 U+ ]
/ I0 Q) O1 c- L u; q // 禁用斩波子模块$ D3 b. l/ {, e( t) L7 P
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
& y" B! f; L* n( D
# v& P3 p+ }% S2 X& ]/ Y) K U // 禁用错误控制事件' V( P0 F0 {7 Q% T/ p2 x
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);, |5 C; b1 y1 o: C
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);! ~% h" D) G2 d. |; B1 y. i% M
" P+ ]0 Q5 r, x
// 事件触发配置
- J6 J8 ]2 b7 G9 K' f2 |3 q5 j // 每三次事件发生产生中断) T$ H6 `6 Z* E+ t2 q% N1 G! g
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
0 ~+ _4 ?* S1 b8 s3 Y) X L // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
, x5 E3 |: S9 I8 S4 ~ EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
5 o* h& q2 ?* G // 使能中断$ }+ H3 a* I! Y3 Z3 ?
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);' X# C/ _+ ?- i& R! d+ Y ?& |
, H5 S4 W+ @0 n3 a // 禁用高精度子模块5 R. |! B. V+ }- c3 D2 f1 u' ^
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- q9 w- y6 ?! T7 `% t2 a, D
+ j4 u# D8 z' r' i6 R' H1 f e UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
. R* f# X1 s' U}# b, N/ T& g% E' K( f5 S3 ], U/ P
: T7 M. [% @# j2 Uvoid ChopperWaveform(void)$ W, J% k1 \) ?
{
5 W; J* g9 p* L // 50% 占空比% g1 v: D- y6 b4 C. f
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);* ~# R$ m( i6 w3 T; a
// 4 分频: s" q4 h/ e0 {! W, x& E* P
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
# U# ~9 Y8 J* v* E- [ // 单个脉冲宽度 @# h; b/ ~/ w: R2 ?& u4 o0 |1 y
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);" @ j+ o2 Q" @0 l+ E+ k4 Y' s) O
// 使能斩波子模块
) E8 p& i& |/ d1 l% Z2 R. k' t EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
7 U, t7 Q5 w9 O8 ?* I% J6 Z7 @# p}0 z" r9 A9 {7 U* r% v
/ o6 {4 M$ }5 K/****************************************************************************/! p# }# V5 D" w, D
/* */
4 Y6 _' n! w' f% C# J ~/* PWM 中断初始化 */1 A( h) e1 s2 n" d
/* */- ~: `. U) |0 e# d# ?
/****************************************************************************/+ l/ i# M2 }+ [5 W, p' T! ~
void PWMInterruptInit(void)/ u( o* g, r* h3 g6 x# r
{8 i$ { a& Q! F9 ~. }; f
// 注册中断服务函数
9 z8 }( l7 S( M IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);6 ?9 V+ i/ t: A) a
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
6 c B# s( Y. u6 E# M' h
: y2 b) B, f1 s. Y$ _ // 映射中断* q# |7 W8 k w8 j: ]
IntChannelSet(SYS_INT_EHRPWM1, 2);
/ n5 |4 Z2 Q! s7 O6 }/ n5 T IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
* K: n ]4 w9 i3 \8 X( p) @; n0 u3 t. Q
// 使能中断
# n8 K, E7 u. U3 E2 ^% N IntSystemEnable(SYS_INT_EHRPWM1);! _5 Q* m- W% h4 h6 X1 Y
IntSystemEnable(SYS_INT_EHRPWM1TZ);: o) x) p- W9 O' K
}
0 O' I/ X8 B/ q# N
" a4 w" j; T% r" A/****************************************************************************/. ^$ u8 W' P/ h! n
/* */
% p0 h# o! b4 A3 g% [) H, Q! |4 }! {5 M/* ARM 中断初始化 */
7 b! V1 {6 j, i( g6 M% T. s/* */( I& K/ i T N) q# t
/****************************************************************************/
' ?# p. H ?* a3 A' Dvoid InterruptInit(void)
! ^! j% ]6 i, b1 W; f! l{! O6 v+ _* I# u, F1 S5 ~& I
// 初始化 ARM 中断控制器0 r: L, l! h K) M O
IntAINTCInit();7 k5 ]6 `& d. s; p
, c- ]& R" S5 F- M r. M
// 使能 IRQ(CPSR)0 l2 M8 T3 F4 v9 a3 p# @
IntMasterIRQEnable();" n# T3 S6 L* z1 s$ Z
. J2 o- m" {7 U& k5 U( T: T // 使能中断(AINTC GER)" @- I/ f+ c6 U+ d& z* l0 t, ?0 j
IntGlobalEnable();
. {3 E3 S* r* u* Y
- H i+ a+ f8 a+ ^4 w6 o0 x6 b2 O // 使能中断(AINTC HIER)3 `4 x; a7 Y1 E
IntIRQEnable();
; l( t. k4 o2 Z" Y5 c}
* z5 G6 `* ` a. b' q5 j+ z
& g0 c9 f$ z+ |2 `& G$ W |
|