|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
% Z# }: j: X5 I; M' C( j/* */
& f* D! b0 w M6 r2 f/ Q6 z) n/* 宏定义 */
* i# B A- T8 [/* */
9 F- S( j" H! O/****************************************************************************/) W6 ?2 Q+ P, U# c
// 软件断点 J. u. i7 R; U
#define SW_BREAKPOINT asm(" SWBP 0 ");
( u& F4 v/ A4 K+ [& `' o `
! }8 J' h G$ ^// 时钟分频/ |. ]3 @2 l& R" A
#define CLOCK_DIV_VAL 228
0 Z* v2 k& X7 E1 d4 v
" N7 U# J5 m. A/****************************************************************************/
0 Y1 i, e! I X* T( y( t/* */6 T0 d1 o9 h# k$ n
/* 全局变量 */: P( U. }- i N+ W9 N
/* */2 y; }* h1 y) a# o$ V" B
/****************************************************************************/. I+ q, X1 r$ Y$ s
ECAPCONTEXT ECAPResult;5 J- j# t g- U% A2 f/ `8 t* ^' ^: M
3 Z: U; G& I. ~: l* l- w/****************************************************************************/
0 S* o. |4 {. a1 g9 ^5 @5 k3 o3 f+ c/* */
* @; w H- F' [# s R$ k/* 函数声明 */
$ P7 i5 [9 a; e2 }$ _) Y! \" q/* */
" V& u( M; Q! q7 D2 @) U' J* C/****************************************************************************/
# i& n) k0 E* F! Z: {// 外设使能配置6 O: Y( J9 J- h# d* K9 }
void PSCInit(void);
1 K6 ?: T, A9 P2 i% i+ J- m3 ?2 y* c% p
// GPIO 管脚复用配置
@5 v9 n, ^; X$ W5 Cvoid GPIOBankPinMuxSet();5 m0 x! E0 }; Z) E0 E$ y& N
1 `( {; O, T" f# e- U9 e$ D9 U// 产生波形
9 m( ?* W$ S4 cvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
. U. i# U' N+ j5 \/ f1 Jvoid ChopperWaveform(void);
7 N# w+ ]# h# N( ~
: N, d0 a, i7 o6 s* n% q// ECAP初始化和读函数8 F, e# n2 E j! ?/ s
void ECAPInit(void);
5 F: C% b. u q- m$ X6 B8 X7 Munsigned int ECAPRead(void);
" {1 m: K6 u) Q. i7 U
" G- ?0 _( ]$ B6 A4 ?//ARM 中断初始化 Q3 x2 r7 ?- r8 I
void InterruptInit(void);
, C8 Y$ y) c; `, W8 ^7 a7 E
l6 B1 [ v% C0 K// PWM 中断初始化* g5 |% C0 `1 E" F- o% T* y
void PWMInterruptInit(void);
) Z( h; P) d$ n9 t G. V0 L8 @5 J v7 A// 中断服务函数2 |* b9 {% r+ ~6 ^
// PWM 事件
2 n/ r0 A0 f6 S' t6 g; e/ dvoid PWMEventIsr(void);6 a1 |( w2 ~- j4 r4 I
// PWM 错误控制事件
F# c$ R% x- ~void PWMTZIsr(void);' Y: S! i8 k3 t- Q0 K
+ M e; F4 v: |& B/****************************************************************************/, q/ R' @0 |, x6 _" l W5 P1 Q
/* */* @. Q$ u: p5 n! y
/* 主函数 */( {. W9 G/ q. k5 S% J. N
/* */
( v# Z1 U- q3 w; B/****************************************************************************/( E6 _- Z9 e; n
int main(void), q2 `( _ U* b! p3 W2 D
{+ {# G! n* |' E
// 外设使能配置& A; j" N* S! \# C6 b8 m7 q% k/ {
PSCInit();
9 _% H$ ^/ S6 w5 h7 R9 }# G* L& t7 B, C0 a
// 初始化串口终端 使用串口2' N- H. q+ E9 P: K- s
UARTStdioInit();: o) K2 v- B( W! C7 u) `
/ j2 ~$ ~$ }% C1 g' i! [8 |5 r // GPIO 管脚复用配置( W0 Y" i, L4 B# ~% z2 `4 u* k
GPIOBankPinMuxSet();
+ U6 d4 i; {& ^2 o5 x/ v8 D& c9 f' h9 D; F
// ARM 中断初始化3 _+ n1 h+ w' d; F$ o, P
InterruptInit();
& Q7 T! r' o7 m% e2 J0 n: ~3 b( y, i
9 A: m& | B: Z" X$ W4 n# c // PWM 中断初始化2 V9 }8 R6 |4 E. Q9 s8 S) R
PWMInterruptInit();2 U$ s' O6 P7 b" }/ N2 Y: v
6 k6 s2 q s, X3 F8 l/ R- O7 M unsigned char i;' R3 W/ Z7 C" s3 i% [; f" i1 K% t
unsigned int j;
6 j3 C7 u! A7 l% @8 Z; N! U# O) @/ @ C6 c3 m
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
9 Q3 r; w7 `* x( ~+ B UARTPuts("------------------------------------------------------------\r\n", -1);
. ?- ~8 `& ~5 i3 o UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
$ Z3 f$ M3 ^7 r6 h3 v0 @& w) B // 产生波形
2 f& u" b! g* }& _) ^) V- k PWM1ABasic(25000,50);
+ A5 s* z( [8 A7 `
. {! g M q- P4 J& U( ]5 g W UARTPuts(" C6748 PWM Test Over!\r\n",-1);7 x+ X" Q @4 z3 }2 U: m
UARTPuts("------------------------------------------------------------\r\n", -1);" Q. T8 \. I V J
0 L) ?% y; i2 t- J5 Q5 _1 m, p& T7 ~0 ]" I: N
# q4 q% Y$ V7 ~4 @0 f4 u$ g
UARTPuts("------------------------------------------------------------\r\n", -1);+ b# h' P+ \1 l6 i5 E6 t
UARTPuts(" C6748 ECAP Test\r\n", -1);
6 o3 t5 D/ ^ f* x2 ^3 q) e3 g& P // ECAP 捕获初始化( F( |, l# c6 q- i f
ECAPInit();
. y) [! m8 @3 y UARTPuts("Initialize ECAP.......\r\n",-1);, Y# q& B" j1 p5 a; ~
for(i=0;i<5;i++)3 r) s4 F! Z: W7 R+ I9 ?! A, e }
{
1 ]6 S: `$ A; R' I for(j=0x00FFFFFF;j>0;j--); // 延时$ Y- ^3 ~, r! q% Y; V7 A
ECAPRead();
$ q3 P. R, ^2 x; P }
9 r1 ?$ u. J( o$ D UARTPuts("\r\n",-1);+ h+ c* C9 o, f& F" Q7 D; Y9 T
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
: R" }2 ^" n# b y- c1 L' A UARTPuts("------------------------------------------------------------\r\n", -1);* P$ b0 ^3 `8 C5 G6 k- H! }
2 O m) i- R! i9 J0 @; b
// 主循环
3 x) v- Q4 x9 y8 J; u, V6 g for(;;), U# P# b+ S: H4 Y
{
) y. j& @& j( k) ~& K9 ~- v. D* j, j% G; J; X6 a. ^2 O7 S
}0 a, t0 D( j: L( n0 U4 L
}; F/ T# ~$ w5 d7 O4 n
5 E2 I/ |; O, Z& J6 u7 z3 A/ L
/****************************************************************************/
0 G* x- B0 a4 A" @- c! X8 N/* */# M5 |6 E; E, p* Y G
/* PSC 初始化 */5 h" P! r9 k7 M4 F) r6 y
/* */
9 |( L) W* l' r7 G) \4 n3 @/****************************************************************************/' c2 M7 ?2 k6 K$ C7 A
void PSCInit(void)
5 s( ?* _2 P, [2 L, A# z{ z. \, x4 l: u0 n
// 使能 EHRPWM 和 ECAP 模块3 a- Z, k) X% W% ?2 j$ I% r
// 对相应外设模块的使能也可以在 BootLoader 中完成. S" m' [9 z- |
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! ]% d. k: e z! F; l+ G, w# j) t PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 ?# N) U+ F; Z {}
2 o( i$ L/ ^# ^7 S% g4 d ]* a- T) r. ^
/****************************************************************************/
) I. z- O2 }* |/* */0 ?0 V& T5 I6 Z! @
/* GPIO 管脚复用配置 */
- a+ S5 Q: h, O6 c" U/* */
8 g4 I$ @# O8 \2 a4 \3 e2 L/****************************************************************************/+ x# X3 x, D: b0 s
void GPIOBankPinMuxSet(void)
6 k) b0 `; c/ M' G# Z3 M{
! a7 C+ |# a h; p! O EHRPWM1PinMuxSetup();) {) R4 u* B" E/ \1 `2 [0 ?
0 R8 y, B4 d0 M( W! o( w // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)6 c' M2 f) b; z# \ y1 ~. Q; E4 Q
// 作为捕获功能时管脚方向为输入
) ~* u* w" t& i; |5 [: C2 H // 作为辅助脉宽调制时管脚方向为输出: G4 y. v, [1 A: W r
// ECAP2 / APWM2
0 n* h! O7 r2 R ECAPPinMuxSetup(2);
8 }4 R% H' x; {' {& v0 D+ S4 A& ?* S' O& I
// ECAP2 / APWM2方向设置为输入! O# f' K) w7 _
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
2 n: b; [% h( G# F) g# I9 `2 u}
6 `2 M0 l x! N, P, y
2 `) A# d% D" d; H R. o1 _/****************************************************************************/
7 i: ]/ m* T4 B4 a' S/* */3 I* u, P. y, Z# t: i2 [0 p k8 d
/* PWM 输出波形 */
: E5 W, L2 j& _& w& ^/* */! Z A q6 I) V1 ~& ~5 i
/****************************************************************************/
: j4 I4 {( o7 hvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
* h6 r" C+ g& X! }5 \{- y q6 h, [ l A m
// 时间基准配置
( Z4 x( r/ ~+ R* h6 C // 时钟配置
6 p* t; { }' B; ~& K% g& B EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
: N$ H: q& e9 D) `( [
% c% X+ s" z l7 P+ b // 配置周期
/ ]$ W% E: {. I- u EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
1 m! w! y9 d# S8 }& [: x8 _$ Z( w4 R pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
6 E) w, z- @" e5 o8 m" O/ K
0 c2 L% D# t: T K$ @ // 禁用输入同步信号
2 F/ D4 R5 ^; W5 Y7 Z EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);( r! {: Y0 R! K8 D
( P0 V+ f, N; t6 C! u& h2 w
// 禁用输出同步信号! r. U# v! p { \
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);; T- j: g0 O3 V" o
9 N' D! h' n# W9 L1 R% i: I // 仿真(DEBUG)模式行为配置: r, o# l5 s0 r! w
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);. Q! ~% `& f6 I3 m2 K3 r
3 ^" |# ?- k: W# ^5 z" \2 f // 配置计数比较器子模块* j2 W& o& w0 G6 {3 K v
// 加载比较器 A 值: A1 T# L3 n3 h
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
' R8 ~# R* E' Q2 L; S EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);$ J6 D) V( [) e) i
7 L6 f- d+ k. _$ O' C$ U // 加载比较器 B 值. O; t- m% C3 M$ W
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
3 w9 j; D7 A3 z: N. X2 ?0 W ^0 o EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);) r* m9 j: @( I; S) ~8 a
, q! M- P } c( t, n // 功能限定配置(输出引脚触发方式设定)1 @2 n% |1 ^5 S! L) G- K1 H0 h, O
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
: t* h5 x) i# ?) U1 L6 t: M EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,; Z. Y+ F/ W) G. k1 B
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
! i1 A5 c6 N2 P) h2 G EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);; b1 b0 n2 Y/ V+ L* x" b/ C6 `; t1 B
' F5 p6 H2 z5 N$ v" I6 u# ~
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
+ y k: r8 O) s9 n EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
6 r5 K4 _# {5 _
' q' |6 _- d# ]8 X9 Z9 m% N- Y // 禁用斩波子模块6 ?4 p$ h6 P$ Y: s
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
7 E. e$ t& V& I- q3 b. @" h: T( N. j
// 禁用错误控制事件
& P3 C% k! ~- g; S$ }3 ` EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);% C( m! B6 |$ P2 @
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);8 r# o1 l# u1 W- U( {6 V. k1 y
$ `' q0 E2 f' v& o) R // 事件触发配置: p0 y+ E' p' L" j+ A# V0 S7 F/ T
// 每三次事件发生产生中断
0 _- _$ z% q* A+ y+ D. B% ~! @' u EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT); v5 M8 K+ P/ ]
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
% K7 y, V' o; ]2 }, B EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);( u! E0 ]4 D0 \! k! Y
// 使能中断
T( D" a/ t6 N EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);; w, P! Q ^4 F
4 s6 p. l5 l/ ~% }
// 禁用高精度子模块* h/ D6 ~9 D+ U8 u, E5 |
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);0 d6 K4 B- F! W8 S
% c- O6 F. w4 j# ^* V1 z" G UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);" _4 f4 |0 E0 K, G) X% B
}
' z. a2 P+ r) R2 u5 f1 m3 g; F& q" F* W
void ChopperWaveform(void)
/ c/ Y q/ X: R5 Z) x% n{
/ `1 }/ M% _+ {7 H // 50% 占空比5 u- H: @2 v0 G9 L5 i
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);$ m% w7 G' |. W( f6 x+ v
// 4 分频
. u9 p1 q8 R3 q EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4); k' G* P g- l
// 单个脉冲宽度3 S6 L2 `7 X6 y" K
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
1 e8 n( h5 f( x9 @' g/ H // 使能斩波子模块0 n* [+ `0 \4 @$ H4 m2 O; ?
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
* \+ W3 ~$ C- p. v2 K- a) e}! g' d- h7 R/ X. J* j* i- w; z
4 d( B% h. J- b) y+ b4 z/****************************************************************************/
0 Z: P/ u. X \) B& ?4 i9 l/* */( |2 V3 P- p; a% ?6 I9 g
/* PWM 中断初始化 */2 \" J, N# L' P6 q9 u4 g! m
/* */
, G+ m1 J. a* X6 f/****************************************************************************/
% i1 ]5 a: A Q5 c# kvoid PWMInterruptInit(void)
) P3 P$ A6 s2 ]& ]- G{
9 v3 M. x/ @' I // 注册中断服务函数$ z; m0 `* l. e6 r4 k
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
3 w3 @/ n+ F Q4 P4 y" F8 J: L7 Z IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);7 I; R4 [5 W( E# _4 c) b2 t2 P. ?, s
& j( L# ~" n8 w1 c' I4 c // 映射中断9 i: ^; d. S) v$ r0 I8 q" C
IntChannelSet(SYS_INT_EHRPWM1, 2);: U9 S. j1 _! f
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 [! {) N: ~7 C) d( k6 l$ W/ }, f
( ?: ]' U1 M1 f+ F1 Y- H, _ // 使能中断* Y8 y4 g7 `. r4 h# J4 V1 Q
IntSystemEnable(SYS_INT_EHRPWM1);
% q; | v) O, W2 N IntSystemEnable(SYS_INT_EHRPWM1TZ);" D! j( A- B& U+ B
}
$ g1 X1 M4 j5 P) {9 N8 _. \0 @" A
7 E) t) n, R" D% ?! P3 b! l5 ^/****************************************************************************/3 b# u: S' \8 X1 l2 X; {2 I& `- i5 [& N
/* */* x" j! ~0 @. g& y7 A- k9 k0 a- s- W1 u
/* ARM 中断初始化 */
' E$ ]( p( D5 t4 e: [/* */
* w- [: j' f" ?0 {/****************************************************************************/
" N2 e( a V$ t I, ?- h6 _void InterruptInit(void), G2 p3 G8 L. t6 R
{6 p3 ?. a# q" s! B1 Z! I% W
// 初始化 ARM 中断控制器
) H" a6 }6 t" e7 B) v3 t" s. r7 e IntAINTCInit();
$ w1 Z* K n. b7 O8 W+ F* p) {
3 k. [0 ~: |4 p* c // 使能 IRQ(CPSR)9 {- }( K* {2 j0 J$ J& R
IntMasterIRQEnable();
, B2 T4 B! L E% ]+ {
) k$ d" {, y! f1 w( [ // 使能中断(AINTC GER)! `8 ? }, V( e/ I7 p$ m" k8 B
IntGlobalEnable();8 k1 k6 v0 c" M1 A- b
4 ?( g/ T' \6 ^ // 使能中断(AINTC HIER)
) I3 U4 p8 ?6 n( d3 W6 e0 p* p IntIRQEnable();
: D: ?, X% o2 Y1 r% _5 s, I, J}) n' _! m* H" k8 g# L- B3 K' S
+ G! h; n6 N4 M% ~) b' \
|
|