|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/4 b4 u2 q6 ^% k/ x. Z
/* */1 x2 Q Q! M4 _ p. U
/* 宏定义 */
5 c0 q9 x! s0 e8 X/* */2 g5 K+ ?2 Y: j" x4 q
/****************************************************************************/
* D9 k( m1 {( E( ? j// 软件断点
' X* {9 A0 M5 R [# n#define SW_BREAKPOINT asm(" SWBP 0 ");
3 P7 f! |. p' Z; H
3 G9 E8 W; _+ z# S6 K* R. ?// 时钟分频' K# P3 F% ~, @% K8 y' s9 k* Z
#define CLOCK_DIV_VAL 228. r" k6 V3 ~; {. K# \! G
( a- M0 J8 A) X |/ ]* m" N
/****************************************************************************/* X: [# x( V+ E U0 M& w! M9 u; S: Q
/* */
$ j g3 e* Z9 f/* 全局变量 */
2 `6 b- v% L1 z/* */ |* l, y: c" G
/****************************************************************************/7 d. S% ^" F7 R3 O$ j9 h0 |
ECAPCONTEXT ECAPResult;0 \( c1 O' |3 I# W0 D
& @1 _. @ }: o+ ]) H/****************************************************************************/
1 I% W. L2 i6 D# }" }2 t1 k/* */
6 h7 G7 ~$ X K/* 函数声明 */
6 h9 l' x) _9 v+ D( W$ ?/* */
, i6 O# U* ~6 I( A% o- l/****************************************************************************/
0 {0 D' e# G" V! ~9 x+ p// 外设使能配置. K- X8 a" }7 Y. b
void PSCInit(void);9 C* X5 v2 h* {5 e: m# o' K
1 ?! p9 @' z4 a& |) _// GPIO 管脚复用配置7 ~5 M0 d' W" i* i6 t
void GPIOBankPinMuxSet();" d4 x! h" ~' B% m
" c" y4 y8 \& ~; S3 X7 x// 产生波形
, q8 V6 J$ ]6 j' Ovoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);9 ~2 L j& P% s. d" S; }7 K: D* y, t: V9 f
void ChopperWaveform(void);
; x9 c' c2 |& X' z( h: ^1 A, t, }$ m
// ECAP初始化和读函数% }7 d3 y2 P$ N5 g" v
void ECAPInit(void);! y1 _: H- w8 L, _' `
unsigned int ECAPRead(void);+ P: m6 R7 z; x) z
4 |( |% c, H5 i//ARM 中断初始化0 I+ C+ V# C! l( `) E, x6 y
void InterruptInit(void);
$ m- D# g$ f3 j' d6 _) H& D/ r" z2 X7 D" Z# C/ u
// PWM 中断初始化7 `; R' ^' o% r D2 c: Y" Q
void PWMInterruptInit(void);5 _3 a6 _$ v7 r
// 中断服务函数% `) d# t3 V$ _1 D
// PWM 事件, Z; z( U! a' \- e$ t
void PWMEventIsr(void);
! ?2 S: m }4 i, Y// PWM 错误控制事件1 v# T( b7 ^1 U4 z6 m2 P
void PWMTZIsr(void);
* g$ H' n% D7 `5 S0 F7 g0 k b: i
1 i7 P# k2 e) y( {; G( R s/****************************************************************************/0 q" s* A! q5 S; N) d1 y) R
/* */
" y o/ _7 f! S: w' }" `/* 主函数 */: \2 n: z X) W# u# K* s
/* */4 j; R1 A3 k# r: B
/****************************************************************************/% q* x+ ~8 [+ G5 A
int main(void)
* Z) i0 A- {) J$ r' }{
; G% x. G6 {5 r$ a9 o) a) A) ?8 } // 外设使能配置5 |( X( {! W7 T, d
PSCInit();
- X7 G* r. G% u5 L& ~
, H8 ~! b' c' R6 m // 初始化串口终端 使用串口2! \- r) D% A3 i+ g
UARTStdioInit();* M+ ]; a; n) U' r, n, W: M/ }
2 K( |; N; i+ q2 n1 b8 o
// GPIO 管脚复用配置6 v2 `. N- N# w" g/ X
GPIOBankPinMuxSet();. z M$ K& A+ g5 ~/ G6 e
0 _* m" n; G J) E* _1 o // ARM 中断初始化3 `5 [+ O# Q/ x% t; m) |3 y& S; d
InterruptInit();4 A/ Y& o x$ d. i5 w
2 \ w }) r' a& G0 O( e4 r0 B
// PWM 中断初始化
! L# d) K0 p4 _- X5 A PWMInterruptInit();
4 X$ D/ j7 {- U/ |( e! w, d% J0 b- Y( u( }
unsigned char i;
% s0 u$ G! l2 [+ e" ? unsigned int j;- I) q. \4 d& k5 z
" j! s! C9 t0 K- D. @8 J% \6 x
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);% t/ v& S$ b% D
UARTPuts("------------------------------------------------------------\r\n", -1);: n7 M9 b. W( M+ |9 c( Z
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
2 z# ~' V! ~1 v0 j- O // 产生波形
* V3 h: ]: v8 M9 Q PWM1ABasic(25000,50);: S4 ~0 Y5 k* b6 O6 u( L
1 I& _1 q+ V2 j% c: J
UARTPuts(" C6748 PWM Test Over!\r\n",-1);1 b0 F3 G8 s% {
UARTPuts("------------------------------------------------------------\r\n", -1);% Q3 A9 Q: G/ s6 c% |+ _8 R* h
- ~6 [5 w5 }& {
[/ P0 G4 ?# W" `8 P& @; A
2 t: d- j4 N, I: H UARTPuts("------------------------------------------------------------\r\n", -1);
, q# }( W1 ?' t, R9 E) i UARTPuts(" C6748 ECAP Test\r\n", -1);
7 _9 r) s; n" Q( Y% D // ECAP 捕获初始化
N h h5 H+ g2 C ECAPInit();
4 } i$ T' c u! d UARTPuts("Initialize ECAP.......\r\n",-1);. T- ?# K! q- v
for(i=0;i<5;i++)
7 y4 @2 ^* K* T8 M( c% u' t {
- _8 J. w( n, Y for(j=0x00FFFFFF;j>0;j--); // 延时
( |5 E; y7 n9 l0 A* Y ECAPRead();
7 j8 D2 K' P: E# [ }
( d7 J8 g0 d' z/ p; f9 u6 x UARTPuts("\r\n",-1);: J, O2 A' V# d' a# ^7 p
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);8 d+ ~) z/ B( m% K( F4 W9 B
UARTPuts("------------------------------------------------------------\r\n", -1);* [5 r3 ?4 j+ V& T# b
( g) y2 O" ]8 {4 ]+ o' V0 C // 主循环
; E7 h3 c& a8 g% e4 ? for(;;)) z5 o( }$ o% V
{7 I' o9 N/ Z. Q1 b
, C I$ y* D" I3 n- Z }
8 e% a* ]5 Q/ h4 d$ |7 k' c( [% k}
/ o# \# c) N" @: T: P1 N+ {8 f% Z
8 \7 P5 m. K2 G2 M4 r4 M/****************************************************************************/
: d/ b8 `. p7 J" n9 c6 ]$ i- a/* */
& _2 S8 ]3 ^+ R' C+ J0 K/* PSC 初始化 */+ }; @! _ ^2 U V2 e; _
/* */9 D- G9 ?7 [0 N* z; {) s
/****************************************************************************/; m8 W- \4 n9 F( z, e
void PSCInit(void)3 K3 {/ c; v6 {, B
{3 G: Y) v) N% u
// 使能 EHRPWM 和 ECAP 模块4 A, i0 j' T4 M/ H7 B% Y+ X9 ?# u. V
// 对相应外设模块的使能也可以在 BootLoader 中完成# W# ~: u t7 h* c! E
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
N- G3 ? i! }9 H% X0 U PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 [2 V6 q/ F$ P3 z8 ^% f}
9 [9 G5 p: s& Q* ~* ~; d [+ Y3 F' b9 l' {/ x
/****************************************************************************/
; C+ m9 b. v. J, C7 c5 ^/* */
8 Z. G1 A( _. |) o+ j/ ^0 X/* GPIO 管脚复用配置 */
. p/ j% N5 V% q3 y* w$ j. U. w/* */
3 t/ H: h0 {. x% u9 S/****************************************************************************/
+ d5 c3 n/ G/ S2 p9 I; O6 Uvoid GPIOBankPinMuxSet(void); f& [4 S8 n+ ?5 P" B1 u
{4 d6 B* z$ R7 ^7 m, I& ~& P
EHRPWM1PinMuxSetup();5 F: Z( h" g! d7 @' K; N$ x6 ]/ N4 s
9 l) A3 O4 G z4 U) i/ C* f' r0 o // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
$ u1 ^9 {9 t! F' Y // 作为捕获功能时管脚方向为输入
* g; G, C0 e" K1 U1 f/ f // 作为辅助脉宽调制时管脚方向为输出
& a& O( Y: @* v W) I' X // ECAP2 / APWM2
! Z" V) P' ]" z ECAPPinMuxSetup(2);8 r( { c4 W! m; _$ A/ G
9 A! L2 V8 B, s Z: d
// ECAP2 / APWM2方向设置为输入
! _9 }: O6 A! ?+ L GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
_* |, F( Y) a, x}
) l3 a9 H+ B6 U8 M# C. A9 I6 B1 b) j/ x( S9 c
/****************************************************************************/2 I9 t+ U1 A2 \6 y
/* */1 f& F% _/ \ t+ F5 x
/* PWM 输出波形 */# I; h- O2 W) ~
/* */
0 {" ]1 l( z* x e/****************************************************************************/+ t# Q, v( ?4 K; E3 g( f# B
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
# [) ^. d3 T6 M6 h- Z/ \0 Q4 `{
$ B2 F$ {- g- O: _3 [% i [6 N // 时间基准配置
7 R/ S" a6 ]4 `5 @! n! Q* _3 @* E // 时钟配置. f# f$ q d5 t& }7 a/ `& S/ U
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);+ [6 h& V8 s! d i
7 b; t( _8 z" N' c. m+ @
// 配置周期
8 c. ^: z1 L, Q9 ~% H& V0 D& l g EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,1 ~% V0 t; u: E Q2 f
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
9 s: t9 }: V- S$ D8 s9 f/ H+ M9 y1 B8 ?: {; {1 o
// 禁用输入同步信号5 a. }4 N2 D+ P7 N8 ^6 f5 y
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);8 ]& @* Y- u9 V+ T# k$ W
9 ~1 V+ W, z1 O! F$ X* N) Z // 禁用输出同步信号( @& @8 B8 t' x! p1 i/ e
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);, `* E" J/ E8 P$ S* H; Q
" S- m4 X3 \3 F9 D" ?) Y // 仿真(DEBUG)模式行为配置# m5 t1 Z0 N0 y0 q2 @; c( W, [
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
/ r' M9 u! D0 X0 z, ~( J: r$ f( h. \- M/ ` I
// 配置计数比较器子模块
; S( ^8 h6 t6 f- o/ b // 加载比较器 A 值# }: ?+ ^# l+ ?0 U5 x! k: n
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,' B( h: Y& u% t, P E8 a/ S
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
: E4 d \* v% u/ y" s, Y+ Z- j2 {+ u2 y4 V9 Q! E
// 加载比较器 B 值
. |2 @; z) r8 ?" Z EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
- `! i) l1 t8 z3 h EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 ]1 o8 w. i8 n* r' W
! X9 u: N. A, v& ~0 y7 f0 |1 D2 m7 V( k8 c // 功能限定配置(输出引脚触发方式设定)
* _& E: V" t$ l! V1 l, y // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出" C9 g3 x# ]7 F
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,) @% \: h) O6 g6 X5 B& S
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE," y3 Z5 u3 U: v; y3 I' S8 @
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
; L/ P/ u1 U6 P( o# p3 C* Q0 f
8 `. p% f `+ X( @9 Y // 禁用(旁路,信号直接输出到斩波子模块)死区模块
; g, s( g/ C' n; {* n EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
: ~: F% \) c' E5 b7 U: {$ Q( h2 X) W+ ]. f2 q9 \3 V; B& \
// 禁用斩波子模块
% `5 T+ _4 t1 ~5 ] EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
( J# _( u; S) u' l" m7 l2 d; f$ U; D# _$ `% @# S" f
// 禁用错误控制事件) O+ H6 b2 F2 q9 b% W
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);3 E: ~( B+ o# A. X% q; R
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
2 @8 K8 C, f3 s2 e4 m) A) q8 H# d: Q H2 S
// 事件触发配置. c2 d* p' i- G9 @2 k6 ], T9 C( }
// 每三次事件发生产生中断0 y0 T% _8 r0 G$ i+ w
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);( p$ x' z0 F3 t) h* z4 e( m
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* p4 I! ?: ]' Y* p% |; r& M EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);- O! X' K1 h3 |8 [* S3 K
// 使能中断
! X. N" a5 v% _1 o: ]0 v. c EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);- y7 Q$ n! e, G) i- n" U
- E( c: K7 }# S( Z0 X8 k
// 禁用高精度子模块
( f5 Z9 _. h& [# S" X EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
{2 [4 g2 d# A1 x% \0 _$ j9 c
6 ?3 e7 U3 T1 Y: @; w- g UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);2 N( x5 I! h% S/ `# X/ B
}3 u" ^- @6 p' k
- x$ k C% ^5 A) a4 }: evoid ChopperWaveform(void)
- @3 k$ a9 v7 m1 y0 K, C{
& K, {, V7 a. Y! \) }: F: O // 50% 占空比
0 P3 r4 c! R+ X' r* Y/ f EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);6 ]9 [) r- L) S0 }
// 4 分频$ ^2 n5 C& n' P3 a
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
8 P+ J9 y+ P, W // 单个脉冲宽度8 N c& C; ?2 P. D( Q
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);. T# ~" u' r( j& V, P. j! l9 y
// 使能斩波子模块
% A# c; k4 l+ r9 m* |4 ] EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);0 \! ]* e4 e K4 n2 b. {: w7 _
}
8 P' B/ A) P9 Y/ Q9 j( `. X9 c" k' X
/ O5 g% {2 W% R) ~: H4 E" k/****************************************************************************/; Q' [; i$ K% P; C7 g
/* */
+ O! ~% k, `1 P; }3 H( `4 P) r/* PWM 中断初始化 */
: v& A. _3 N+ r' s2 Y/* */; \6 U4 T" I, K }0 G
/****************************************************************************/
5 k+ V2 E1 [9 s2 B% H$ s) W8 _void PWMInterruptInit(void)
" s" i: _4 D7 ?{: T8 @( A- _5 e
// 注册中断服务函数
! e0 h0 |; d, w0 \& S- i) O IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
, f/ v9 `( N6 G. ^ IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
+ h. E% U4 g1 X1 C
% X$ d2 l5 K5 b' W5 d // 映射中断
. p8 M+ v2 n+ `, O i1 F# Z IntChannelSet(SYS_INT_EHRPWM1, 2);; x6 X# C( ~9 {* O+ m, T6 n
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
. n& V4 m" H9 i$ j: r, h: d
/ I& \/ X) O6 y# y3 X/ z& ? // 使能中断3 @! J* c3 L5 p* Q1 \
IntSystemEnable(SYS_INT_EHRPWM1);
" r( V0 }- _9 h IntSystemEnable(SYS_INT_EHRPWM1TZ);0 P2 A$ L- H+ h2 \0 c! \
}
: B F# e' p- m6 Y, U5 e5 {6 O4 J5 I" `/ k
/****************************************************************************/9 \ ~7 Y4 j! Y, j
/* */
p9 [3 g6 L; W: f5 R$ c/* ARM 中断初始化 */
8 F$ e5 H+ p* S' F1 h/* */
) |. W, x T* [1 ?. F/****************************************************************************/
7 O# S8 m7 A3 N. }7 Uvoid InterruptInit(void)( G V1 I' X& p! o/ a2 Y& H
{
+ n, z; }8 n+ ]( G // 初始化 ARM 中断控制器
# o, v' O0 p/ N5 N: q* c1 F8 D IntAINTCInit();
" t' H* S5 b/ [; o
1 |, ?0 A% z& r W+ ~2 Z' `4 O* x // 使能 IRQ(CPSR)' `: d9 \- s! k D: Q8 m
IntMasterIRQEnable();
( u8 t( I% V' n ?$ l
' j3 b# s% ]2 M9 y // 使能中断(AINTC GER)
" G9 b* K+ {4 y, i% Y, n4 C' m" Y4 ` IntGlobalEnable();. @2 |5 w* p$ a! ]; K1 K" f5 z$ H
& v1 @* J4 @3 m/ d( r // 使能中断(AINTC HIER)
' F, X% x8 d% L2 e4 P/ m' ?* ]* W IntIRQEnable();
" f9 Y1 v( q: {7 }- G}
& N6 L; i% F9 u7 r' l2 `* S) R0 u; @) v$ b$ d( O- [' m
|
|