|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
- ^% j5 E4 v- G/* */1 U# |* j2 R& v' x
/* 宏定义 */( W+ S2 \) P% i1 U& a
/* */1 |/ V" d2 P6 D# S5 L6 u" d. g5 e! X2 y
/****************************************************************************/
- l0 J0 P/ L3 d// 软件断点* \7 m4 f4 B- k
#define SW_BREAKPOINT asm(" SWBP 0 ");
" z) ~5 @2 Q3 E: q. I
& U( K# v# `' w/ v7 {7 ^' k// 时钟分频% G% W; Y6 _' _# F1 `; w/ Y( \! M
#define CLOCK_DIV_VAL 228
* Y3 w Q6 B! R4 B/ m. W1 l9 g
3 K) l7 V% n3 M( |/****************************************************************************/
c4 D; @9 l6 y6 [" ?/* */
2 v. z" j E) |3 }5 @1 x( ]7 K/* 全局变量 */
. w8 a8 U, ^+ q& P9 J5 D- `: e0 E: `/* */! M7 T/ F, ?6 D; J" H! h. Y* y5 U
/****************************************************************************/
& K/ \! `# V, E: g4 |ECAPCONTEXT ECAPResult;/ R% _, B V% N- ?' r* l
j( ?7 i( w" E% m! I( @/****************************************************************************/
4 f" n$ e- u& u- {% |! m( r; O/* */! J9 E! w1 p( Y$ R/ e5 D
/* 函数声明 */4 ^( L* `: _2 I; G4 {
/* */
/ p7 v) T& s- i6 L- [' L/****************************************************************************/
+ |% O( L. g0 k& v' m- j1 b// 外设使能配置
! K* X, [$ I; }/ [) J4 N6 Jvoid PSCInit(void);5 I* U, L1 Y1 N
/ H0 L3 L; q* {
// GPIO 管脚复用配置
( `/ |4 D! C6 D2 f( W5 xvoid GPIOBankPinMuxSet();
9 T& d' j# R$ H, _8 w6 ^
/ v4 U; ^. ? C& w3 k4 U- P// 产生波形
T9 b* R( j7 svoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
5 ^9 i2 p& i) S9 svoid ChopperWaveform(void);
( j. A5 E4 ]/ x7 Q
" j" M% ^% j" h// ECAP初始化和读函数( y! v5 H L) Q6 o1 p
void ECAPInit(void);
# V9 y8 o4 r6 s8 f1 Sunsigned int ECAPRead(void);2 S/ l2 d' d; \
; w5 @! M" u/ V2 m: s$ {2 X( R
//ARM 中断初始化
4 x, M9 s3 p1 I9 M) E. n' F [void InterruptInit(void);# B+ K6 a, [* O, N
$ ]0 r3 j, a/ p( i# E& _ I// PWM 中断初始化
& m. n) h) A# F1 W; |: ] Vvoid PWMInterruptInit(void);' |# J1 X2 L. q) _) r( @
// 中断服务函数' B% j& G, [0 R2 X: Y
// PWM 事件
& r v5 n. y# Z5 o5 fvoid PWMEventIsr(void);
* N4 A: Z; ?6 f- m// PWM 错误控制事件5 Y! H8 {0 E; }/ w" H, ^0 p6 Y
void PWMTZIsr(void);
. n: K6 k& E- t2 k
) x6 w4 a5 w4 T: e. Z1 j& O/****************************************************************************/. V0 t7 W. b1 M' s
/* */4 O" w3 n0 W" _7 \
/* 主函数 */0 R* y; k* y4 z3 [8 w
/* */7 Y& y4 t/ P, Y6 ^0 \. `' `
/****************************************************************************/
0 V& C+ W2 w7 c" q+ U2 rint main(void)3 c1 l% y# P8 S) B
{9 j$ _ a+ U* V
// 外设使能配置& k r' {% C9 R
PSCInit();
! R0 Z! u* G) v$ q1 C8 g0 ?
) L% W0 C( V5 _6 f6 F // 初始化串口终端 使用串口20 B; M+ V; j S9 Y# \# o4 L
UARTStdioInit();! f3 Z# T; v4 O- f( T2 L: A
3 D, ?* D3 G, W0 J // GPIO 管脚复用配置# {5 [+ t# j4 l, `& F
GPIOBankPinMuxSet();6 {- i; R( R, C/ }) P I5 l
8 d) K, n5 r; o7 s
// ARM 中断初始化
' G% k j; T2 j* { InterruptInit();/ I/ w- M; D4 r
8 Q/ ~+ }) r& s, [7 W# W* t
// PWM 中断初始化7 {% w0 U, p2 N9 e w
PWMInterruptInit();
3 Z& O, I9 x" S7 k
$ }9 `. G1 p. G& f2 e# V) t- d2 |* X unsigned char i;) [3 \9 [) n8 o, S' j
unsigned int j;
: d. @& y1 ]7 |
; x m q& S% _: x$ H1 L' `& h UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);8 ~! v* p2 t b$ B0 U8 B
UARTPuts("------------------------------------------------------------\r\n", -1);
. `7 r7 J" Y+ q4 N1 x- p2 t UARTPuts(" C6748 PWM Test\r\n\r\n", -1);' {- h2 Y5 ]- r H
// 产生波形! q. a9 }& D5 {6 H
PWM1ABasic(25000,50);7 _& j( q( q% P& X9 ^' u5 Y
3 b: K+ B2 b C- u UARTPuts(" C6748 PWM Test Over!\r\n",-1);
' v5 b, }: y( d! v+ k/ B UARTPuts("------------------------------------------------------------\r\n", -1);4 U" V7 t G& Q. u- Z1 v
2 M% i2 X' Y0 e: b; e. H L
$ G( C. @2 d5 C
8 ?$ j1 a) a4 x6 Q6 u$ R
UARTPuts("------------------------------------------------------------\r\n", -1);
' E% J3 {& W! T. z3 n/ F UARTPuts(" C6748 ECAP Test\r\n", -1);
/ G4 [8 t/ u9 I+ H // ECAP 捕获初始化2 \+ f/ ? G/ J
ECAPInit();
4 ]: C0 f, u) ` UARTPuts("Initialize ECAP.......\r\n",-1);# |0 {1 p" X/ M2 m# ^3 \0 S
for(i=0;i<5;i++)9 H: k i0 K5 S; }" L, k
{; o# U M# u' y' P1 ?4 O7 w
for(j=0x00FFFFFF;j>0;j--); // 延时
) L: B# J: H& n, V& g( j9 R ECAPRead();) E+ p: G& e9 u* D0 p+ I
}
4 d( z! s2 e6 r x UARTPuts("\r\n",-1);
" U) k* c$ b5 E. d UARTPuts(" C6748 ECAP Test Over!\r\n",-1);& ~' I$ H* i0 }
UARTPuts("------------------------------------------------------------\r\n", -1);, g0 s( t9 B6 K: h$ \
j! k% X4 ~# ^* V/ _
// 主循环% V# ]/ v! F) a6 y' b: d
for(;;)8 C5 l8 \% z# B
{0 g, F' J% D$ S" s4 B1 l" t8 I
" H0 I4 K) I7 [ }
! R. ~& H, x+ i2 Q}
- D: }5 X: n4 K& H' ~9 w& Y( U3 |6 y4 w' z3 i7 p
/****************************************************************************/
( N1 x& e' |* L2 S& a2 [/* */
8 u/ b: m( u* `6 d1 U/* PSC 初始化 */' W# E8 \& G$ m5 [1 P5 v
/* */. F7 F# g* ~* _7 m
/****************************************************************************/- f0 v7 J) c6 W- Q, q
void PSCInit(void)! }& N* ^' ^( [8 ^) a
{
- C9 I- P% B7 R: o5 r' t // 使能 EHRPWM 和 ECAP 模块4 r0 B2 K" N: o+ _
// 对相应外设模块的使能也可以在 BootLoader 中完成# b9 g/ P0 ?- E v' F" V8 b. j
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);8 P& |& ?& q: S$ L6 E/ N
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( Z' `' n1 l, Z}; H1 _, _& K# N. D5 N% a; G- I- g
4 `- P- u5 a3 b$ m& ~/****************************************************************************/
/ @- o4 e- U4 G* ` z/ c4 }/* */8 \! U& U8 n6 `8 q1 s5 ~- g
/* GPIO 管脚复用配置 */
( n) M/ v% I/ n$ v1 d/* */& b {/ \# l8 {
/****************************************************************************/
9 A' O: l. e2 z& w# x0 F0 `4 P3 o& yvoid GPIOBankPinMuxSet(void)
- z2 P9 r- f; P+ o% s# p9 D) K4 _{
% T( z/ M4 d& \6 M2 j& K* ?4 X$ M5 [% q EHRPWM1PinMuxSetup();
" a: L7 k* y3 j: `
/ M5 N x- ^0 D/ H // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)+ _+ X- h' f5 \9 ]% O) @4 ]
// 作为捕获功能时管脚方向为输入
8 v% h' M/ A5 V0 x // 作为辅助脉宽调制时管脚方向为输出; R$ `7 w0 {, E2 v
// ECAP2 / APWM2
, \9 T$ s h5 T q7 c% b ECAPPinMuxSetup(2);1 a9 W( g3 l2 |6 U( O5 v
" ?9 d/ _( F+ W. F$ P
// ECAP2 / APWM2方向设置为输入
! r0 B+ e0 `7 Q0 \- ` GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]' q" K p; \# h$ u% C) P
}
, {4 I/ p k- l7 F& D4 v6 H
. z5 J1 [" W: C8 Z/ E# n# I/****************************************************************************/
3 ~1 O& ~" [9 _; }) Y- z" x/ V7 ^ [' f/* */3 E6 m+ i$ s1 G2 p; N; S
/* PWM 输出波形 */
) j2 W; E5 F2 F/* */
9 a3 D/ @! ~6 c0 U" l0 H# B! Y' W! L/****************************************************************************/% I/ v5 _# r5 Y: G+ W( @/ e3 B
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
) ]# j7 W. o7 q7 p$ G{
1 k ]" n! ?, n# K- W- E$ k" C // 时间基准配置+ W5 I% Y5 y9 e$ p
// 时钟配置& Y2 W" z$ v' i; W$ X5 C, c& u
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
% I) O8 `: f1 l$ F7 a
/ c) Y2 k! C" \4 d( ]' G( y. G* u // 配置周期
+ ^7 D" c; i) y& {; n& x+ r EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,$ B0 j3 m E) c7 q( n k
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
3 p, K6 A0 V5 p
' ?! }' q" L( [6 F( D; Q8 Z% \0 t) p$ v // 禁用输入同步信号
% O/ d( B8 B5 @: F* j EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);6 U3 E% x- ~ k, h) z! ?
/ T! X( n; c8 P$ b3 r' Y( J
// 禁用输出同步信号
1 {0 K* a8 I5 ^& } EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
5 \7 f; {6 {5 l0 A- Y! T$ G, P* l) g1 A
// 仿真(DEBUG)模式行为配置 \1 z8 G# c- y9 B& g5 t, z
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);3 v# Y9 u- R( }1 Z4 Y( |
) L3 N# ^. L2 u) a0 y, `* Q
// 配置计数比较器子模块
& z- j; \" Y9 I' J // 加载比较器 A 值( ?$ N( A4 i0 m$ W
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
8 z, O4 Z* }' E% s) L; P EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 j* d; q( b/ R' C$ k
l/ B4 @ p) W' n
// 加载比较器 B 值
& l$ p: Z9 N* B. O4 Q EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
5 S5 u1 A6 n, T$ A/ @5 z EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);; f" a K/ v0 ^2 X: F
1 \ H7 W6 D# m. K( Y( f4 u/ Q8 ]9 |
// 功能限定配置(输出引脚触发方式设定)
9 j: Z( N: i u8 j! T0 _ // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出: N s' ]% X3 [, w8 g% a
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,; V T$ \+ F' q9 k% l
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
( P. E) j* ^5 z. u c7 Y. _ EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
3 ^ N: T5 o& X5 J8 x8 u# s$ l5 Y9 g: g$ }
// 禁用(旁路,信号直接输出到斩波子模块)死区模块4 ]$ k. f% o) c- ^. ?; ^
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);, Y B, Y, S0 v2 E1 R7 B2 Q7 h1 O3 }
9 m! F, S: M" R0 Q // 禁用斩波子模块
. f9 p: X& ~. c" x7 f8 N0 Y EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);2 J p: }. g& v9 n. S3 [
3 f2 O; `3 ~* ]5 p2 |
// 禁用错误控制事件" i0 ~9 [; d4 O' I) P) z) B
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
) z% ?& I* I9 F2 p7 T. | EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
4 H! r" m2 I: g" y3 r' C) R- q' y0 J' @; k9 r; m( @* ~
// 事件触发配置& e' V$ M Q$ j# L3 [. q/ g
// 每三次事件发生产生中断
8 I, J5 m# w* ]) K9 v EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
' E% e+ C( K9 g$ l0 p% i" D+ y // 时间基准计数等于有效计数比较寄存器 B 值 产生事件/ t! F [ P6 e9 |0 h4 N
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
7 B+ `6 I) k1 p$ ~" G- f // 使能中断
+ o/ U. g' o u7 I i. w/ k EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
. G- z% b. y* G* E' e
7 W/ z; W/ i8 Q4 G( \ _# U- ~# I // 禁用高精度子模块! x+ \6 u( m5 |
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);' Z* M- C& s4 \7 m. H' g+ f
+ G+ B. D4 B3 Q5 [ UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);. a3 T3 [& Y$ F. w' i
}
) [% C( `0 f) o+ {
+ }: u! {4 W7 D, l1 Wvoid ChopperWaveform(void)3 `7 H) ]$ S& m" L, L, q
{
0 b% t, [8 O) k* S5 V7 h // 50% 占空比
0 F+ e- D8 a# i# j0 _ U EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);- Z- o2 C0 I/ l- k# \
// 4 分频' N1 c: @) ^; W5 u7 R! Z
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);# j+ ^, Y9 H% {" X
// 单个脉冲宽度; z/ L, z( d- h
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);- }4 a8 B i5 c& z% u1 a( |* E
// 使能斩波子模块! S/ G' l' }+ y- J/ ^8 _5 J
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
8 B9 m. t" ^9 ~: A- N}: c o, C- u3 w& ]3 `# c) u
2 v* L I* t" {$ D: ]3 w
/****************************************************************************/
' h9 w/ S5 g( s5 r- B/* */* a" z4 h" k+ P2 ?8 m8 `" z
/* PWM 中断初始化 */
+ w! f- ]7 y! O; \% R/* */
" `" q$ s* Q% `* O: v" C6 V8 R/****************************************************************************/
. m! l. {8 Z* Wvoid PWMInterruptInit(void)3 ?; Z. a% b8 W0 k; @, I: e
{9 i0 B3 v* O3 X
// 注册中断服务函数
$ S7 r/ q& V8 C: I IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
2 E# s0 D+ p2 A- x( W# c IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);( V; E! ^# e7 j: j* D4 u
3 u/ ]9 P4 b9 C, f* A/ b+ _
// 映射中断
: x& f+ H7 b! Z IntChannelSet(SYS_INT_EHRPWM1, 2);
6 U6 }6 P9 E/ ], }) m IntChannelSet(SYS_INT_EHRPWM1TZ, 3);5 c# F$ `* A8 f- k$ M+ m
; k* U2 L' c2 a$ L; t! M
// 使能中断6 y# s9 X: C$ p9 t, t
IntSystemEnable(SYS_INT_EHRPWM1);
8 t0 @2 v( }6 Q IntSystemEnable(SYS_INT_EHRPWM1TZ);" ^. m( a: O( t$ [) E s
}
: _/ v0 g$ ]* S2 W' r$ A' c! b$ u3 q0 {5 r
/****************************************************************************/! \/ E& Z" E; j
/* */
2 ?6 W/ C) H# s) K: |/* ARM 中断初始化 */
& t9 A, h0 h6 y8 U$ q, Y/* */
" l, i* }4 d: Q+ ?# u/****************************************************************************/ A; l& Z7 O y5 T" r3 E4 P
void InterruptInit(void)
^( C( K" Q) O" {{2 ~ p# \% U" ]8 E
// 初始化 ARM 中断控制器
* j, o! |' N$ R( T& p( f, [, c IntAINTCInit();
. m9 A: R8 x1 e7 x6 `9 {
9 a4 A7 ]! t6 E/ A- e6 I# X% \ h // 使能 IRQ(CPSR)4 Y! b! P9 C: q0 O: z2 B t& x) r, F
IntMasterIRQEnable();
5 R; s9 Y3 O2 D
% c1 L! e" D9 p3 N) n. o // 使能中断(AINTC GER)
( g& y( ^! B- z( [# g1 l' ` IntGlobalEnable();
0 T: W9 W+ K6 ^/ U: E4 y I# k3 _2 x7 ^
// 使能中断(AINTC HIER)
& Y" w, y+ I4 F# } IntIRQEnable();
4 ~- L) U% @$ V}) b* n; {+ k! N' [
& q5 m& o# K5 v- S
|
|