|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
2 V$ Z7 N, z9 R0 b/* */
S7 y% N; ^0 ~4 U! _* O" {2 X/* 宏定义 */4 i: B$ c6 B6 x2 s7 w% D, }8 F
/* */# d: G2 i1 H/ M1 |- @
/****************************************************************************/' Q" m+ S: g9 ^' e5 n M
// 软件断点
2 I! v/ i$ u0 E. o#define SW_BREAKPOINT asm(" SWBP 0 ");: ^5 B( C4 w8 J1 Q. A/ S2 j3 j
5 c$ l+ A) Z; c9 R# b// 时钟分频* f) A, @6 E) s X; K
#define CLOCK_DIV_VAL 228% l( F- L- T. {4 J3 I4 M$ n
5 L+ u) i3 L2 K' s8 R/ M/****************************************************************************/
6 P8 a6 J# |7 o( `/* */# q, `# M" `- j3 d3 r" ]
/* 全局变量 */5 _. a- x! S0 l5 _3 p
/* */8 V+ p# @7 }' ^& E: l: ]# Y( W) N) x
/****************************************************************************/9 D! i# c4 E2 L# w8 D' `
ECAPCONTEXT ECAPResult;
/ p: i# r, n' O( ~& P
& E1 \9 o1 T/ w/****************************************************************************/
2 R, h3 i' }0 m- i/ m- R K/* */5 S7 X9 X2 Q7 t7 z& R
/* 函数声明 */
# d; r- p' E! p( o/* */2 ?! r+ f! A; ?0 S
/****************************************************************************/
5 A) v4 ~8 ~1 m// 外设使能配置7 d) a! g2 s- U; p8 W1 ]
void PSCInit(void);8 s! w8 x0 p" J" j4 i. _6 u
& i# T* x. a$ ] Q( C8 @6 ~// GPIO 管脚复用配置8 S, X# Y5 M! S% D* J+ R
void GPIOBankPinMuxSet();
% {; S0 c9 w; I) Y
% D* b) O! W9 h$ C# |/ s// 产生波形 g7 z5 X8 f6 ?: p( V5 u+ |
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# l* C7 Y; z( kvoid ChopperWaveform(void);3 G% o! ?. ?% R$ D# w+ o9 S
; G( w1 r/ q: G% Y5 X8 F9 `// ECAP初始化和读函数
/ l1 D$ U' U7 C6 {5 evoid ECAPInit(void);
- M( X3 T/ i1 }/ K# d9 ^4 Funsigned int ECAPRead(void);9 X+ l0 g. L* _* D/ f6 \5 J# j
# q* q7 C9 A' Y9 A0 k: h8 j
//ARM 中断初始化
# @5 @" k; @. Wvoid InterruptInit(void);
, S6 O) H; j Z% K$ w! T$ l& }
7 K3 t [& A8 j0 ]% P// PWM 中断初始化
1 V& }( X6 ?! s0 c9 A- l m( nvoid PWMInterruptInit(void);( Q- j) }# y; c0 N) ?& g& f
// 中断服务函数: a; ]+ e% v$ p) e) T# U
// PWM 事件
% O- G, ?+ b2 O0 i" Xvoid PWMEventIsr(void);
* b7 T0 ?7 r0 y// PWM 错误控制事件
0 `$ a3 A$ D% V7 s" P0 f6 t( Nvoid PWMTZIsr(void);
* J7 ^6 u& T. y% G/ x# I5 e
9 U) P7 P: h g* P0 [/****************************************************************************/
# }6 s. j6 G- k2 K/* */
; }# L/ n4 [6 o i7 ~8 W7 F# k/* 主函数 */# J0 I/ d' n& V! b/ C, H
/* */
3 `- N4 F$ y' y1 ~/****************************************************************************/
- J, i/ @8 ~) O* L" xint main(void)- S% B! n9 G( X B% T& v
{
6 r7 Z7 T& U- m8 I3 @6 [4 n // 外设使能配置% ` T$ D: f% G2 R5 O# ~! _
PSCInit();
6 ^$ R* ~# C) ]# j
% v3 I& h( { ^- g) {" i8 @% I // 初始化串口终端 使用串口29 K# B( y5 x' }. v( C5 s* h; M5 u
UARTStdioInit();
; p; m- |9 g, R: i7 m2 H3 h
% U# X6 P. J$ k // GPIO 管脚复用配置) w, S6 |0 q) `& v
GPIOBankPinMuxSet();
, i! X/ L% h. z! Z" j! w/ i9 q- E
, @ [' ~/ e) y6 t$ `( \) U // ARM 中断初始化9 Q! `- @3 _( A. f- N7 O" l6 j6 |
InterruptInit();+ x6 R& A( {+ q* N( }
- \4 c! }2 T! H. u9 p5 f2 M0 W
// PWM 中断初始化0 t8 a" S. [$ }( h" I. c, P
PWMInterruptInit();
! H, J8 p/ T% i+ f* |8 \
1 P4 d& F% W! ?0 ~! Q2 X6 u% \' O4 n unsigned char i;7 T, v0 A+ t) E* x7 }* z' |. {8 u" f- Y
unsigned int j;
9 S1 e! B1 ?3 _. D( V1 t) g8 v- [0 M/ {2 H: s$ Z. e3 E
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);5 v L! U0 I) r1 J
UARTPuts("------------------------------------------------------------\r\n", -1); R* M# X7 k' S& r/ t
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);6 \ P: z; W$ @* n) C+ u" V
// 产生波形$ K3 M! N% Y. ], h! c! I
PWM1ABasic(25000,50);
3 M4 h2 Z& C/ m0 R. F+ ^
: f2 H) ^' ^7 c2 y$ t3 Z) x UARTPuts(" C6748 PWM Test Over!\r\n",-1);
* W3 @. z% Q' w+ L UARTPuts("------------------------------------------------------------\r\n", -1);
* d( K0 k+ M, k. n. j% ~, P) j( _ k9 J0 v5 r( o) K, X2 ? f
$ e# L, z( v, b7 L& V
$ a0 l& k" R2 F b UARTPuts("------------------------------------------------------------\r\n", -1);
! F( W3 Y8 v! o; L UARTPuts(" C6748 ECAP Test\r\n", -1);
8 d* n) F b2 S# k // ECAP 捕获初始化
1 X% G+ N$ V+ C* g$ x+ T h ECAPInit(); w2 e: b, |! G8 Q1 }7 l7 O7 S
UARTPuts("Initialize ECAP.......\r\n",-1);
/ b$ |% y( ~' s3 d. x' g8 G for(i=0;i<5;i++)
* y) f: X# Q* Y. Z6 R {
: S9 y; ]8 t, B: C$ f/ a for(j=0x00FFFFFF;j>0;j--); // 延时9 S' V8 [- f: R/ k* |3 g
ECAPRead();
, T% ~2 u4 P+ \ i* d9 r }
( i O# {; r9 F9 s" u) T4 i2 T$ x UARTPuts("\r\n",-1);
2 s0 o" d, i- J& ^* H2 X0 d, w/ p( h UARTPuts(" C6748 ECAP Test Over!\r\n",-1);& x- d# e% I( P, L/ Z1 l
UARTPuts("------------------------------------------------------------\r\n", -1);3 j% w" [8 G @* g7 j+ \4 G
& @# L" I& d- j( R$ I# q# O
// 主循环- p) a( S/ {9 g! D) g6 @
for(;;)
x4 d' y0 m# ~% c8 m' J$ B {. U5 n# r/ [& s* J- f
/ z1 R0 ]. x" N3 Z- A- {/ D }
, v: i( ?2 D( U) ~9 o}
$ T! f# i4 u, n, Q7 h' A
+ `8 q7 z3 s- K8 r* C$ n- v( y/****************************************************************************/" D. q5 o# b& q5 y6 o
/* */$ v7 S$ F7 c: p+ ?- x5 w
/* PSC 初始化 */6 d/ ^- ^$ ?4 ~- |/ @# O" C
/* */
8 p6 N9 a) R: T! h1 A! e3 b' R/****************************************************************************/5 t$ \; ~ r0 _" _
void PSCInit(void)
$ J* U% g8 z3 ~$ r! x5 s{) s1 W6 a1 T% X. s; W6 ~ H& `/ L/ o
// 使能 EHRPWM 和 ECAP 模块5 m' ^* o# }' a& y3 z1 ~
// 对相应外设模块的使能也可以在 BootLoader 中完成
7 z+ S9 d7 p( g3 x6 h9 C0 C# `9 M PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);, q" ^- h6 j, w
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. t$ k* J' q2 G+ A( J8 [& _}
- Y# O) L6 m8 n b9 t8 l7 S* r: r9 \7 i( S; H/ \
/****************************************************************************/. h, m5 u. l i) K
/* */( P* w* {- e# G' _5 r. @# l
/* GPIO 管脚复用配置 */
( F* I) J( _& J5 V/* */
7 Z* o! o+ g d& Y" A" T/****************************************************************************/, V/ R: C3 n7 ?$ B# [0 i& y
void GPIOBankPinMuxSet(void)& [3 a* Y6 G8 |2 W; W
{
( B' _0 m: G' L3 x4 A EHRPWM1PinMuxSetup();
% a* a. k8 S- W M4 K* w+ B4 F" z f
1 T+ O- t3 s: \9 ]* g) y // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
( x0 e. z: @! v // 作为捕获功能时管脚方向为输入% P1 k$ V* C" O% ^' D
// 作为辅助脉宽调制时管脚方向为输出7 `, |5 I/ F9 ? h) i
// ECAP2 / APWM21 q+ m1 C6 o- g9 [3 q8 q7 }
ECAPPinMuxSetup(2);
. L7 n$ ^5 t5 C* e. x7 ]9 i
$ z4 ?0 s1 ]& U: ` // ECAP2 / APWM2方向设置为输入
& l7 G9 | W- Q6 L0 y; [1 ^- j GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7], y8 {0 l8 M* r% k, l
}
% K) h7 X$ P# X9 D$ J) e5 L) W. b0 a( ^; D: A
/****************************************************************************/
, ?3 G( Q1 y! i; l7 W& J4 ^ q/* */
% c4 h+ m+ u7 \1 F: W0 M/* PWM 输出波形 */
+ b9 m& a6 w' A/* */ c% ]& g6 R- E* ]- i" v
/****************************************************************************/' F; t, r! g0 [0 K# R: d
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)6 r$ n, P& _/ H3 _
{. s I& d( I/ R# [- A/ P9 J2 t
// 时间基准配置
8 s, g& g- Z: v0 o // 时钟配置9 G( j* F5 j9 o6 J. {2 c
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);9 n6 m: @, a0 \6 X
1 D% W7 Z7 o, N w4 j // 配置周期
% F% |( k- q" H EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,4 I! f/ [: N* ?3 [+ \/ a
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
; o5 H( [- Y5 @6 I N" R3 ~- g" P; }6 S
// 禁用输入同步信号
* ?! ~1 v9 b* d: W EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);1 J" N# {- C9 Z+ W9 b2 D7 {
9 i. }6 q2 ]6 i O; G // 禁用输出同步信号
7 K6 u, H* h7 r& ^ EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
# d% |3 {" N( Y, @# t, v! j* b
$ N \' M! u+ W! u' ]3 \7 q // 仿真(DEBUG)模式行为配置6 }& F- t) P" v: X7 _
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
0 b0 E9 P% _* b8 u7 X
- C+ K3 Z" L( }/ B // 配置计数比较器子模块
" o7 [! _- u, W" _: m9 Y // 加载比较器 A 值: Y0 o5 r- w" y6 u' Y
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,. l0 w6 H' \1 s; L
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);( x/ {. E K% N5 @: T; w
, L/ e# U) C3 k5 L z // 加载比较器 B 值
: x+ V7 k: |. _5 b6 P5 _: q EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,1 v1 a% M( Z8 H( j- w: d
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' ` j0 o, W& y) }/ p) H8 s- N8 \/ `0 [0 b! [/ {9 t+ T
// 功能限定配置(输出引脚触发方式设定)' ]: j$ S$ K$ z `. P7 x! g* H
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
9 k- l3 N* Z, g EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
5 ]7 Q ^% |! Y1 i/ W/ W$ _4 Q EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,) }0 L" V( H0 W. d
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);1 m3 X' n/ h3 V
) H* E) c0 v& |8 I; B1 B
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
; J3 q0 w: O' R3 U EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);$ @& {3 o5 Y- l. o' o# v
( a4 x0 j$ P& f$ _! z- E( n; @ // 禁用斩波子模块% E, ]5 ~+ M# W( Y5 l: ~. f$ Y% o, s
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);; F4 C/ h, n7 t$ {4 i
. s9 t1 Y4 @' K1 ~: ]' m // 禁用错误控制事件* j b$ |: n- Q' D7 l6 k
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);0 p6 r3 {9 N( Z7 z7 L J
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);: e2 T3 b# R) K* l/ B# ?
& g9 ]; b: K" B$ F4 _- F& x // 事件触发配置6 z; s5 I+ E' b1 y
// 每三次事件发生产生中断
$ C& f! ~6 |! a: m& r EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);! r9 N! p6 \" L2 _+ ]- s
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
# C3 O4 E2 u: H9 J EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);! x4 P- U/ N' M- t1 T' {
// 使能中断
* V8 |* G1 k9 K' w EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
% S' A9 b0 ?4 n* I E2 _6 x O8 I, ^* b; g5 q% n
// 禁用高精度子模块
( Z, Q' s5 M- v- V2 O EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
" F& m W+ Y0 U: e# ]( K7 m, ]4 @2 i; m' U O! F9 d! G
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);# |" S: o+ D5 K( L+ y0 q- _
}
1 v2 r% ?4 {9 ^/ h4 \# U5 E8 {% F3 x9 J6 g1 |; O) H0 ?
void ChopperWaveform(void)) Y j( z k3 W
{2 m2 a7 N* c" g6 v) {+ N
// 50% 占空比" n! E' L8 o% l* n }/ ]1 T, X
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
; d& U! t, [2 {* Y7 L // 4 分频
- ]# X2 n2 q/ l W EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);- u* A( R# g4 m y, y/ g
// 单个脉冲宽度
3 S) B! \/ I' d6 F1 s7 m EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);3 Q& z( ^" z7 J
// 使能斩波子模块2 I# X3 l! Z8 z
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
# t: {& v+ ? z6 c7 p}
/ v- O p; F2 c0 w" S" Q% d1 ^0 \+ e% Z! L( ?% G7 B
/****************************************************************************/
* l8 k( }5 A. ^, w& p/* */& `2 A+ M; R0 s4 ~" |" o. s. Q
/* PWM 中断初始化 */# @& R2 s! T8 r3 C6 M
/* */
% ~8 Y8 Q) T. Z$ `/****************************************************************************/: }- d5 W, c: n; Q. N# I9 u
void PWMInterruptInit(void)
# P/ m9 o3 N/ V' A r. _9 m$ N{" V+ E6 C& i8 N' _/ U$ R
// 注册中断服务函数
0 e& k4 q8 f5 u! i' X IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
`& m" P7 G0 T5 w4 t IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);7 }7 C- i7 X9 L0 ^* t: j
' m+ d6 F9 U1 B
// 映射中断
# k* ^) V& d6 O. P, T1 A IntChannelSet(SYS_INT_EHRPWM1, 2);9 f' E1 ?" t% q& F* i! X C
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);" I2 g+ Y: ^ V4 v# z
% x9 ?2 c/ G$ E, S/ u
// 使能中断
$ y9 y- ^ m. x: Z IntSystemEnable(SYS_INT_EHRPWM1); D% p( I0 m/ Q1 }! `" _
IntSystemEnable(SYS_INT_EHRPWM1TZ);, Y1 m7 ?( p. R! l. x T5 W& k
} m' H5 q3 e1 O/ N; d
0 N" Z# \- u/ V( w; g1 b9 G0 t
/****************************************************************************/
6 x& F3 b" M+ a& {4 W; C, Q. r8 N/* */
; b O% I% [& o: M) U/* ARM 中断初始化 */
# a$ x: B% r" ~5 s& A/* */
% [& c( [) t% g/****************************************************************************/" x0 ?4 J4 q3 q0 \
void InterruptInit(void)9 x% \, R& M2 h: T6 K5 {
{
4 K1 x6 l* n0 n3 b% [ // 初始化 ARM 中断控制器% I, i7 |. ~: r, r
IntAINTCInit();) t/ f- A, F; Q( [* G# b( U
& V+ T$ E; s- L! C( M1 j7 j4 o9 A" x
// 使能 IRQ(CPSR)
B, E, G m4 Z: b' ?6 D! H IntMasterIRQEnable();
8 _& Y. v7 U; b W1 |: z
6 R5 Z% j5 o+ @$ W) i3 G' l0 @9 w // 使能中断(AINTC GER)8 W. a; D e: t! U# n9 J# O) C
IntGlobalEnable();
i |, @5 l9 N) t3 Z* k/ N7 M, n2 ]: p$ n; `
// 使能中断(AINTC HIER)
6 \( d2 h+ Q' O+ `' F" U* s IntIRQEnable();1 u+ E9 e" u' ]( W" R6 L! m) ?# c4 ~0 f
}
; `: C! W J* l
4 P1 j b2 P2 K5 k* D |
|