|
/****************************************************************************/
- g: v# j/ a" s, e% O8 ^/* */& \! p2 S; J5 @
/* 宏定义 */9 U6 B$ r( K6 r5 z4 m
/* */
. w* f$ F; B4 t4 n6 P' x1 P/****************************************************************************/
# c" m, [! s& P8 P' F- a// 软件断点+ R/ M2 Y& _0 D6 @
#define SW_BREAKPOINT asm(" SWBP 0 ");
7 v- f& D5 g ?: W+ l7 C3 c$ |) |. h' D" ~$ u$ I( z
// 时钟分频
! [; ]0 H$ s+ e& P#define CLOCK_DIV_VAL 228
* t6 O6 r# Y. H- C( B7 ?
: v; p' d/ g. k7 y- S/ b/****************************************************************************/: y& g- j7 z' s
/* */
Z2 E8 ?0 A- f. D/* 全局变量 */
$ N: I; ?& J( F0 u9 b( W+ u/ @* x/* */( R$ E. m$ r' u; N( z
/****************************************************************************/
" ~0 ]4 Z8 u+ G. v( F$ w4 |ECAPCONTEXT ECAPResult;
( I% X0 O# e% r% X# Y2 Y# F; q$ s
/****************************************************************************/6 O" f. R1 `+ a
/* */ z& w2 Z' {' Z4 i& ]
/* 函数声明 */" y0 l p z9 q! ]# o4 I" b
/* */" n- u+ X7 c1 ^
/****************************************************************************/3 j: q' L6 L0 k6 W5 o/ e
// 外设使能配置& J' ?* S$ y# \; h( T
void PSCInit(void);
% A8 `* I' T: I" v* l% l6 }- m
9 @4 U; e5 t6 q// GPIO 管脚复用配置. h$ i/ f/ X* e. G) W) @
void GPIOBankPinMuxSet();
6 H+ x% M' d/ u3 @7 j( ^6 D# b7 K9 f0 X3 m
// 产生波形. c0 M; d P( J& F7 D+ e
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);: F- H- ]% ] G7 P
void ChopperWaveform(void);7 J1 r! @& D; i8 f7 r
, q0 m; Y3 M3 p" z// ECAP初始化和读函数" W- S; d8 f1 ?1 o
void ECAPInit(void);
" e8 H6 V3 {3 u0 Eunsigned int ECAPRead(void);1 L# h7 o, y2 @, S, P* x& @+ Q
6 [5 V& i+ |: ]% ?. `
//ARM 中断初始化& V; r% N/ s2 q* d. `* t, A6 p& v
void InterruptInit(void);6 G2 b" G9 W5 o/ Z
' B. {2 }. _, h// PWM 中断初始化
6 m6 i0 t/ i% V( a) R i+ Svoid PWMInterruptInit(void);
M, q7 G1 [' {+ H" D// 中断服务函数
) Z7 I* I3 h7 S// PWM 事件
3 V N8 N; p; zvoid PWMEventIsr(void);
1 k* X. E! G9 K+ r, v1 Q// PWM 错误控制事件
& ^( O9 `! x2 {9 M0 R+ ]* {$ a6 }void PWMTZIsr(void);
! f: g& ?. n2 Y& n: m0 D
( [. f$ F* k$ [8 T/****************************************************************************/
) i- F4 a; T: \/* */
% [) ^, E, R& Y3 W/ z$ u/* 主函数 *// T2 d3 W' U4 M' U
/* */
2 x. q8 l/ v/ ^2 G$ ^/****************************************************************************/8 Z: b2 e, p# [ g& R& [3 w
int main(void)3 Y+ f' r) M' M
{
/ M3 C, N' ]( Y7 Y! u0 q // 外设使能配置
# G/ u' n" b9 i) t' X6 ]( s6 T8 K+ ] PSCInit();8 I; p8 S( d" D: Z2 ~9 d
9 T% Z! h+ _/ l A0 p9 l0 L( ^ // 初始化串口终端 使用串口2; s# K* q- |6 D z& A
UARTStdioInit();
1 ~) l7 _2 A: i9 R s ) L( K( @' ]$ _! X3 T. I O3 f
// GPIO 管脚复用配置% j) y- u7 o* N+ t, X
GPIOBankPinMuxSet();9 p* A& l* P. k/ I% d8 u: h( q
* S s# f) s& i& p
// ARM 中断初始化
6 \+ K g% u4 k R. w( L7 h InterruptInit();$ z# }! M& D: h% p o7 ^) ^1 S
) V. N3 a1 {% N9 e% l6 K! D // PWM 中断初始化
, O2 h- g! J0 a$ }# D$ _ PWMInterruptInit();
2 k. y2 u6 K0 P' B% g# D" G" u
; }/ l# C( Q2 p9 z1 r% j unsigned char i;
$ w3 e! h+ N. f' V& s" f& R unsigned int j;* w/ f2 t' y; N- K* _% D# i8 R/ L
7 R5 L6 I$ @7 H: r1 m UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);% z. ^) J# f0 E* q3 c* F
UARTPuts("------------------------------------------------------------\r\n", -1);
& e, z9 K$ l) _7 T% e3 w UARTPuts(" C6748 PWM Test\r\n\r\n", -1);+ m' Z/ N6 [' \ @
// 产生波形
9 f+ }8 _& ]' M- `* x- J6 ^! V5 Z PWM1ABasic(25000,50);
& w7 c8 v l, M+ |. Y* _. x$ Z
0 s! ?6 J! g6 W- b1 j7 r, }. {3 d UARTPuts(" C6748 PWM Test Over!\r\n",-1);
! M: ]/ _. |7 a$ ~6 J: i! Y2 f UARTPuts("------------------------------------------------------------\r\n", -1);
4 ?; `* K1 X% X' n+ u$ g4 M. h) ]) m$ Y- u
( i$ g3 Q! x* F" r9 i
' b' V8 ~7 K) }$ b, @ UARTPuts("------------------------------------------------------------\r\n", -1);
8 x E5 k# C% Z4 Z3 p6 h! U0 g' P. ?& o UARTPuts(" C6748 ECAP Test\r\n", -1);; M; ^% R. P5 L
// ECAP 捕获初始化
( q+ ]6 b7 W/ c: j& ?! z% A ECAPInit();
; z4 |+ ~& D( h* n UARTPuts("Initialize ECAP.......\r\n",-1);+ }. Y& G2 F! Z: ~ H
for(i=0;i<5;i++)6 l* E2 T3 ]' I+ R$ E b2 o
{
# i w3 a6 U2 ] b0 c: { for(j=0x00FFFFFF;j>0;j--); // 延时: Q9 ^* k$ C- t6 I# o
ECAPRead();1 A6 D+ a. ~0 u+ N3 _$ C
}
1 s7 g8 q+ I+ W3 T UARTPuts("\r\n",-1);& o9 F( p* E6 ~* w$ k, W8 p
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);8 w" i$ l# I' g
UARTPuts("------------------------------------------------------------\r\n", -1);
# E$ x: I& Z* W# k" Y& {' F5 E4 ?' H2 t" L# a+ k) Z
// 主循环
, V: w$ f+ f5 S: S for(;;)
3 i- `, z1 ]0 f, w% x8 V' M" P {
" w+ i" h- p, n& f% ]; B! U9 a& r5 e! v3 k& W
}# S t, Y) l* s1 J) v
}
8 @# b' v$ d1 |. H% Z
' Y e4 U* O/ J1 d$ t+ |- Q+ d; F/****************************************************************************/
$ F! R3 V4 Y& h4 G( f+ h8 v/* */
) v2 _6 |* Q; ?/* PSC 初始化 */
) ]2 i* T! @/ b6 J7 X/* */
[& A5 R9 |: @/ ^* @/ T3 R/****************************************************************************/
% S9 N2 c6 D. }: g6 `' g2 Wvoid PSCInit(void)
# D8 R4 h. h+ `: P% e1 m0 D{' U* @# `: x n2 b/ M8 \' v* ^6 T
// 使能 EHRPWM 和 ECAP 模块# {7 n4 u8 M) I
// 对相应外设模块的使能也可以在 BootLoader 中完成: [: B9 b/ ~1 E# @, C' T+ Y2 J
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% h$ d" V& u9 S; ~, Y D/ Z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ q( G$ h4 F: \}" W0 P: f- H2 G/ ~
7 |1 C" G- r7 \" ^
/****************************************************************************/
b* w" G3 |& h! b0 b- R! M r/* */7 |1 ]2 O/ y3 `+ ~7 g1 j
/* GPIO 管脚复用配置 */1 z/ H+ S5 p. Z7 a
/* */
) X- {5 W8 |" p/****************************************************************************/, {8 k! b, [3 ]
void GPIOBankPinMuxSet(void)" {0 k& T8 b* M
{3 G" i5 E6 B7 @, L& x* v. H7 J
EHRPWM1PinMuxSetup();
q% h7 Q1 D; r5 o' T
% ^" d+ L0 t: s' u // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 [ `* ^" p; S- |0 V' ^ // 作为捕获功能时管脚方向为输入
+ J3 r* x+ V& K- J2 P5 I // 作为辅助脉宽调制时管脚方向为输出
4 Z# F9 X- D5 ^; N1 H // ECAP2 / APWM2' b# ?8 g9 R( n6 J, O
ECAPPinMuxSetup(2);
8 R* p* f' y* H+ h$ p- M8 J
A& _' i7 l" V // ECAP2 / APWM2方向设置为输入& P' y0 u+ y6 X1 b8 ^6 K! C
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
" x8 I" O0 q6 l$ w( a( Y/ L0 c, n}
. J9 E& L$ G7 A5 D; u9 K/ t' p9 Y3 c) E
/****************************************************************************/
* E: @7 X/ Z9 r6 `' M/* */
5 ?9 {( l/ Z, c: M! N8 y- n/* PWM 输出波形 */( R% F; n x0 {! @2 W6 R
/* */+ x/ x8 S- W. g6 _ |/ h# r+ D
/****************************************************************************/
" X) X0 v0 Q+ p; U5 Yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
! o* p e+ @+ q! K z{' U- M: y' D9 ?: D& m0 k! d
// 时间基准配置
# l; b$ u2 b7 a$ l0 A // 时钟配置
7 f" J0 b. ~9 q( {( D( f7 i5 u EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);* E2 `2 d( o/ c4 Q
! A$ ^( ^$ i+ U6 k% u8 H; D& T // 配置周期
5 D! t$ M2 ^9 A' U$ }, i* p3 j EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,' f& e# l; h7 S- {+ E5 l
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);2 F5 A% j8 ?! O% Y8 x
( V( y6 |- L4 |7 S- @
// 禁用输入同步信号
. T' K9 L9 d$ F# ~7 Y7 E; v( T EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
' W+ {0 L: P' i4 \( e4 R
2 C4 L2 N. q4 t6 N" f3 X v- g // 禁用输出同步信号/ f, H6 R& F1 O0 @- C
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);1 C& y e& u8 P
* ?$ L( W( \, [4 w! o! V6 d // 仿真(DEBUG)模式行为配置
! E) H9 \: d6 m- C6 j+ Z- l EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);1 }, y) v, h; ?9 @: [1 n$ Z
+ W! d/ _7 n3 l
// 配置计数比较器子模块
- m8 Z8 l! f. C* d- N4 p // 加载比较器 A 值
+ L4 c! }; N7 ?& t* } EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
# L# D! ~' e0 `2 ]9 W EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);) S& ]7 a: ?5 ]9 m+ v* E
9 H) s9 \8 a# q. M$ g+ j2 o. ^/ u8 C
// 加载比较器 B 值
. P; T' ?, y P2 m7 ?+ E EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
/ s1 s7 B. f1 f7 [ EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! A- Q2 Z6 _ ^% t, C% i* z* X- c5 _! L1 u/ W8 c U. S$ u6 V! _
// 功能限定配置(输出引脚触发方式设定). ~, V8 E" M. L% b) E' Q8 w
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出) l9 I9 L) L" A/ @
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
0 g0 I( S% I7 m8 ] EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,$ F! Z) Z: q& I
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);# v0 T) ]6 [# q% G# \
3 r$ U; v$ O! J: \2 X" {6 I# K // 禁用(旁路,信号直接输出到斩波子模块)死区模块. S( G8 K/ {3 j: @0 x5 R
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);. d, I9 ?- P6 |( v* e: H7 `2 d# Z0 [
# r8 [8 }3 p4 H& N* R8 E- Y // 禁用斩波子模块9 R" g) s, d4 i2 S" v! |, q6 e
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);4 l4 b k* q5 R
: ~" j6 G+ B! [, g: D
// 禁用错误控制事件
* @5 K, d3 ?7 H/ {5 h" a7 o& `4 B3 N EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);7 n8 W9 Q: S! h0 e
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);1 K* t: }. L+ p- }4 X: N
/ S5 l9 S& A; z% ]
// 事件触发配置+ b \3 j8 \/ g& Y( D" ~/ `, E
// 每三次事件发生产生中断1 H7 a8 r1 V. x0 F1 M8 O* z
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);* M5 ]. t- w- x) Y Q) C
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
: v! ~1 ^, g' q8 f9 |9 `8 k EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);/ ~! f6 i& R& b* ~* B5 }
// 使能中断' A0 z/ {2 `$ Z5 l
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) Z$ {( Y/ a4 N/ t# A+ B( S: P/ {6 H8 j8 y! a
// 禁用高精度子模块5 x; P- z2 S; ], w8 P$ v9 ^* Y' c5 R" s
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);1 b3 J/ `0 x6 {+ b& {$ O; y
. W9 \1 {) f6 ?
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
% D3 s W; g* ~/ ~( W# g" |}; E* v9 [2 U! s+ l) p
" W$ ^5 ?; E7 L' l. w; yvoid ChopperWaveform(void)
4 X+ }$ w) u. C; F{
8 H: ?1 q, \8 q9 u! q // 50% 占空比7 @9 b# `8 E5 I7 `# a# U! O
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);6 Q$ I+ t( A' l2 A
// 4 分频
1 f' n/ v0 x, f4 t- b t: Y0 t EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4); y* b4 o' O2 c' A3 ~: a3 a# w0 o
// 单个脉冲宽度4 K7 Z6 m I J- M9 p& F0 f2 k0 N- c
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
, v5 J$ F' c! @3 }" q4 _5 b3 n1 \. n // 使能斩波子模块
4 ?4 d, J* O' x) t: W& _) ^& k EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);7 k7 O4 B- M( m
}2 p, \- A, S4 E6 ^
8 |9 u" i" ^4 l5 m; Q% c* o, a/****************************************************************************/- `0 e- V/ a5 j4 i7 z. R2 z
/* */
0 ^; M: D; {/ j3 u/* PWM 中断初始化 */
9 r' y4 t# e i7 I i% _" u" b/* */ y. B% f0 c2 [7 H$ {
/****************************************************************************/
# Z. R; F Z2 H& {void PWMInterruptInit(void)3 g5 N5 k5 S/ x: w+ \
{) t- o$ b' P5 |( P" y
// 注册中断服务函数( r0 c7 [/ J" X" x. T
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);) P! C) @) H5 s/ r# ~3 f! U
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);, z f+ e" s0 O$ t7 P% n2 {
' S V+ ~0 p7 f3 ~9 [% J // 映射中断/ T4 b4 T( r" c. b* N/ U
IntChannelSet(SYS_INT_EHRPWM1, 2);
. I, [) D/ N2 x. N- F IntChannelSet(SYS_INT_EHRPWM1TZ, 3);) J6 _/ Y- J2 A) A1 Z* v- L
4 E* c6 ]8 ~/ O: {& {# c3 Z
// 使能中断# T$ O2 g! t! y9 z( S! i
IntSystemEnable(SYS_INT_EHRPWM1);9 i$ J3 b( s1 e% G/ R2 L* |) R6 A; ^
IntSystemEnable(SYS_INT_EHRPWM1TZ); } }& J. B0 s
}% X) r% v" v( f* ~3 g
+ X' s* ?! D0 x
/****************************************************************************/) s1 b. S$ ]5 M) k$ t9 @
/* */
, h2 U. n* R' F; t+ f) `/* ARM 中断初始化 */. M( O& J6 r! L" d/ u" U) ]5 X+ G9 H
/* */& [7 i8 F3 m! r. ]: a9 v7 g
/****************************************************************************/
4 \1 L* M% k2 m; y6 Ovoid InterruptInit(void)) b+ k' b4 z s8 D3 A
{$ E8 z8 X9 N! o1 w5 ?2 a
// 初始化 ARM 中断控制器
4 Z( E0 C2 F/ @+ Z: l; T IntAINTCInit();
* K I) @. N y# J
. b4 m& V) r3 m* u& _ // 使能 IRQ(CPSR) t$ u1 g+ V9 j( c; ]% W% ~, \( C7 B9 L
IntMasterIRQEnable();
6 W U9 a' z& k4 B# h* V/ S: L( D- Y' I& w2 B$ Q
// 使能中断(AINTC GER)
& C0 B, b2 N' Z) X' a$ P( C4 G IntGlobalEnable();
+ A9 y, l7 w( r! {! v2 z+ X# g
" {% L" D- w$ n! Z // 使能中断(AINTC HIER)! F- n. ?- O, J: t! q5 g7 N* X
IntIRQEnable();8 ]+ k' }* p) I u3 _
}
/ n& }. [+ G; u' m7 \
/ b8 ]: e" m7 L8 S a! q1 D |
|