|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/: J9 |3 g1 e+ t( Q
/* */3 A6 M4 M; `$ ]
/* 宏定义 */
+ L: p5 [( t& M. p3 Y* Y. z" q/ V/* */' k: g( r- a7 y1 r& t0 D
/****************************************************************************/9 b8 B3 P/ T. r. u
// 软件断点4 l* x& l2 @1 n7 o- W! w
#define SW_BREAKPOINT asm(" SWBP 0 ");7 g( }: q9 O; K
) F; Y1 }% A9 k9 Z// 时钟分频
r1 S; I# ^# v#define CLOCK_DIV_VAL 228
8 K) U- E7 H9 N$ a0 L7 B- S+ k3 |' E; s9 _, g/ U- v3 c4 w# ?
/****************************************************************************/
9 a1 E( y5 ~4 q4 Q" ? w" h9 d/* */
8 p( Z; t, q7 H, }$ E4 ~7 c/* 全局变量 */
+ e' r$ J t+ ]) m* P/* *// m4 t3 M2 _0 p4 ^
/****************************************************************************/
& N6 g) `& `, n( f* o8 Y$ \ECAPCONTEXT ECAPResult;
2 Z- Y' S% j* O& N+ V3 Q/ m/ G/ n$ E1 \- M1 H9 J8 B
/****************************************************************************/4 s; g1 ?& D, a% t" a% E2 u$ o# B
/* */
" l! H) I$ r1 K% v9 Y2 C; X/* 函数声明 */
3 f8 G4 R3 |5 B5 \/* */
* T+ m' c5 C- f: Z) H* \. Q4 k& y/****************************************************************************/) G! ?% f' g' a4 h+ ^
// 外设使能配置
; `' T& [" M% U/ gvoid PSCInit(void);
- O6 U+ R6 l# r3 K9 x
Z/ p" b0 o6 J8 S, X X. `+ s- ^// GPIO 管脚复用配置' k3 K% K3 |) s+ g3 q6 F! B, k7 W
void GPIOBankPinMuxSet();: N2 }( L: H: m ?2 a# V& d
8 W$ z3 q. ]% l# k7 U: O// 产生波形
2 r' q" ?1 B6 x. e' K5 @void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);% h: q3 p/ Q+ ~
void ChopperWaveform(void);, n* ?8 q3 u- D7 B* c2 K
: I- c* L7 l" m; I2 D2 j7 d/ \) t// ECAP初始化和读函数- g" E0 T! M. O1 d
void ECAPInit(void);
& G3 d' ?/ [# d6 R' Dunsigned int ECAPRead(void);7 F" G3 y" X h7 n( D) v( f b
; r" u: m0 C# V
//ARM 中断初始化& R4 c; s# g8 h& `1 L$ R: d' L* y0 ]
void InterruptInit(void);, k- o; x2 S6 R
: X: i0 Q4 x4 D// PWM 中断初始化
5 ?" J+ o: ~' D: c, Bvoid PWMInterruptInit(void);
* B8 X1 v4 w2 Q$ V) \) x3 c- B4 g// 中断服务函数* B3 l& d8 H1 l' f4 r
// PWM 事件$ g( q+ Y+ h; l- x1 w! }
void PWMEventIsr(void);$ w! O7 l3 o8 G
// PWM 错误控制事件* o9 u: p) m, q* R9 k8 z
void PWMTZIsr(void);: B$ C5 U+ @, \: q2 ]
4 g7 |! K- y; j. N$ f0 C
/****************************************************************************/' a! y( l5 T: @. l- S2 W
/* */
- u; G0 t: \; z8 G C8 _1 f& E/* 主函数 */4 C+ F8 _4 S; T6 T( C& ~
/* */
% O* X' d! @! z: e4 G/****************************************************************************/1 n* d; B' d0 e2 t/ U7 V) K
int main(void)* a a, M/ ]( Y, s8 b
{
" m( Z( _9 K6 f# q0 ]- M0 Z2 C // 外设使能配置& s- d: l' t6 Q; ^6 ~( j
PSCInit();/ F1 e# j$ E) m: L. D
- x/ x3 A& [& I3 [$ F2 d6 S
// 初始化串口终端 使用串口2
$ C9 [1 |% I: t; U6 X7 i UARTStdioInit();
) ~& {: H0 _7 z9 u3 ^* j8 S
+ U( I2 {2 z$ M5 X // GPIO 管脚复用配置
6 _/ I3 L T" n' j( J GPIOBankPinMuxSet();
: N: `/ E& G" P0 {* p; d A2 a0 v$ q; V5 w. `
// ARM 中断初始化
/ C1 U- }( T$ Q9 n2 f3 }; \4 m4 \ InterruptInit();
6 d* u/ a3 V8 S% i$ U( R5 }
( ]) T- T J: L" i# m& _' _ // PWM 中断初始化4 W5 B: ]6 D( `: v( H! p
PWMInterruptInit();
# f" O9 u* s7 ?3 {" f u$ u, w: W$ m0 X+ }, B
unsigned char i;- X* Y' Z3 t$ t0 t# ?' E1 i
unsigned int j;7 B: ?! K. [. g' W7 V( |
8 K" U3 b+ v& `' {9 C
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);3 z2 t% |# N& u( l+ W) ?5 o
UARTPuts("------------------------------------------------------------\r\n", -1);" \: ~& `0 w* I# m0 r3 N
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);% w: A6 q" Z- O7 T) B( w
// 产生波形
" H- N* ^3 I+ t( D* J; d PWM1ABasic(25000,50);
4 v: m% ]4 d( G% l$ O& O Q5 _# h
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
# v7 u9 P$ {. g- {' i UARTPuts("------------------------------------------------------------\r\n", -1);# r I! t; s0 B1 K
2 ?: J' J3 S8 m$ u. x1 J
3 J! F/ H6 I: J- S6 x3 n" }; l
, J5 I* n9 A' b8 W1 O! v UARTPuts("------------------------------------------------------------\r\n", -1);* j% ]3 |, h( T# [8 H2 H, N8 G6 c& ^: K
UARTPuts(" C6748 ECAP Test\r\n", -1);
3 C) D1 w2 B/ l7 B9 v5 C8 y1 Q& K // ECAP 捕获初始化
* a2 N+ ~, o" X# V# A ECAPInit();6 V# x# h* {; A7 I4 ?9 b6 ]
UARTPuts("Initialize ECAP.......\r\n",-1);
/ L3 S: U$ h7 x) n0 C8 {/ ?: z for(i=0;i<5;i++)' g0 @: r9 F* ~9 U2 q$ |* q. S
{2 {; D8 K/ l3 l- I- ?
for(j=0x00FFFFFF;j>0;j--); // 延时1 R5 I* O3 C6 [& F
ECAPRead();
7 W0 F2 y2 x- O }& i: V4 Y: R [% }
UARTPuts("\r\n",-1);
. }, f3 d a1 F, k3 Q UARTPuts(" C6748 ECAP Test Over!\r\n",-1);9 `1 @8 b2 x3 a5 C, J
UARTPuts("------------------------------------------------------------\r\n", -1);- i7 a% x2 C3 z4 B4 I A; D' B
, K. W- Y$ |* S# ` // 主循环
. O; \5 R. C1 E' ]! e( I for(;;). f$ e7 O/ H( q9 C
{. U8 z9 h/ c0 G) ^0 I8 W
% U, x7 G4 `8 A1 d/ h: g
}
, `) u4 u0 K' [9 x q8 [0 S1 X}! M$ k/ T: [$ k% k @
4 i5 e+ }/ P- ^& h! W: k
/****************************************************************************/
2 a- n4 _. v1 v+ O b( h, R7 v$ l/* */
8 }: g6 w% b) E/ ~. V/* PSC 初始化 */
* t! T2 l+ D: _, D/* */
/ S/ v+ F- [& l) n( U/****************************************************************************/
3 j P$ ?/ ?/ i; f8 I/ B/ L3 c4 Vvoid PSCInit(void)
' Z/ Q: w; {" f T5 l9 f{2 O5 c: o/ A" B" N
// 使能 EHRPWM 和 ECAP 模块6 {( ^0 H. M5 j! U) c& ~
// 对相应外设模块的使能也可以在 BootLoader 中完成. J6 `5 @$ y# ^' a
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);2 \8 R$ z- N$ ^
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: \6 n% W2 ^; F}0 q$ y% V! ]! M$ P( Z$ _
& y+ H8 S) ?: w e6 D
/****************************************************************************/
' `/ l( Z5 a- M: n5 o* b/* */
6 c3 P5 r" V0 C3 H* Y4 v/* GPIO 管脚复用配置 */
: N" I9 j' q( U6 N' d) t/* */
! m- a% U7 G# ]- D4 q Y/****************************************************************************/
2 B, c4 W7 ~' Y. R' lvoid GPIOBankPinMuxSet(void)
, b% `, s+ X6 M. F{
, U! N' W$ S) j" |$ N- m EHRPWM1PinMuxSetup();
) [2 Z# U% n) i2 D
/ Q* B" b* q7 \5 p, n& j // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP) y+ d" h) P: k' c- L
// 作为捕获功能时管脚方向为输入. ?- y9 p4 t& K9 F
// 作为辅助脉宽调制时管脚方向为输出( A- A! W+ _# K
// ECAP2 / APWM2% t: ~( j; i3 C: h% R& i1 K
ECAPPinMuxSetup(2);
. c( [' `$ }- b% l7 q/ i: }; z
+ i' L3 H6 G0 O // ECAP2 / APWM2方向设置为输入- n. [) H! J Q$ K
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
) {) c# a2 g5 c: `}$ G, b- ]% \$ ^) G1 V1 I
: X: f2 i8 D/ t! N$ N' i4 z/****************************************************************************/
! g2 f% n" \9 m0 P" N+ J/* */
' q7 K" x- }; R4 P. w" m* ?2 b; g/* PWM 输出波形 */0 g' A3 ]4 c: O" Q
/* */( P5 @9 B5 V5 r8 h% h" h7 L
/****************************************************************************/
, ^; Z! \1 C2 z" m' d+ Svoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)) `. M, e/ r+ U; Z) c$ z; R
{
( k/ ]+ `3 }9 S' K // 时间基准配置
7 V1 z/ Q* d+ \ // 时钟配置# n; L8 |+ v! O5 |6 {
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
5 V: q3 h5 n$ \9 M! {7 N. a- [9 Q! O/ L5 Y
// 配置周期1 T1 C5 I' X2 U |( N0 R( o
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
}& V- H6 _$ v& Q; D0 i: j3 X. G pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);% ^: G0 s" q4 \7 z- T
9 {2 @ u U+ q6 S+ Z( ~. _- Y
// 禁用输入同步信号
7 z/ L- ?! `* G5 F; ] EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);) T& E$ t( v* w
1 W$ u7 _, E' u( @: x A% H4 f // 禁用输出同步信号4 V# c* f, h7 p. p- ~% U
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
2 K) ~; ~. q5 [+ |
4 p+ J! C0 A$ U // 仿真(DEBUG)模式行为配置
& K7 R2 {# b+ k3 a1 _ EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);6 O! a- D3 j' m, H1 V7 a
3 q0 G) m- U/ {( G$ W8 w+ f2 m
// 配置计数比较器子模块0 ~) ~- r% F* v o* S
// 加载比较器 A 值* ^ h- n" f& I. W% g9 \9 w8 f
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
5 [# o! D. `0 ] EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);# h9 m$ v% o9 j& D; ?& O
3 s+ T& g* g2 }
// 加载比较器 B 值, V! ?) X, x/ J5 V3 J! |& r
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
4 y+ x, m) ?* U8 x( ? EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);2 h6 ^& a! [$ g* f
( G, A" z, p8 h$ A
// 功能限定配置(输出引脚触发方式设定)" D+ X0 @8 `* X8 f4 X; c
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出6 V h% d; p( l c( W
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING," D- p) G- f1 b- r; ?1 Q x
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
) [3 d* K, w% }7 ?* p) g EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
7 f k8 k# q0 }% _$ v
" v8 E# D( y7 Z, j' |( ?0 L // 禁用(旁路,信号直接输出到斩波子模块)死区模块
- a# C- |" P& C. L' B EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
) X* A8 e- G7 c; q" K3 {7 g( \* J y* |/ H' E
// 禁用斩波子模块3 ?7 T- G1 F2 h3 c. L3 ?
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
) A$ H; n d, o3 b( t: _# \! y2 ^8 s: k$ s
// 禁用错误控制事件
1 u8 e5 p, K( X c EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 {: c( B3 {8 j" _% z% w' E6 x
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);1 L/ S5 A& W: M1 g" K& `5 U9 J, W
) Z" e1 a* g& p0 c // 事件触发配置' g2 g" w! ? Z/ P/ n) A5 s: l
// 每三次事件发生产生中断* j; N3 z9 y9 h
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
# i: T5 q6 a* o! P9 _- z // 时间基准计数等于有效计数比较寄存器 B 值 产生事件) u3 m) _0 m6 f9 Q8 Z' }
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
: [/ B5 [$ Y ^6 d, l u // 使能中断
3 R' k, M. }- K" l) d3 q- | EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
" j' j) `7 L- B) E) D& a
! f" _8 C6 R1 P! V. R! z // 禁用高精度子模块1 L$ v; Y& N: {" e
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
. E9 K6 L0 d. l8 y/ M
1 m4 r* m4 F+ o) N/ ] UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
) ?' h, d# K) H" p; u# Y% D6 G}) c% {5 V! \# t& S
! r9 k# S* I2 b: h) p
void ChopperWaveform(void)
: M, P; F# o& G% Y{2 Z& g, n0 T) Y. W, k- e
// 50% 占空比
6 T& k" K* c3 N: |) L EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
; Z; Z3 }. k/ h, o // 4 分频 M C: W3 t+ G9 e
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
" H' o! K. w/ {. K // 单个脉冲宽度( c# S: u! o2 d- \* l9 l; I9 ]2 b
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
& U- E/ M% s, x- }/ y) z$ Z // 使能斩波子模块- Y3 a: j7 k r! @
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! c' x y' X* T. B}
6 t* }6 I% C; X2 k/ @
4 ?1 g; ^/ X$ h+ O4 m7 a/****************************************************************************/
" ]& U9 W5 D) ?9 t/* */
) q7 s+ C1 g8 I/* PWM 中断初始化 */
, ~) `9 s8 o0 G/* */
8 ~" w1 g3 y; H$ q/****************************************************************************/3 I* f M3 y; r( U1 `
void PWMInterruptInit(void)0 h7 W+ V7 Y8 K$ E( o, c
{
0 A0 q/ A4 H7 f( j. E5 f // 注册中断服务函数
0 J5 j# _, X. D, C, X IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);; j+ X5 }8 B: E& D: S
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);! k; H7 ?5 l1 B6 Z. \: |; u3 M! d
; j8 s: w. s6 {- ^8 u# S
// 映射中断" z" }5 g3 T. X$ ~8 N
IntChannelSet(SYS_INT_EHRPWM1, 2);
# D0 o6 p7 Z" q8 Y$ G5 L9 b h IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
* `& V4 W4 }+ |4 |! l0 U* p/ F* n
// 使能中断
! P7 J" F" Z& _# ^ IntSystemEnable(SYS_INT_EHRPWM1);
/ m* x+ V& M) [+ G! @1 d6 b" K8 W: i IntSystemEnable(SYS_INT_EHRPWM1TZ);
( k% ~2 G: [4 F' n: C& h}
7 J" ^& R! ?+ N7 J% H8 p) I% v& d6 Q( u/ q8 V7 b
/****************************************************************************/% R, }" w. a+ N# e( M; ?
/* */! m3 Y) b6 k0 \5 z/ D, P
/* ARM 中断初始化 */
: h2 y5 W4 b, U; @/* */$ c" \8 K) Z% c/ L; X6 d, v9 e2 {- m
/****************************************************************************/
' v7 u6 K/ Z" L" @! `void InterruptInit(void)
% Q# l& N; M0 s& L5 Q* ?" @$ r{2 G, a( I6 C& R2 \
// 初始化 ARM 中断控制器7 i. e% K- q4 F7 x; R7 t" P, v
IntAINTCInit();
. E' w! N* J# ]5 ~' f" ?1 x' _0 p, H
// 使能 IRQ(CPSR)
" {% ?2 ]" D. E% m) l- t$ Z' Q IntMasterIRQEnable();
: E& |& Q8 @; W/ g. j$ @9 h) c7 @, t& R3 M; u9 } o
// 使能中断(AINTC GER)
( {4 t: V! @) P* [ IntGlobalEnable();
3 R% p! U1 C# L* d' @& x8 l( h0 l/ m
// 使能中断(AINTC HIER) N- d R* Z& p2 ]$ p
IntIRQEnable();. |( {( ^6 n% E4 }" B' @
}
: X& n8 y8 Y* o8 B2 w6 [' ^) m+ k: q* K% H+ R
|
|