|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/$ I- r* Q4 _4 j
/* */& F( h: g1 H1 F4 F# j+ r* a
/* 宏定义 */, c& U# Q$ S& j
/* */
- ~6 V' r+ ?* \) \, j/****************************************************************************/, }7 Z: Q) N2 x- {1 T6 P7 [0 l
// 软件断点
: e! [- G! \+ I2 Z) v#define SW_BREAKPOINT asm(" SWBP 0 ");
; [' r+ x1 ^! ]$ N" f4 v6 s( p( X0 i* m
// 时钟分频+ j: Q% t+ P7 \
#define CLOCK_DIV_VAL 2285 c/ [: q) c W2 n% P9 `
2 [8 L% c6 ^- l9 Q1 M/****************************************************************************/1 ]" x* P: x' K# x0 K2 l
/* */3 H0 P( h# s! ]' n
/* 全局变量 */
* `! s. I+ U+ s; [( X) p# ?' v) @/* */
4 F% s6 z6 U; b) h6 s/****************************************************************************/3 Z* y8 P a8 @9 F) S3 i
ECAPCONTEXT ECAPResult;
4 E, `! K1 _1 ^$ {9 O+ W" V* Q& g5 Q
/****************************************************************************/9 A8 h( Z) f( a* F2 g
/* */
v5 J+ C) J3 d |/* 函数声明 */
9 i8 }* l/ E# o2 `* G5 v) x/* */
, R3 B- }) f+ Z/****************************************************************************/
: n4 K. S/ I! X. J. X// 外设使能配置
0 A1 |& I" {7 l+ u7 x$ M) ?: \void PSCInit(void);+ M( q& t5 F/ }$ J& d9 i
- A, p6 l$ P: D- I& x6 k _/ k
// GPIO 管脚复用配置
6 |. y, d8 L2 O: C' |- D+ }void GPIOBankPinMuxSet();" P! O2 `$ _; ?, d( u$ D3 l1 N4 \% k7 A
0 H9 L+ k( K7 L* t9 ~ w
// 产生波形& g1 v0 c5 {9 {) @3 i! s4 k
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
5 W5 U" B6 M# l+ _8 lvoid ChopperWaveform(void);0 O9 D) K) ~/ C4 z* X5 G) r+ L) A4 z
$ \; ?, J+ Q" X3 x P& [) s/ X// ECAP初始化和读函数
9 K! m1 c e u" {void ECAPInit(void);: ~9 b1 Y- _- a, F' f$ g/ H! @& w
unsigned int ECAPRead(void);
! e8 z- H9 \( O( f8 F2 k
: ]- Q2 y0 ?, I. M. H# P/ N8 I//ARM 中断初始化: O0 V+ J8 w/ \' R1 u, T
void InterruptInit(void);/ @; `* u: L' l
7 w4 s6 f F8 I9 J// PWM 中断初始化2 a9 K- v8 Y0 ~& ~5 d/ u
void PWMInterruptInit(void);+ q2 _, I; {6 h6 `2 @1 Q; [
// 中断服务函数6 j6 V5 E; _" \; j. z
// PWM 事件
: i$ F# [! r& }( a2 G# v8 {void PWMEventIsr(void);
- G. o/ x. J4 A5 h# i* ~// PWM 错误控制事件5 L, {% I: @" i+ U1 B+ u9 [* c1 a$ C
void PWMTZIsr(void);) Y# ~& ~0 S' Q) u+ O! v6 c
]0 q8 U7 e2 M1 ?- k; x$ o/****************************************************************************/1 t( M# W3 i0 N! s
/* */
5 l$ f6 M" L! x/* 主函数 */
# I) Q2 N/ ?4 }! @0 x. y7 R/* */5 A% c6 O1 v T; ~# Z+ c. h0 ?
/****************************************************************************/4 S0 w6 y' X) e* E
int main(void)
1 A+ Q! a- g/ I) S{: f6 b: ^: r; a
// 外设使能配置
( _! K* b( W% G* Y0 S' v PSCInit();
4 f9 w: e1 s: b# I. ?8 t
& ?5 c% v5 B0 l+ U8 X // 初始化串口终端 使用串口22 d! J) b8 @+ ~; _4 G; p
UARTStdioInit();# X. z( {6 k1 u+ }2 _# s& n8 a
: u& o0 o4 @7 x$ c1 d4 c, ?* S) q: P
// GPIO 管脚复用配置
" E$ D0 a- y! L; r1 u5 n- n+ ` GPIOBankPinMuxSet(); e7 ?' n8 h. E
+ ?2 s' z d) D. J0 U6 |3 ~ // ARM 中断初始化2 S7 L. A' {' U& ~
InterruptInit();& j7 b2 n' n6 k: A; q. q
/ b, X l6 J, A* R1 `, s
// PWM 中断初始化7 }7 {% k3 G/ B8 T- L1 z: Q
PWMInterruptInit();
# }$ _& q* r) _: N1 l( g# x2 {7 z' Y6 {
unsigned char i;
" \& h+ E, l1 C$ f7 @( f R e unsigned int j;
3 E, d/ d% K d% Q7 U) k# U) v* {8 u/ M7 S1 R* q
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
# R6 C# w3 g3 X. E, v3 i) ] UARTPuts("------------------------------------------------------------\r\n", -1);6 j( G7 G7 U! q; V) q; v: N/ T- c
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);7 g: t5 z0 ~& d( W: \* A6 c
// 产生波形
; J% Q9 G, p0 z3 p PWM1ABasic(25000,50);4 F& e/ I9 e3 g! n4 U. V. |
9 B6 U2 l1 a j7 |: ]
UARTPuts(" C6748 PWM Test Over!\r\n",-1);) b3 [8 N) J! Y9 V0 O* T
UARTPuts("------------------------------------------------------------\r\n", -1);
# x, u# B9 R6 U
+ o6 X! M7 K. s. }; _6 I8 _+ t+ O b: Z0 k' _ S6 b9 W
" v: D3 \' z. P6 h
UARTPuts("------------------------------------------------------------\r\n", -1);
# N8 @2 s3 w% L% M, k. s UARTPuts(" C6748 ECAP Test\r\n", -1);
) h! c0 z# t" r9 k) f# Z9 K4 U! @ // ECAP 捕获初始化
) q$ }( z/ ?7 R0 {+ R, m. ]( ~ ECAPInit();# n# }2 z! l3 h) `& M6 s
UARTPuts("Initialize ECAP.......\r\n",-1);- C+ x0 C! `# {' c
for(i=0;i<5;i++)8 ^0 W1 U& j: v( v/ w5 d/ f; t
{9 Y. c% b2 _ y! Q5 T
for(j=0x00FFFFFF;j>0;j--); // 延时; m$ v: f' h6 V7 ?, @6 M# a
ECAPRead();, M+ Q6 E4 \+ S9 i* G! H( J
}$ `5 S3 b1 j; \/ c
UARTPuts("\r\n",-1);
: D# i- i6 C- ] UARTPuts(" C6748 ECAP Test Over!\r\n",-1);- y. t! J8 G) t j
UARTPuts("------------------------------------------------------------\r\n", -1);9 X* n; N# y$ {+ c0 g
" r) K: Z1 B; r, _9 a // 主循环+ A; Y; t9 q/ Q
for(;;)
3 I l8 p, u2 X* J$ e9 o' [ {2 Y. ]# Y! T! v/ T& M) \- s3 f8 l( A
m' V3 @& P7 K {+ X0 v3 i4 g/ E }
$ K3 I4 i. E/ N# k}
" k. N" \# y, w6 G& \3 u* O) T7 G: G+ U; s, V0 w4 V
/****************************************************************************/# G' R0 I0 Z5 H" z/ m& P6 X9 O
/* */0 i2 C/ w. E5 y( S
/* PSC 初始化 */
5 B T# R- j" M4 ]& R4 v. v9 s0 x/* */9 y2 M& ]+ m( Y' `# p. ^( m/ u
/****************************************************************************/
' D/ A5 M, n6 |6 {void PSCInit(void)
3 U# C: e7 d+ D{9 f* @9 Z' H3 Y
// 使能 EHRPWM 和 ECAP 模块
) [$ M9 }8 G2 z6 z: |9 l0 t // 对相应外设模块的使能也可以在 BootLoader 中完成3 l/ a( W. p7 u' }# i
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, ]6 G) k6 V5 P. v: R0 C PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); K \5 G4 B0 t) \7 u4 h, M( R t' d
}
# d+ S% a9 Q! |) ]/ O3 ?; {. \# h) Q. N t- A2 Z+ t
/****************************************************************************/
8 w4 n8 z0 @5 ]9 D8 A% P. S1 L% |/* */9 k7 U2 t6 X) \, [
/* GPIO 管脚复用配置 */
( V' B- l6 b5 o: ?* u: E' o3 ?& b/* */
/ Z7 q6 ~7 Z: b4 v/****************************************************************************/
& ~: u4 r* b+ F# a. B. V, k! c& G% D' vvoid GPIOBankPinMuxSet(void)
# i5 o8 n4 B3 m6 B$ _7 i{
8 L3 J* [# g5 m' Q6 L EHRPWM1PinMuxSetup();
9 v5 [* Z2 Z" E2 { T) Y @7 y& C% F
$ |, H; i$ i. _- ` // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP): p( ^" N( j( [/ B+ v n
// 作为捕获功能时管脚方向为输入* t0 U, h8 d: i2 K
// 作为辅助脉宽调制时管脚方向为输出
" N6 E! |" o& _+ c2 M5 e& m7 M4 f // ECAP2 / APWM2
7 h1 m$ U* E8 k/ ]8 Z5 `/ \! _ ECAPPinMuxSetup(2);
$ o/ Q/ J+ S; V" Z# C+ [7 b! R0 `7 v; V& z" o, g8 y! f# f; O; `
// ECAP2 / APWM2方向设置为输入
8 N l l. d9 A2 y% b0 u" J GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
/ m; U; p" |6 B, W7 B}
' N9 B' |0 A: `0 k v* U
) p V) V& t! L4 ]+ o0 S: L/****************************************************************************/
& V" k. _- ~ c$ p6 i* V/* */% t1 E: z! m& Y" y$ t$ _; W
/* PWM 输出波形 */9 I% d) f* N1 t! G2 k0 Y$ G
/* */
+ J! }+ E- E8 X# `; m6 D5 j* |7 x/****************************************************************************/
/ s9 x' V% P3 q: q- g, d, x# M0 vvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)7 A, b o4 `; p3 c
{- K+ z! G0 @- {* Y: W6 }
// 时间基准配置; G: i0 d p& {& @; ^
// 时钟配置
* C9 o! I" R0 E @8 _1 P EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ); {, i; V5 w* a
8 o/ o4 S0 M& H2 _ G* W3 W5 a* s6 B1 m // 配置周期9 j$ b! {6 ^+ I: T; }! m
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,7 { W( u$ S: V8 V5 e
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
- @! m% X6 W, T: O5 T# ], X7 G- q) _8 Q4 D' K# Q
// 禁用输入同步信号
/ P; G) Y3 \5 g$ n0 x( q1 K+ N6 |9 n% g EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
# `7 D( T r+ o; _+ k8 h& e5 K0 F9 Y3 I
- Y$ v: h$ v: p // 禁用输出同步信号, x$ H- \$ R) m6 p' ]
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);/ o: Z$ y4 c0 l) o
; R" K" \0 Y d9 t& M% _+ _/ `0 P2 y
// 仿真(DEBUG)模式行为配置
# n# m" j" f* M1 n. I; Z0 J EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
0 a" E' l( `( q) g: o/ Q# @% [( y: V5 X
// 配置计数比较器子模块
8 ^" P0 P! ~$ v! m3 A, _+ R6 N( B( L // 加载比较器 A 值
* \5 ~, e0 A4 F2 o# M; G EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,6 H6 e9 T% q% x# r$ \$ T
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
: K+ J1 ]! @9 ?3 n5 I, Y$ y7 C; s
7 h: ~0 ]0 t* @! h; i3 x // 加载比较器 B 值
2 \6 Z2 _$ w( } EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
/ v0 t& `4 Q; B EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
0 ]$ v z# e$ r$ ~1 d1 G9 L0 I& y
- U8 n1 i' c2 _ // 功能限定配置(输出引脚触发方式设定)
6 H! Q0 Y; u5 V // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
1 _5 @7 g! D" j6 { EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,& f1 N+ _# k0 y3 ?
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,: s1 y- j4 v- z0 l |8 `& |: Z# L
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);+ U2 b6 o K) H4 M
3 f: q. O- U# R3 v! Y: p! H3 M // 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 k# @4 f9 ^1 f' \: r4 h8 O; f EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
Q: e! {& ^* j8 x9 ^9 f3 z2 ]: b1 J* Q& h$ }. a# _) @, g5 y
// 禁用斩波子模块
( L! l, }+ o4 z* Q+ s0 S- s" ? EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
( z/ j) V3 `/ c; ?. C1 E6 M# k$ K4 H' E" R+ O
// 禁用错误控制事件- g V/ T% s& f+ N Z" J2 @* j9 W# q9 b
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
+ \' b- I' N2 H( T w; N EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);' b( H& Q3 w% u- L
. e& T7 E- ?0 S) F' ?7 L // 事件触发配置3 _% R3 F: B$ r5 j
// 每三次事件发生产生中断
! k- P* W! M1 J- K b; U+ W EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
0 n3 L0 {# }1 A$ b) f) w; h // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
; k! ~/ s* J" g EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);/ _: G, g4 ]4 m4 J3 K
// 使能中断, |, J& n1 Z5 }/ A6 `$ v
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
2 X, h/ ` j; L# x G$ |* f1 R9 u0 E+ z6 }" s
// 禁用高精度子模块
3 Q& |8 M7 t5 ~ @* G EHRPWMHRDisable(SOC_EHRPWM_1_REGS);4 |- y5 z8 P Q+ ^
8 i) `) C) l% t# i$ [
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);- N) J5 Y, H8 d+ H. U0 p2 p- p' @
}- Q& E9 B; l, B8 Q& @
0 a4 h$ S% y% ]' vvoid ChopperWaveform(void)
) v. k |. q2 E% W{, }" ^& h2 h5 `8 a1 S$ G8 J
// 50% 占空比) k7 l3 a' k6 m- B( k$ L' v
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);( e3 W5 u( u+ W: j+ j
// 4 分频, c+ \+ O, G* j# `9 a" m+ A7 o
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);2 q5 }; E4 E4 J: q( z
// 单个脉冲宽度* D/ ]# H4 S8 q5 Z6 o6 r3 O
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);8 j. ~( r1 ?% l4 `
// 使能斩波子模块
1 t u+ w( T, s. @: }. C2 k EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
: ^7 E3 Z) Q9 u4 y% G; m}( Q' _8 [" E5 f9 ]9 B7 Y) B {. b2 A
% N0 A1 T9 v% \/****************************************************************************/
6 F. t) @3 }6 m, [8 {9 T( U' }/* */
( L4 B9 ~* m7 y X' Y1 y/* PWM 中断初始化 */0 M3 s' q+ G& i" {6 q
/* */+ j. x8 P) `1 z$ t+ f
/****************************************************************************/
B; I$ g7 b. @* L Avoid PWMInterruptInit(void), B$ x! D1 z2 w( O/ H9 A& m
{9 |7 w2 l' {2 b
// 注册中断服务函数
8 I/ x) n, }8 H$ w! X IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
% e$ c3 ~ q- O; @8 _6 }: \0 o IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
- B% `# _' `, D8 K' X7 T
' C/ `3 m. V' G& A J+ W // 映射中断
! \: h# n) S9 C, Y3 \ IntChannelSet(SYS_INT_EHRPWM1, 2);
( C ~! D+ g7 S IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
4 F2 d n- I& H" Q
7 C' E2 @: s2 Z F# x# g // 使能中断
- R0 u& i3 s8 N+ Q9 G) ^ IntSystemEnable(SYS_INT_EHRPWM1);) K9 I0 R4 o' |, H* e+ F m
IntSystemEnable(SYS_INT_EHRPWM1TZ);, u+ q. J) ?' n, h# R
}# @! Q5 y" ]" d0 V
" A1 C3 w& p/ P" \
/****************************************************************************/; O$ ~# d/ n" G7 v- q5 H9 l
/* */
9 ]4 z5 _' _5 d) s7 y% \4 ]4 ^/* ARM 中断初始化 */
" ^' _( x' W: w7 ~, _, f5 a: C) p# [/* */
* u4 B1 ?. k! y4 x* d7 l& k/****************************************************************************/
( M/ {: {! l0 x6 G0 G' q" e+ }void InterruptInit(void). p1 D8 x, J0 I# d! s
{
6 J& J: Z1 _5 c4 s // 初始化 ARM 中断控制器1 o9 c8 J7 C3 i2 n4 t0 \- Q8 B. K' ~ [
IntAINTCInit();
3 v4 u6 `, `" y( t' v* |: L3 c) Q! J3 _: [5 ~, h* ^% h: V* q
// 使能 IRQ(CPSR)
; K4 S/ A+ a* m5 E7 B IntMasterIRQEnable();
" A$ ^& b, Y) n j6 z- d4 a2 b0 e0 Q/ F- k# b
// 使能中断(AINTC GER)0 l! z% ^3 U% M# [! a/ j" ]7 V
IntGlobalEnable();
0 E$ K, k6 d% p& I g
/ N+ ]5 u' U, F- u' } l // 使能中断(AINTC HIER)
* L: k# P" i6 h) X6 S$ ^ IntIRQEnable();
$ F) w$ Y5 X0 h}
3 |" |$ \" A( |. E9 Q! `" X, }3 r) z, J4 ?
|
|