|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/- ~- v7 }& t4 l3 K
/* */0 |" Q$ p0 f" C4 `% _
/* 宏定义 */2 Z# D9 m" q2 P' H
/* */
/ x7 ?8 p9 r8 X+ O+ ?2 T. Z4 X/****************************************************************************/
3 O' g5 A& v+ j5 T// 软件断点% q+ E) U' K' l4 Z5 u
#define SW_BREAKPOINT asm(" SWBP 0 ");, X% v! t! t8 {+ \' A* V f
7 d" R& B9 k( N, R7 i! u' F// 时钟分频
) x5 V9 n" S% g0 y#define CLOCK_DIV_VAL 228
! g3 Z8 z; E( g1 G; a# f
2 z0 S: g& I$ }/ C2 V/ B/****************************************************************************/
+ l x6 y; a& |) Q1 {: s/* */8 u, q8 X5 R6 a' K6 F O7 S/ P, `
/* 全局变量 */
. L6 X- v0 _# [& y/ M6 T/* */3 H: W( S6 I* d$ t" j% Q, b5 R
/****************************************************************************/
( q' U) J, m2 K) xECAPCONTEXT ECAPResult;6 S8 \4 c: i ^% G4 _
0 m5 ]5 k; E. ]: S0 M! ^/****************************************************************************/9 q6 u7 ^/ j# C7 ^3 g: V. K
/* */, G2 x$ A* ]3 p S
/* 函数声明 */5 N" [& y7 p4 [
/* */
" G: W* F; x' q" z! I: ]6 [" E/****************************************************************************/( _! O% l: ^* d7 S& J! g9 T- }
// 外设使能配置
$ ?# E$ G* H& xvoid PSCInit(void);5 z" C2 R8 s7 _4 r" A& S" i( B
5 Q) g. G, ~4 s* q1 H
// GPIO 管脚复用配置% k$ M2 z- n& k/ A# S% G
void GPIOBankPinMuxSet();
p8 u# G( R9 G V7 `& y" e4 `+ `
0 e" h8 ~4 ?9 [3 V0 f5 |// 产生波形" ^9 q* Z- K1 ~
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);8 _% S7 i: G( j# w$ ^. F
void ChopperWaveform(void); H3 _8 h) N9 z4 s
5 e9 e- S j f( k8 I5 B& @& J- W// ECAP初始化和读函数8 ]7 P! u! |; x3 ~1 J9 V, v9 Z8 w
void ECAPInit(void);% N$ {; o. I I1 F
unsigned int ECAPRead(void);2 ?( W+ H' o9 L- m/ F* D
9 ], g7 [5 i, t
//ARM 中断初始化
- _; y9 t# N) ?3 ?void InterruptInit(void);
* X& h3 h( X1 F8 N6 N/ x6 D6 m* k: r& d
2 N( i+ L5 d* V& @4 z5 R& }// PWM 中断初始化8 k& @9 ?1 b5 d: }+ V* K0 ?
void PWMInterruptInit(void);* ]) `' W4 ]# `
// 中断服务函数
9 ]$ S$ a' |+ U1 Y& B- p1 u// PWM 事件
K; D# X3 u/ t8 k1 d" R) ^2 dvoid PWMEventIsr(void);
' [5 U7 h5 P! o6 N( D: `// PWM 错误控制事件9 w) S: c" X* L5 F
void PWMTZIsr(void); F- w/ ]( R( `+ y" l/ K7 k3 t
* `% }- K& K3 B# L6 G
/****************************************************************************/9 F ?6 t/ @7 P3 ^* x7 [
/* */
% A$ x& y# z0 y$ R/* 主函数 */7 p7 V; J3 s! F4 i
/* */
N; v2 x' g7 y9 U" f/****************************************************************************/1 G8 F0 f2 _$ y5 {
int main(void)5 O g; U9 u/ M) k
{) p0 f$ u' F3 f0 e2 ~' {
// 外设使能配置8 I! y8 ~; Z% x
PSCInit();
' z5 L: S/ j) Y# E! k* c) ?
& U5 r5 \ j$ | // 初始化串口终端 使用串口27 {; p. D5 F- G3 b% f
UARTStdioInit();
: v$ f. p) a0 z2 E
/ U' z! U0 i+ t# j6 B // GPIO 管脚复用配置1 ^& E* V0 H8 H3 e5 Y1 H
GPIOBankPinMuxSet();
6 J' x( `1 Z, H G
$ I5 m" E/ _- H+ h3 g& b: F // ARM 中断初始化: ` r9 A! H* [* p4 p+ a
InterruptInit();
& H# X V, U5 c/ e; Y) a
: T1 f! I& t/ ^. V/ V' _ // PWM 中断初始化
/ }. B2 ]( g2 ~- X6 j- R! E PWMInterruptInit();
9 l' \% V8 l3 O9 L
5 G$ b9 t. N- U, X4 | unsigned char i;
5 e, l& N7 @# g; ?9 d unsigned int j;/ M! [4 K8 h% P% U0 ^/ H0 z T6 M
3 D5 e' }2 p) u& E
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
* y: F; H5 t- V; I& s UARTPuts("------------------------------------------------------------\r\n", -1);
( }. z, @+ n$ {; S5 M UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
! j) _# |4 Z1 p( T) ]0 x // 产生波形
6 p6 F1 B' q9 F8 ]* g6 S PWM1ABasic(25000,50);' L7 b1 u* Q& h
, x: A- _- V& w+ n5 n; Y& a UARTPuts(" C6748 PWM Test Over!\r\n",-1);
% F* |+ s ^* r$ g' G UARTPuts("------------------------------------------------------------\r\n", -1);
: z' r% B* u% @' j0 L# E) D) s* \* ^" i, O( W5 q+ d
; f0 l, W# m' J9 V
3 |; U; z, o P UARTPuts("------------------------------------------------------------\r\n", -1);3 U# M, V! F1 w' K
UARTPuts(" C6748 ECAP Test\r\n", -1);
- r7 |4 i$ }7 G. h3 { // ECAP 捕获初始化9 @& x" ?/ _' g0 m
ECAPInit();0 ?, u3 H1 [. `6 X7 c
UARTPuts("Initialize ECAP.......\r\n",-1);4 _4 \* r' s6 L0 Z1 j3 O, G+ J- k
for(i=0;i<5;i++): p. V. @* W9 X2 _
{
7 V# z" g0 ` V1 N% |, z/ J for(j=0x00FFFFFF;j>0;j--); // 延时
! j1 n0 `- ]' U: a9 w ECAPRead();
2 @5 m: U, ~ ~% M5 z1 u% r }
; X! A/ Q6 t1 K2 S2 R0 `2 R UARTPuts("\r\n",-1);3 ?! g/ g+ f5 f$ u
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);6 k: X6 K! [8 o. |0 R
UARTPuts("------------------------------------------------------------\r\n", -1);+ q D, g4 |9 j* ]5 \
, E: [4 N/ ?4 M/ l. h' {
// 主循环
: C& c4 ^& j8 T for(;;)2 M) N7 a7 u" [9 V) x
{4 S8 w9 S) m4 A& w* d" a
% O; }+ \, E/ U; y$ Q
}
" D- r& w* L! N2 {) }9 m$ u5 G7 O3 P}
: Y2 e+ m1 e" [' {+ ^, k" v
8 s7 {* {) P6 F. F3 e# a( l" ^/****************************************************************************/7 V& E4 J; Q! M+ W9 q) e/ X
/* */
' B' V# u8 C3 t6 P3 y/* PSC 初始化 */1 N/ |5 @7 R3 d& Z# I: C+ \( K
/* */. v/ l. a( W5 R( f. \
/****************************************************************************/
' q' v! n. B% [, @, k! O8 M' \: W* H9 @void PSCInit(void)9 `1 K) T4 M/ J. c8 ?4 ^
{
r1 ~1 \# y3 {" {& e // 使能 EHRPWM 和 ECAP 模块
, X5 V P$ o: x, ] // 对相应外设模块的使能也可以在 BootLoader 中完成
( n9 D% U( g- U# [ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; X* N3 n9 M9 A- B) D PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);) K9 g" }4 {6 Z1 y5 t
}
& [. `6 y* P* @* E9 q
6 j2 e, G) s5 @( B0 ?8 T1 d# [6 H( a/****************************************************************************/
2 W! e) |7 F% r5 f9 W" B/* */
$ ^$ G' h+ ]2 _: A- u' c/* GPIO 管脚复用配置 */) m6 X' V1 B, N
/* */! ~) B/ v/ E1 `
/****************************************************************************/
) ~2 [6 M% W! _, E$ A' c9 kvoid GPIOBankPinMuxSet(void)8 X! i5 p3 F) m1 j* x
{
/ Q3 V4 W- _2 o z w- }+ Q* M1 V3 v0 L EHRPWM1PinMuxSetup();/ h5 a r; H. D( w6 ~4 {
( r, R E d. `" Z0 X8 T; p
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 n/ J3 D$ |% E* V // 作为捕获功能时管脚方向为输入
- P# }4 {: a s6 k) Z7 i4 `, i! x# u7 @ // 作为辅助脉宽调制时管脚方向为输出
; K5 q* }( n0 C6 X* U // ECAP2 / APWM2
. `" z8 C+ V$ F$ x ECAPPinMuxSetup(2);
8 S7 a O9 L, t! ]7 p; o* [$ Z
& S9 }/ H( D4 @- Z7 I // ECAP2 / APWM2方向设置为输入, ^+ p, X5 Q- @
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
: S0 \: i' R5 H& o3 d$ w! E, m}$ S( ?5 g* A5 m$ u1 M r
( I- J3 V% S+ b6 x
/****************************************************************************/' u- B& W3 L* f; ~9 e2 H L
/* */5 M s& U1 [. \5 Y" a' N2 H; m* H
/* PWM 输出波形 */1 G: e! A- a" C4 e. Z' h+ U7 _) c
/* */1 j, K- |2 f6 N9 @, W
/****************************************************************************/
e5 x. A" D* c3 C/ i7 ]! pvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
! d3 e8 ~4 r) e* j1 O0 T{
7 ^& O+ w% t6 x7 Z- P# k // 时间基准配置
, ^& P+ C; c) m$ @# O // 时钟配置
6 C) c q: v0 l8 E& a EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);) e0 b, U3 ? a% V# ~/ k
1 n5 J! v: g* W8 o' a5 ~ // 配置周期" J" u$ C2 F+ W
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
! R. }" K5 M2 M& F4 d pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
3 {$ F* H- e h, R% d1 s
: u4 `, L5 `) V' B: o* j // 禁用输入同步信号* n4 z0 d+ e x" c6 j7 k1 h+ E
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);' ~6 n/ D6 r% v3 N% [ a; V$ b1 A
# _3 s0 g* T; N/ I // 禁用输出同步信号( f: x" C* I; o. l, u+ H2 B/ t
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
1 Z/ ~' |# ^/ B$ y5 p
0 I8 @* l9 q* E! k. s! R // 仿真(DEBUG)模式行为配置
( c; H+ w. i! Y, W& @ w EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
# ]' P. E& M3 ] c9 U" k+ e9 t
! d9 X! S3 j' U7 v! Z+ W) f // 配置计数比较器子模块' Z& T6 w. ~9 o% R! `8 g
// 加载比较器 A 值
! f& v% N: X, j$ E# W5 j, I EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,) n6 o! ^7 m; |: a- ?2 n& Y
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- _& X& \0 R# V) l) O# o; ?, _
% n" x4 x1 f( P) ?0 O // 加载比较器 B 值* P* Z# A6 a5 f+ T+ T( X
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
1 C1 k* C% S! O/ w4 Y8 X- X EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);+ f' ~7 B$ q2 }' W8 j H
/ n1 E4 q! P8 [$ l* B9 E. z" N; e // 功能限定配置(输出引脚触发方式设定)
; y9 v* j( `0 O1 B" n/ V // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
, g- c, k2 J9 c* |9 G% v+ z EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,0 c9 a8 C0 N4 p& o* c
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
/ O0 L: n, h" M: H4 t8 F EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);+ X" F w# }- I4 N; K1 p9 R7 B
, N, X+ N$ t9 p) d3 o // 禁用(旁路,信号直接输出到斩波子模块)死区模块3 T* G$ S* F- D; i. ]) L/ F
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
* j t h- x8 Y1 Q4 X* K9 M- n2 O. K
// 禁用斩波子模块& K; J0 r( G9 `/ G
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
+ \+ M5 H+ D& q' N2 n
l: z. Q) Q2 @5 u8 R F4 T9 |& f // 禁用错误控制事件
, |. d, U, C4 k; x8 e' ?# Q EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);* x) ~% F; P1 P& S) [
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);! @+ U9 G$ }0 B2 Q; w3 Z H
8 g2 `) b3 s/ y, [3 V5 c5 [1 e# Y
// 事件触发配置
$ a s/ ]: [0 k0 B // 每三次事件发生产生中断3 p. d5 \, t2 H2 `4 C. Z
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);* w1 k) W7 M" T% Q8 N
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件1 X/ t1 [5 I) C2 }& e( D2 F3 ^
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);9 O) e. `! \0 w- l# m1 }
// 使能中断1 z3 I# C6 ~. R/ I, }% ?% G3 l: o
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
7 P9 ~4 e) E5 v6 q3 S- c
. b- T7 I; T! | // 禁用高精度子模块
3 ^ Q" r; G: R% b2 ^5 W EHRPWMHRDisable(SOC_EHRPWM_1_REGS);! N7 ]2 x) C1 K0 G2 u, P% X; N
4 ]. w" g9 ]2 t
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
! u, @; [( |, N: e3 l3 Q" F}
, G& R5 \; d5 q( m5 m6 h9 p/ ~9 ^! i5 v- }1 h
void ChopperWaveform(void): V. o7 g- b5 S/ m+ w9 e* C7 t
{
2 r9 v8 W* L& I# N# s, W5 b/ R1 _ // 50% 占空比, Z5 N6 F" b3 L0 `
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);* W$ f! }/ _7 U+ U8 r7 F
// 4 分频
# }- x v6 e8 q1 u( r7 x EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
G u1 ~0 {: Y. C // 单个脉冲宽度
P8 y# \8 B: D5 Y3 g$ ]( M EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
, k6 C9 `! P0 w& i, I // 使能斩波子模块1 g% N9 Z; a5 n g
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
1 }: o) A( h9 s2 S) {& R; ~}' j$ V1 ]7 H) i% F* Y( [3 b
1 A4 g- f3 c8 H1 ]) x
/****************************************************************************/% ?- i1 d7 d5 _- m+ o
/* */
4 r3 {; J) N3 w/ r/* PWM 中断初始化 */1 V7 ~# J2 u$ U4 O4 w: I6 B* W* X4 z
/* */3 I1 ~; A! D' w; J7 E" [) q! E
/****************************************************************************/
, c+ s7 O7 C1 R; Q/ }$ t; h ?, ?5 Kvoid PWMInterruptInit(void)
9 Y3 g0 s2 q% K{& X+ f" w& N/ t$ ~8 l
// 注册中断服务函数
" o6 v, t/ z' V7 p; I6 R IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);& P8 I8 `& O) b9 ^, Z
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);2 w, x$ [, f1 z/ U" a, O6 X
4 v+ a4 ]$ }6 Y
// 映射中断
* G) V5 P# q7 b* b A: \ IntChannelSet(SYS_INT_EHRPWM1, 2);
- J9 ~% j* H; V j% T* l; U/ s IntChannelSet(SYS_INT_EHRPWM1TZ, 3);" g" t9 I& r5 y; r2 @
9 B4 ]- G6 c. u // 使能中断
8 b1 Z% Y `: Q' r6 c G IntSystemEnable(SYS_INT_EHRPWM1);/ d1 E: e1 Y Z
IntSystemEnable(SYS_INT_EHRPWM1TZ);4 h9 T( H, d0 `
}8 Q' l7 S- G" |$ {) f, t X$ g
J# C* D3 j( j; ?5 P, ?* \4 x
/****************************************************************************/
: I3 @4 k6 ^4 _7 g m. P! s/* */5 o$ M+ w2 {, t6 v4 h" [* _* [
/* ARM 中断初始化 */ P: U% t1 [ A9 _0 B1 a E0 |, ?
/* */
( d* T! f1 R' Z S/****************************************************************************/
; U! X8 G( O' lvoid InterruptInit(void)( ]) z% C- V F1 ]! x* H% I1 r
{
" q9 i' ]: p4 E$ F( f! } // 初始化 ARM 中断控制器# Q( D" _3 I4 P( `/ T7 D6 n' a0 m
IntAINTCInit();, u2 D* _% d6 Y; [. \% ]7 k9 R
. k h2 H) Y3 G
// 使能 IRQ(CPSR)
' `( u7 g- V+ M/ C' P IntMasterIRQEnable();; U8 u, z6 L" h% @: n
8 ^# y9 ?0 y- ?+ ~
// 使能中断(AINTC GER)
" Y$ o' Z; W5 k, A6 \8 X IntGlobalEnable();
$ x8 b9 _! `6 [- E
1 g/ w1 X9 M/ J2 C // 使能中断(AINTC HIER)- M: r7 F2 e8 A7 P% Z" X
IntIRQEnable();
) X3 K# I4 h$ m% G% Z6 E8 B}$ D x$ \) N6 o1 a
* D8 t9 w7 h6 }( I1 D
|
|