|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
1 Y7 U' {, u" R- A6 J+ n5 a/* */
) G1 o1 I0 n+ d4 s4 d- E/* 宏定义 */7 t- _ p: w( r
/* */4 t t8 \, w+ R9 T" M
/****************************************************************************/7 d4 ?- n8 O- o
// 软件断点( j- k: [& h" @1 N
#define SW_BREAKPOINT asm(" SWBP 0 ");* X' S: X) r- H/ @3 H
) k* J6 W$ [. g' a: ~ @// 时钟分频
; N0 D, s, R o" }#define CLOCK_DIV_VAL 228$ V5 ]+ e9 l" W4 x' h! F
7 J6 g- Q# j9 F+ E/****************************************************************************/
& l, u( E& B; q8 w9 q. m& w/* */
7 [# y6 f+ ]% I3 W% a0 Y/* 全局变量 */
) u! `( m C( W( x: ?) l/* */: Y6 D5 _4 t0 l! I- l- Y2 q
/****************************************************************************/# n2 _$ f7 r( y1 V, \
ECAPCONTEXT ECAPResult;
5 f8 ~, @$ c4 b- C7 A% b/ S. L& f& Z7 J/ x0 P
/****************************************************************************/
) h; q$ C7 B- ?, T% s/* */6 c, Z4 L A( r* y0 ^
/* 函数声明 */
. V3 Z# l' k$ Q/* */
4 c8 ?8 d4 T8 j( d' l/****************************************************************************/
1 a, @+ S2 {$ W. ~' C0 a( q6 I9 I8 K5 T0 \// 外设使能配置1 Y/ u4 A0 `7 G. x' M
void PSCInit(void);) N6 {3 |5 m4 c; ~$ Y: w8 q
% L. F" p8 D1 a4 J
// GPIO 管脚复用配置# n& n. H9 t- v9 N$ i1 ~/ n+ H
void GPIOBankPinMuxSet();& ~* b! `7 v4 s. ^
1 |) d) H+ o6 {" i# G; e1 Y8 R; w# p
// 产生波形7 @7 u1 A1 P: P: @: K! n4 B
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);8 ^2 r0 j2 P/ g( Q' z
void ChopperWaveform(void);
: F! ^ y% P! q2 l* O% g3 v6 J# |7 \7 K6 o
// ECAP初始化和读函数
' |0 \# z( N5 v/ Rvoid ECAPInit(void);
9 R- ^' |5 [6 @8 X3 \$ G. Aunsigned int ECAPRead(void);6 y$ _: e, G' {& o
+ l; a; T; l+ H$ q. k) W) W//ARM 中断初始化5 K7 C4 n' |7 [' J; a
void InterruptInit(void);
0 v3 k2 @+ T$ V+ K9 g- ]9 K
a0 }4 l3 }+ F3 d3 {// PWM 中断初始化. x2 g' m( ?0 f) Y5 P) v
void PWMInterruptInit(void);
% E$ L. v1 A, W+ T8 D0 X! f& m# N// 中断服务函数, \0 Z' D1 G0 I; K" m( n6 O; q
// PWM 事件! `: ]9 W+ Z+ P& d3 w
void PWMEventIsr(void);
1 s( r7 {9 U0 h* U, g" o$ T0 j// PWM 错误控制事件9 Y. ]$ C i3 x) P% U
void PWMTZIsr(void);5 W) {% \! A3 d5 v' m) W
4 b- V$ I2 ] q6 f) h1 Z$ c
/****************************************************************************/
% Z1 `- f) c6 R% U# e) y ?: C. e/* */* \9 V( z7 m: p# p
/* 主函数 */
' m, q* ?) g q/ J/* */
2 d4 P) Y7 J& R/ \: Z/****************************************************************************/
/ X4 L/ x: O" Z& i( a: cint main(void)$ L. [2 r. }7 D6 G) ?5 G
{
3 H' Q* H4 p; C: Q // 外设使能配置
& Y; ?- R/ q( I0 A PSCInit();1 u3 v, ~3 E4 _0 D6 Y; @3 [
: l2 X/ I/ V$ K. j d // 初始化串口终端 使用串口2
: s" n+ M7 p. J/ }! A. i" } UARTStdioInit();
( u; F8 k' q0 t$ K: J2 L$ U+ q+ @
: {6 e* Y+ h8 ~ // GPIO 管脚复用配置
3 v2 A9 W4 T P# v+ J* h2 i GPIOBankPinMuxSet();
/ i5 [# H* D+ ?, ^6 q( n' m
6 `$ h: J0 A; J. E6 X' X // ARM 中断初始化/ ]4 I6 h( @. u6 b
InterruptInit();
V, A! q; S' b! u7 D: l x
9 F' _/ }' h9 O- K M7 a // PWM 中断初始化
5 I* _9 V' C' ?3 g, b* h$ H PWMInterruptInit();
% l3 b- v) }$ [5 Y
1 j6 Q2 A" \4 n% e. s, U unsigned char i;
0 ?# X: l. ^7 ^9 A unsigned int j;8 e1 T7 G! d$ C$ J" i
q8 L) T% {6 _% q; Y' [ UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
: Z& h1 d& f0 T- q8 f" f UARTPuts("------------------------------------------------------------\r\n", -1);+ F8 @" p! v; b/ Z! f' M
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
9 d' r% G" Z0 o t/ ^2 u+ l // 产生波形
% h5 B# X5 n# W( B- O B PWM1ABasic(25000,50);
k# [0 A# F# N, G8 [6 Y/ q' a1 U% d" Y) z
UARTPuts(" C6748 PWM Test Over!\r\n",-1);0 W! |: [$ E U* X
UARTPuts("------------------------------------------------------------\r\n", -1);3 ?- x" i2 W, z, W' H, @4 X
5 C1 J% D m9 p1 B
7 {# r2 J6 c- L9 k; _" l# l& R- r) |5 i" q
UARTPuts("------------------------------------------------------------\r\n", -1);/ l1 a9 B7 d8 x: M( d
UARTPuts(" C6748 ECAP Test\r\n", -1);
7 \+ J# E- ^) O6 {) `8 X2 g, ?$ Z // ECAP 捕获初始化
& P% @4 o, h+ S- \# }# {* K ECAPInit();
- s: N, |5 }- g# O: g+ k; U UARTPuts("Initialize ECAP.......\r\n",-1);
$ J3 r/ }* s& Z0 s* Q for(i=0;i<5;i++)* }4 O ]# L* f- D7 x: Y1 n! {
{' O! Y) _ w1 {
for(j=0x00FFFFFF;j>0;j--); // 延时' ?. h2 Z; Q+ C. p4 E- e7 E2 O% M
ECAPRead();
5 s5 n7 @% b% J2 z3 M }) T7 f. {4 ^8 j; g1 `
UARTPuts("\r\n",-1);! ^( x1 Y: _8 `; A
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);" \7 x4 H" g( Z4 @" S$ P
UARTPuts("------------------------------------------------------------\r\n", -1);
6 ~% X8 f+ @9 |# w ?. a: J; d" N( z, m' ?5 ]
// 主循环
/ G6 p% N0 z. e9 t6 ~5 | for(;;)
. b! Q2 h0 v1 h5 x8 V {
1 p1 S0 G0 |( B k, G
7 b' {: F% ~( T1 [! O! i: q5 ^( w }6 J2 E( L. J3 T1 ]
}
2 g9 E6 t7 O: S [# h' d& ^7 _" j; r; b: v5 t9 d. w
/****************************************************************************/, M7 r3 [" s! q" u# F) [. V {. I5 P
/* */* L3 {: Z s0 W5 w
/* PSC 初始化 */
9 Z! S8 S% ]& f7 W+ F- ~5 Z% N/* */
7 f6 p" v* U# }( B( l1 `/****************************************************************************/% ^. Z" Q4 Q+ P( D# s
void PSCInit(void); l/ S- o, K/ B4 R6 O. |
{
1 {* O' k) _/ ? // 使能 EHRPWM 和 ECAP 模块
4 h s* A# o. H# H // 对相应外设模块的使能也可以在 BootLoader 中完成 | |% p: a7 b; x# a, g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
' X8 f; t7 E5 i* T PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
8 l* |/ B& z; W: I5 O}: T. z6 K( [8 k
# C( c( W5 A m$ l+ I/****************************************************************************/7 b/ e8 {! E; |4 K( r( n
/* */* s9 x4 x K) Q7 F; b9 R% z3 G+ T3 I
/* GPIO 管脚复用配置 */. M& H0 ]) O0 j& W4 q1 O+ `0 [
/* */
5 b8 I- o! M/ O. `/****************************************************************************/
/ B0 }) @! J! `$ p; P2 ^void GPIOBankPinMuxSet(void)
8 Y1 j. Q; k& Q4 x( Z+ X{8 D0 r m+ ~. n& O2 R; |
EHRPWM1PinMuxSetup();
1 }! b& W" l1 L& e: F* k* D$ _1 `8 e+ ~
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)& @# ?' y$ F% u8 A2 P
// 作为捕获功能时管脚方向为输入5 {2 {: b; Z$ k9 A- F, k
// 作为辅助脉宽调制时管脚方向为输出
/ j* `1 R( Z4 m // ECAP2 / APWM2' J* |5 K! ~: B) ]$ h) M# _. S
ECAPPinMuxSetup(2);
# f* _* \7 d, v5 _8 O
1 i/ ~: @( x' U# s1 P" ^& V // ECAP2 / APWM2方向设置为输入! @- w1 U& o. L
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7], B' i$ }* z# U7 n
}% x9 X: t0 Q2 y
4 E9 V- Y4 [1 A0 D8 X y) i7 r. x6 `
/****************************************************************************/
# q0 ]1 p& |/ e, i- ^# O$ N5 u/* */$ d- g! A0 Q$ E& ^0 J4 c1 S) c
/* PWM 输出波形 */- _/ O4 F8 `+ I. }. d- n, Y
/* *// u8 e9 |# C5 E, S& Y) |* I
/****************************************************************************/
0 i; I/ H& \! b! x M/ h- i4 rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
8 z; R, _; C2 ^7 e) W2 m{
& U6 T+ | T' G' m% e4 }, c2 Q // 时间基准配置& |' \6 P# M" x& _5 o2 P
// 时钟配置8 k1 Y4 ~% Z2 j# l& A8 l
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- h: V% [/ o( O3 D/ \
8 _; ~& n+ f2 n w% p+ } // 配置周期
& U/ s4 K6 T( M EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,; E) r+ f" G$ B' h" N m( e# Y
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
3 `, |" O" l/ g( {. s8 b! L- H m# [" _8 N& V, b M N
// 禁用输入同步信号
+ V4 g' {- `( N& j1 o! a3 Z+ O( O EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);7 u2 l/ q5 K4 Z" r, U
' ~4 w: f( L' K* Z: Z // 禁用输出同步信号0 O1 v7 M& v! x& o# z
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE); m$ c, D7 \2 T0 B% n$ z9 [# {
. P! S: L+ V' }: P* u4 K# e' ?4 ? // 仿真(DEBUG)模式行为配置* m, A( Q8 I) x* B$ w) m2 I
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);: G) j! @: m& h* H0 ^
1 H1 x! {! L0 a
// 配置计数比较器子模块( a' U# P$ m6 z- d
// 加载比较器 A 值
! }2 {: U& n/ s" u' ]* H. K. _+ n% g EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
& Z2 M9 o: H5 f3 o3 I' C% T$ j0 P EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 f: r) N9 _$ Z& [
t( W) h0 }/ ]7 L! z // 加载比较器 B 值/ I1 V: j: d5 ^& E0 Q& Q$ b
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
7 W: |" N _" m% j% ]1 g N. [9 ` EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);( v: g% Y. R7 X
5 }# B: q6 a4 c) H: [7 R
// 功能限定配置(输出引脚触发方式设定)
5 A1 Y( ^# D7 s% w // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
5 ]9 O6 h' g8 x w$ Z* T: a. ? EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
8 F7 r$ O# U4 T" Z( R9 W. h6 a EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,5 w, `' z+ i2 K; U; }5 l
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);5 S2 Q5 b( _6 A1 G1 ?$ l# C! F/ A
9 ]. \$ H9 P0 E, F4 V s
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
; D3 a" l8 m F' a! @) z/ X/ x6 y6 W EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
9 ?2 x( X2 I. h
4 G$ d( l- X1 o4 N3 P // 禁用斩波子模块4 P8 @& j {. [/ i. \7 |
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, x# K. O0 p) m: p7 i" P1 f+ h% a
; G- C% {5 d) M* T) `) E# t // 禁用错误控制事件
2 d0 y' V/ z& Y# B/ b( N EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
7 K5 ?6 S' P) w* m! W0 L1 Z" O EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);+ K3 ^2 `( u0 N% R" k z9 R
/ t+ J4 E# ~" _ // 事件触发配置7 a& y5 a0 }) C7 U
// 每三次事件发生产生中断- o( Z* _ f% ?/ x" ? X
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
# X; w9 w. }. u3 Z // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
`. C6 B1 q& _2 g Z/ i EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
' p o; Q( d% r) J X& g1 C1 Y% ? // 使能中断. V9 G- e* L/ A" J2 P% I
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);2 ~. t5 m1 d, h* D8 n' t$ Q4 a# e) Z! ^
- W% [: f2 x1 q4 K // 禁用高精度子模块( R1 ]1 j6 s6 f' f
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
0 h/ A7 K/ r1 m0 s- e! W3 h8 o% K1 s6 }
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
' `4 ]. O1 Z; {1 @) L( B% j+ C3 n}
8 s/ W! {0 t0 {: X* P9 F& t* c/ `' ?# |/ C# U S7 k8 O
void ChopperWaveform(void)8 W/ o: l2 o2 d/ }' D* C' v k
{
0 y9 i7 O/ @7 H6 I& h" d- S // 50% 占空比
: K' v" C& V' j8 D EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
& e0 R# n Z" q( A8 a7 d5 U // 4 分频' x+ g, f) R0 ^# C# E
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
& r) n7 P$ v( b. F // 单个脉冲宽度
( @' q7 P4 j3 l. X; p EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);% V4 `8 a5 P% X# b! V+ T3 _
// 使能斩波子模块
/ n+ |. [' F( O: Q# A6 V EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
' M5 g4 n( }' D4 f3 h}
# P: c# c9 S. A/ j: r" _- Z! `( z4 ~# i
/****************************************************************************/
8 W) y* v' G" u/* */) g5 A* u* j5 r- W( M. m" ?5 D
/* PWM 中断初始化 */
1 F2 p0 v' u3 ^ V2 N/* */$ M# K4 b. E6 R3 ]5 e
/****************************************************************************/
! K, `% \" p: Lvoid PWMInterruptInit(void)
; E: j( [- V2 P! M- y! R9 O{0 C2 O1 E; \' v" D+ e) X8 \: @* G* W
// 注册中断服务函数2 d: a: s) C5 R# n# t* y& s& ]
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);; S. B3 Z* e1 z2 }8 K
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);# q$ h1 N: \, l. X) } S
2 O- M$ v/ P0 X3 i* I
// 映射中断' U8 h4 _9 n- d& |3 v G
IntChannelSet(SYS_INT_EHRPWM1, 2);0 p" X8 j/ P' v J+ ^8 m, {( j& n
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 }% Y: o+ i9 k# M/ u( z
9 h( ^ ]2 C2 R$ b }" X // 使能中断
9 f0 X$ Z% A4 P; o IntSystemEnable(SYS_INT_EHRPWM1);
$ v8 O o- e! S! I/ ^ IntSystemEnable(SYS_INT_EHRPWM1TZ);
% I7 c. e: f* J9 R4 z} B* f; h' F; t
, c0 l7 u8 `, M' O- K* d* ^
/****************************************************************************/$ N( y: z: w) c# y: b
/* */
8 S! @% I* @- J& h0 ?, Y8 M$ u/* ARM 中断初始化 */
' {/ u' `8 D! i/* */6 u' X, L; G/ `% d0 e( f, Y
/****************************************************************************/
* C( C$ w1 `- B" A$ X, z7 K1 dvoid InterruptInit(void)
/ f( ]! K; P3 }$ `{: c7 f( @: A+ R' H1 o6 z5 ~
// 初始化 ARM 中断控制器2 p- ?' D4 f' w d' e* |. `
IntAINTCInit();; u# ~# j0 L5 ~' j
# G' |, H4 U0 p- z9 i2 S
// 使能 IRQ(CPSR)
$ }% G/ Q5 Z; i) V) N! o$ ?1 h IntMasterIRQEnable();- g. u& R6 Z6 G, [; g( E' B
8 N' |. R; C4 a" G' M/ Z // 使能中断(AINTC GER)
( R6 S6 [( r2 e) S" t IntGlobalEnable();
% \' W' Z, g% Q3 f
/ F* F: V" a4 c1 ?, }' K // 使能中断(AINTC HIER)
s: ^2 h% D$ n IntIRQEnable();+ Y4 z- ]2 P& t S; o4 f
}
7 x: U6 U6 h% u7 G3 d/ @( Q" b
! o4 }* V7 \5 E3 J) h% k0 ? |
|