|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
& {) a8 j% y6 P( T! A" B+ c7 m/* */
1 }6 H% P6 m0 q/* 宏定义 */6 @/ I# W" `6 f0 F5 g- g
/* */) h: b8 D( A; ^' C6 D2 h3 R
/****************************************************************************/* [$ z) q7 a/ A
// 软件断点1 f2 i2 T V! T* y
#define SW_BREAKPOINT asm(" SWBP 0 ");" @, T5 F8 j. Z% q
p5 z7 g6 |6 K6 X// 时钟分频5 l2 T9 G( L# B0 V! o4 L
#define CLOCK_DIV_VAL 228
( Q& X% k9 h1 ]& |4 O, ~
& f* @" R" t4 m( n, J- t/****************************************************************************/
9 N6 P" \5 l& Q7 q" m/* */
# D- }+ I. n7 r h, K% Y/* 全局变量 */
) c- X( r+ l+ V) c& p/ h+ @) `% J/* */
+ z) D# h: b2 c" ]/****************************************************************************/! {% r1 T1 B7 c
ECAPCONTEXT ECAPResult;
# D! D. v! d2 B6 x
% P$ b# J3 M( @( A' h/****************************************************************************/: [/ b/ _# H9 z' v2 p6 H
/* */
Z- }5 L" R1 O7 k5 q/* 函数声明 */8 E/ @3 K; o8 b& i) c; W
/* */1 g: a0 S1 O5 z- s, k
/****************************************************************************/
0 y, x9 P& A3 h% \9 g// 外设使能配置, H) C9 l9 G( a, P. U4 u
void PSCInit(void);
7 s7 l# q& o3 s; }2 R8 }7 e6 j7 f+ F3 S; e( I
// GPIO 管脚复用配置% ~; D: {; g' ~2 j R
void GPIOBankPinMuxSet();
$ j( o5 q j! A/ `2 b8 p
e% e% G$ e: q' w; ]// 产生波形
3 _2 v) |) A" `% S# Y' n+ }void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
2 X9 E+ W4 t$ I6 ~- ?; Q% w T2 Pvoid ChopperWaveform(void);
8 m* r" I* U4 O" S, _; k
3 h9 i1 Y5 ?' W// ECAP初始化和读函数0 W v* U& }% s
void ECAPInit(void); w7 _* |9 W" h6 F
unsigned int ECAPRead(void);
- d3 O1 _5 Y, ?% l! ~" N
% H5 z6 U, x7 T( g, F) a4 s' i9 R/ t//ARM 中断初始化& w; b) r& \4 u4 `
void InterruptInit(void);4 ]8 @) K- M6 G) G
9 {7 Y9 V$ @# A/ n// PWM 中断初始化( a2 g2 ~2 s, d/ X
void PWMInterruptInit(void);
; W8 [) i1 `- Q9 x$ u6 `3 p8 L// 中断服务函数/ w% _* @! F5 m; o( W! o
// PWM 事件1 T' f% L( f7 q0 r3 C
void PWMEventIsr(void);
& N2 ~! ~7 F- ^8 R. b// PWM 错误控制事件
; u( Z3 K0 ~3 G, h) hvoid PWMTZIsr(void);
2 W) a& o8 d$ D# ^) h& `6 a( u1 @( m# m V0 V, l- R1 N
/****************************************************************************/
! d9 o9 P, m1 ^( b' O: u+ o9 h, t/* */
8 U" A- _5 B' G$ G, f/* 主函数 */ Y% Q$ Z3 Z: s0 M; T9 I1 K
/* */
0 V7 n1 i! E, Q, S; D8 l- l/****************************************************************************/! M4 O$ }. l( |: b, j
int main(void)) A2 K- I) o. |9 `
{' u; F% i% q. T! f5 K3 {
// 外设使能配置- X& O& U# o' }/ p$ [+ a
PSCInit();5 a% y, _# O! `
4 j2 L' z* s, _0 M- L( j4 ] // 初始化串口终端 使用串口2$ a* r% I% c7 c' N5 a3 Y; L9 i
UARTStdioInit();8 {: I% o# M' ]% U; {, X3 Q
2 L/ f$ e2 A3 D8 j/ @0 J0 g+ k // GPIO 管脚复用配置
7 j4 d/ Z$ E5 _& y8 j/ Y GPIOBankPinMuxSet();
. [4 ], N0 _" y! h" r! Z; {0 u u r+ v @) m- i
// ARM 中断初始化
6 ?( k- e6 E# s t InterruptInit();- s, t+ q/ _& c& Y/ p# M
5 ^7 b1 w- W* ~' N& ~ // PWM 中断初始化- Z/ D; a. n. y- [& _7 b
PWMInterruptInit();7 Q4 J# m) y1 B/ A
2 S0 Q- o; V1 z8 F6 o8 d$ k T# o! ^ unsigned char i;
$ u( d* h9 o2 U& @' h unsigned int j;
! P) D6 ^ ^/ G5 ]( x$ s& L( U9 R1 _: L$ d2 j6 W ?: E
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 `- T& t6 L' Q5 k UARTPuts("------------------------------------------------------------\r\n", -1);
0 m7 ]. d q8 J- U UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
6 J) \( v' V: }0 u* C, Y // 产生波形
0 m" \' ]& y5 e/ a4 R, e7 { PWM1ABasic(25000,50);5 p& v1 F4 S) U5 S0 z) z
9 J4 w4 _% o/ B. i& y+ `- I6 @
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
, S' ^/ v* a4 b |& G! a; r; j$ e UARTPuts("------------------------------------------------------------\r\n", -1);2 q& Y- V1 O+ T1 g" s; E* t8 }$ s: C
1 I% Q, T0 r% R: S7 E& B/ u
* P- a5 X; w5 {4 G9 y1 `6 @: \1 ~% y* D# C& f) y
UARTPuts("------------------------------------------------------------\r\n", -1);; W* D" u4 J% E
UARTPuts(" C6748 ECAP Test\r\n", -1);
5 l! e3 F) w" b V3 J // ECAP 捕获初始化
6 ~, } g. H/ X ECAPInit();) z1 V. U+ X/ s5 D! D
UARTPuts("Initialize ECAP.......\r\n",-1);
2 C E0 G% K8 E3 p6 [+ c2 g for(i=0;i<5;i++)4 Z" k) q+ j/ X* F2 V. w
{9 L- s& k% l; n. q3 n- M' _
for(j=0x00FFFFFF;j>0;j--); // 延时
9 `) l" C- N4 G0 N- ^% N ECAPRead();
6 q+ ~1 T+ B4 T5 A$ j8 m$ |7 ^ }
0 m/ V1 b- V& z% K6 r9 ~: D* ] UARTPuts("\r\n",-1);' M: }! N5 i( {6 ]' F
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);9 Z# q, H: p7 X5 ]/ @! W
UARTPuts("------------------------------------------------------------\r\n", -1);
% e9 ?/ ]( q5 r' b0 ?) c1 a8 d
4 X6 c" {& G; ]0 w // 主循环. o0 z [4 Q; y: \* I0 v/ b
for(;;)5 P& b* [" y% e) l1 m
{" [$ W, U# k/ ~' L! w& R2 {
4 G. }0 U* S! F" c. p
}
9 [6 T) c" x& O7 X- H5 m1 @}
# [$ u/ ~0 B5 i; H9 P" c4 V9 L7 _) i) z7 O' n4 L" d* s
/****************************************************************************/6 G5 d5 Y0 h% V7 B- j1 u% v6 l7 A
/* */- i1 I. o3 ]" W- v
/* PSC 初始化 */" h: K, w/ i7 p O3 t& I. S% _% C2 o
/* */5 m8 S' @! r$ l+ Y# m
/****************************************************************************/& c( S1 I% M% }# y0 }
void PSCInit(void)
6 L! U4 M9 _' m" u{6 @4 K/ E0 N( m& t ]0 f4 ?5 E
// 使能 EHRPWM 和 ECAP 模块/ h% B) v0 [ F
// 对相应外设模块的使能也可以在 BootLoader 中完成9 i7 b- q8 H8 T+ v" W
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 v: D! R% v$ c4 [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 y$ D/ v% }: z9 L3 O$ C}
; \! Q k# D, ^: V7 r+ q) Q; P5 H
/****************************************************************************/
- `4 f% }1 \9 _( N W( Y/* */- P; r& ~* c% _4 s5 Q
/* GPIO 管脚复用配置 */
6 @* ~8 x- M7 Y; }2 B; G& Q/* */' H) P% f. h' {! a7 J0 g1 q3 q
/****************************************************************************/
" V- i7 V+ Q3 M; Gvoid GPIOBankPinMuxSet(void)& k: y3 l2 R8 c' K; x5 ?2 Q* [
{ e* J# X7 \8 ^& }
EHRPWM1PinMuxSetup();1 d& C$ k: A/ p. s) k
3 E2 R% L! g/ ? ^/ w% g, W! T/ S4 u' M // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)1 C/ V9 w& R$ W _% T5 w* j
// 作为捕获功能时管脚方向为输入* v' c, a# b+ C7 ` h5 l
// 作为辅助脉宽调制时管脚方向为输出
) C$ j9 W7 P! E' l4 V, c6 _, Y! p // ECAP2 / APWM2/ g" t; ~( H; l
ECAPPinMuxSetup(2);
6 F; k: T% h* P' P! q* }. y( f3 `+ }! E+ X
// ECAP2 / APWM2方向设置为输入$ `9 q* [: g. x- q9 g2 X
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
9 D3 ] r" N+ W( `8 d% {! D( X8 ^}
" T: q# X" X3 U3 ^- [- Q/ Z5 r; n. n0 h
/****************************************************************************/1 M7 C& k- x) M+ _2 v: S
/* */. l; n+ f; H* C9 O* E
/* PWM 输出波形 */' H7 H) W0 r8 J, r$ L# q. Q( S
/* */+ X! a) K8 z! [, b" _' ~4 P
/****************************************************************************/
* }5 `6 E; t7 M* V) ]* bvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
7 p" m* q! D+ G$ v% S{
, X6 e0 a% Q% m% [- E: v% A // 时间基准配置6 [5 z+ q: @5 u7 c9 e6 m% B% |
// 时钟配置0 {9 T! J4 U1 X/ Y3 H
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
8 c+ x1 v2 s$ p0 O B$ ^8 x
5 N- p0 {0 s2 L6 \) Y- t8 u3 l // 配置周期
) ?! F( ~2 ]. {6 i/ ] X$ g EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,6 @3 N1 d6 Z7 F7 s5 f4 z
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);7 k3 h: v r! ~4 N
{* s+ `, V! w% [2 B8 l2 Z // 禁用输入同步信号/ Z7 ^1 y$ P, m( g8 ~" ]; l7 v
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
* T+ R a' B' c6 r/ `) E& z9 k& Z5 }/ Q% b* |$ Z5 i+ o
// 禁用输出同步信号' Z U8 Z! S) x: h
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
, a+ f, D G5 v& S/ S! @6 U
6 n+ V+ H& y" A- J // 仿真(DEBUG)模式行为配置
% I5 L( g" ?- j I; | EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
% {3 f! l# b3 a6 i8 b) z
4 l, b- q( Q: \7 g. E7 S3 F // 配置计数比较器子模块
' i% k" n) _) p9 X) Q3 r, p // 加载比较器 A 值
& g- P# F* f4 x9 c EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
5 t; p; l/ [: B9 K; K+ f" N EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) j2 Z- c, y/ ]5 E8 u/ u- T5 K7 D+ L. f9 U* I! M
// 加载比较器 B 值8 T; ^% W# h% h( ^3 O6 k; c; {
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
1 E% N' s! w, ~6 g8 e5 ~3 B EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);3 ?4 `) e" t' V! v' E" X
4 b8 N3 j/ P; s( a! A7 Y4 _' A2 P2 U6 n
// 功能限定配置(输出引脚触发方式设定)
/ Q) Y. u8 n' D/ e+ f" l$ T# _6 ?% e" R // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
* A" D, F7 z9 k( W/ U+ Y EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: L4 z3 M* @. L" [ EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
& B) Z8 ^$ @/ P0 C, N EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);2 p e8 E* K) n9 q
( x X4 z9 _# i) R& y# Z // 禁用(旁路,信号直接输出到斩波子模块)死区模块
H B8 O4 J) z! h EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
: k( |! ~' b4 k. R# L
7 ]( R6 ~2 h; M // 禁用斩波子模块6 Q, e5 \6 r; G8 L9 W
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, F2 [( [$ r2 b$ ]& ~ e
4 ?% Q. g* ?5 e: {* k' ^ L // 禁用错误控制事件
0 Q) D7 r W. {1 A$ T3 Z/ r; v/ C, r EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
" X; f& A1 b; H3 m8 T+ Z# L' Z; ` EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
5 F2 k# l# _4 L# l: @# d. V$ m0 a0 z+ I% }3 e9 \+ F
// 事件触发配置( A# {+ \" r/ O& T4 I' t$ P
// 每三次事件发生产生中断* P8 x( i6 ]8 h! l, \% e
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);8 i' c5 g) \& A$ o, y+ T" S9 @
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
& n- r8 U6 a& `6 ?5 A- c: d+ H EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);7 z' e: I8 j# e& G3 j" ^
// 使能中断- N" W) T7 u3 ?
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
% V; q2 F6 x9 ]7 \* M5 w4 j( c7 v) f* _, @8 O. {2 x0 y
// 禁用高精度子模块4 H1 Q# C4 a" n) h/ D9 w) k
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);, [' z) a: e' A& q3 O' N' M; A! M
! I' v1 A, d9 A2 ^" S( T
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);& s, S* J9 c+ \& J, e; Q7 a; ^
}/ M/ r, Z) I" M5 K$ [" r1 Z1 u
* d0 r: A0 Q6 p" i* y
void ChopperWaveform(void)& R" ] n7 j( \+ s5 P
{
& F( Y q/ {+ w. U // 50% 占空比
2 w9 p- Z9 ~* W+ c/ I8 v EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);" X8 e7 X$ p' Y5 K; `1 o
// 4 分频9 E% {+ d& _9 U
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
8 i" @* K+ j8 U* U // 单个脉冲宽度
) z: A1 j' R* ] EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);+ \; ] i c' y" y* V
// 使能斩波子模块% ^+ E- I$ k$ h! V8 p' B
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
) x$ T* H5 r( d- k, _# I$ k}
7 G9 Z% h0 v" s- E- @, X: x: c8 A
6 j3 p! D9 q; e: k# T/****************************************************************************/% G; z: ?! Y" p/ v) P. m8 R1 p5 g
/* */
* V: O: v. { U/* PWM 中断初始化 */
" e( a7 y9 v& D8 D/* */
' g4 s4 }! @8 }8 k/****************************************************************************/6 m" P5 W+ o( C2 \+ d8 u$ `' w: F
void PWMInterruptInit(void)" T* n$ p. h4 o3 Y; S1 r! O
{
" _! s, ]5 {+ \3 u# F, A // 注册中断服务函数: J# g, O2 p. g6 E3 f2 m+ Q9 L
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
0 D ?' R- v1 x8 n Y0 k IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% W1 K( s/ ] Z$ \6 t5 {. \7 e/ x: E* {) Z; V
// 映射中断7 P# ~# u& ^: F
IntChannelSet(SYS_INT_EHRPWM1, 2);
2 p7 }3 D5 h5 T/ `" [) t1 ^: y IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
4 e0 [8 K" W/ D2 x# M( U9 E0 c) Q+ _7 e- f: }( m6 H
// 使能中断# j/ Z3 W5 A" S& \
IntSystemEnable(SYS_INT_EHRPWM1);( J* A& H/ Y- k+ b) }# L9 o
IntSystemEnable(SYS_INT_EHRPWM1TZ);' c3 T# H1 M! M/ r% y( T
}
7 C% k6 u5 i, S+ f9 a: v# l
0 f+ Z6 V6 j- ^* N/****************************************************************************/
8 I% D6 a0 k/ L+ P* |4 S% s/* */( W% h6 E- q2 `
/* ARM 中断初始化 */ w' [% H" a6 z" Y
/* */+ J4 {+ h5 L7 a' ?
/****************************************************************************/: O5 J6 b; g% A, ~( V
void InterruptInit(void)
$ g: e8 |. L) k% q- ^{3 L7 K& Z3 u) M0 B# i
// 初始化 ARM 中断控制器
4 s) G8 D5 E. @( B' D% z6 I IntAINTCInit();
3 D' |5 f% @# t" D# c6 U
% n+ n# U+ ?5 X* K9 P // 使能 IRQ(CPSR)
/ `- u+ \5 j/ N IntMasterIRQEnable();
& N7 E& @9 u, B1 o' W
: C! d% {9 B8 k7 c, o/ H0 W // 使能中断(AINTC GER)( H" p* S7 `' ]4 W0 l
IntGlobalEnable();
8 h+ g+ d4 o1 A( M4 L5 T, M; A5 b
9 w ~( v( j- O5 t& j* N. } // 使能中断(AINTC HIER)
5 H6 S( h9 |) D, d: C" a- ]8 y IntIRQEnable();! y3 s# t. {: [$ h+ q
}. ?7 z8 G `# w" E$ L, o
5 n" b( D8 n/ P0 p) D1 t+ W
|
|