|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
* ^4 H4 e0 X' U8 R3 F( I- P/* */
, i5 D N+ ]( O, |6 h/* 宏定义 */0 }( G3 Z% T/ E; ~
/* */
+ \# r6 c3 I- Q; f4 B1 A/ J/****************************************************************************/
0 D0 ~8 D6 t* ~# n// 软件断点
" u5 r9 V1 {$ X7 n% Q$ F+ _#define SW_BREAKPOINT asm(" SWBP 0 ");
- k8 h% i. }" q3 [5 t9 A& E5 ?2 ]3 B2 z1 J$ O& o4 ~
// 时钟分频
6 `+ R$ \& F" [2 R6 I#define CLOCK_DIV_VAL 2281 M8 m! g. H, p; x5 J
' j) Y7 A) [- k
/****************************************************************************/
& P: h4 ^9 }+ g6 Q6 f. ~# J! I6 z/* */5 Y; q. r, s8 z1 J4 l! D2 e
/* 全局变量 */
- w2 Z, e* l, ?, X' F! ~/* */" J, d7 ^% H/ D9 n2 `) L
/****************************************************************************/
, \/ v: H7 @% o: H% y( rECAPCONTEXT ECAPResult;3 W5 o" i9 m! J* l' s3 m- }; i4 e
6 V/ }) E- j( [7 {5 {. f6 b/****************************************************************************/8 n1 N& b5 u% f- i
/* */- [+ d; @& j6 D: B! ?4 P
/* 函数声明 */
- A7 d9 r$ b6 g" r' r$ S( e. t/* */
$ H* z8 z3 E7 n/****************************************************************************/
8 D& [: O6 w3 Y# j1 w' J// 外设使能配置 a' N3 k: L5 M; L: v" l% M+ d
void PSCInit(void);
0 x; ?, J9 o) n' y# \7 {$ F1 g) s9 j, w
// GPIO 管脚复用配置
7 ~& n! W# d; F" v$ R" Wvoid GPIOBankPinMuxSet();3 m; G7 L/ J7 B5 Z& D
) O3 t1 _" q* g6 N q# g// 产生波形6 W, V+ f' g0 }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
! W& x6 G+ Z8 G+ k1 [/ Kvoid ChopperWaveform(void);
# z# O8 P1 j6 R; s9 r3 t3 n @; t9 n& r" r/ s$ e4 e# a" s2 h1 ^4 ~
// ECAP初始化和读函数7 [7 z- x% J) L, Q3 ]
void ECAPInit(void);% {, m' m+ J" ]1 \- j+ d
unsigned int ECAPRead(void);$ O9 N1 M5 l3 k! @8 E3 K
! S, Q) ?( D4 d! h% [3 C! \//ARM 中断初始化* G! p1 W% b0 X: I+ ]
void InterruptInit(void);
3 y7 c: Q. D* i S: f, Y- ~
4 x8 j% r5 t( k9 ?. Q// PWM 中断初始化" e, G! z& n% q2 i# p8 z
void PWMInterruptInit(void);
2 ^: w+ W- W0 B V5 |- c// 中断服务函数
( C3 O$ Z- ?8 G* b$ g# @) Y// PWM 事件; U/ ~6 D7 Q+ w( }
void PWMEventIsr(void);5 t' h, E& t$ v. ?0 X& ~1 l# `
// PWM 错误控制事件( W v4 F% i; x
void PWMTZIsr(void);
$ k+ c: \3 ^2 X; D7 T+ Z0 A# Y% c4 l9 c. |, U: {( i
/****************************************************************************/& v( l# H- d$ n" Y( r n
/* */4 Q1 ?; `& u8 I+ V, K
/* 主函数 */
1 L0 u1 r/ D* R4 i/* */
, k" O0 b- h& M/****************************************************************************/
+ O/ c- F. C& q3 J8 ^int main(void)
2 k4 h: c+ K$ T, w8 N{$ J$ w8 ]! ~* l8 ^ D
// 外设使能配置
* q" z. T7 w' h ~4 h0 }" `. U- X PSCInit();5 A! T6 x9 A' m9 R
4 X% Z; J- Q* k" K9 f1 ~ // 初始化串口终端 使用串口2
3 A: W; f& K$ ?9 N UARTStdioInit();
" T) e8 |: a8 c' @
6 P* K+ n- T, j r" M9 O // GPIO 管脚复用配置! B; h4 d- b2 y2 k; V
GPIOBankPinMuxSet();
1 J/ u; w h* y5 ~' H. g1 \" `5 Q5 j4 Z9 w, m/ H
// ARM 中断初始化& V/ v8 M% y- g2 g! B# u; q+ H! }
InterruptInit();
2 z) w$ ]" G% ?) _0 u, R2 `) O( M$ I: b. ~# Q2 H8 _+ Z/ `" l
// PWM 中断初始化; w4 f# @; t' T8 A7 Z7 ]( H: I) E
PWMInterruptInit();+ z+ F( {8 I" V
$ Z! P+ @7 d s) e7 r" B unsigned char i;
1 ]3 T1 d; f6 x) Q5 q' P unsigned int j;
- ]' l7 o2 W- l' q1 e' H d9 T9 U6 F6 x. @
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 d% T! ~! _2 R2 L$ J UARTPuts("------------------------------------------------------------\r\n", -1);5 r% R5 r) U- v9 W4 j& K
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
8 v1 I) D1 B2 _- V4 i- } // 产生波形/ z/ b9 q; Q+ y+ i0 H( A+ \
PWM1ABasic(25000,50);# g2 p1 d9 b/ E. ~; U W
) `3 @! \$ C2 S& J( w# L G! c UARTPuts(" C6748 PWM Test Over!\r\n",-1); u' g/ K7 g& J: k9 N- O3 u. m
UARTPuts("------------------------------------------------------------\r\n", -1);
# ~! }0 j: {: s2 U
* r* h8 J( f& c6 o2 ~! Z s8 f6 M7 f
6 h U1 K$ D. U& d8 s6 v { UARTPuts("------------------------------------------------------------\r\n", -1);& I( p1 y; d0 l- d+ V3 x) |
UARTPuts(" C6748 ECAP Test\r\n", -1);
8 _' i, j$ q0 a% J/ A+ ? // ECAP 捕获初始化
! |' r7 x- F! o0 N2 B, n& y ECAPInit();, n( L2 `3 L% ~; _. B" N3 M
UARTPuts("Initialize ECAP.......\r\n",-1);0 Y9 h# Z: S- |8 a. K( E
for(i=0;i<5;i++)" Z$ d) n8 M+ M; C
{) t- x. |4 ~# `. E. F7 U+ U+ \
for(j=0x00FFFFFF;j>0;j--); // 延时# ~% M4 X& y& `2 I0 o
ECAPRead();
0 |' U& m& k! { K+ ~ }
0 c! T' R1 |$ d8 F1 R$ ~, E. P UARTPuts("\r\n",-1);
& ~$ F* ?; ^0 d% l6 \7 Y( ~ UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
7 X3 ?# r' X: R' |/ { UARTPuts("------------------------------------------------------------\r\n", -1);1 r4 M% S6 r( F5 x; d5 p
) h# p3 i/ A# Y+ C s // 主循环
; c* z' t: p1 q2 }( I: b% N% A4 u for(;;)
8 N- c: z4 F9 C7 _ k7 \" ~+ u; t {
% l& p, O" Y% A6 j$ U3 X" Q6 f
" H# T6 A0 t2 C0 ]! @0 D% E8 s }
) c5 Y* r, m2 ^}
4 D8 g/ p: z; v! F, n0 g" _1 B' i( g$ K$ `6 @4 l9 T$ c" P
/****************************************************************************/
% J1 O$ o! N' S" K" V. f/* */# ~% @ P4 J/ ~ T' h* T
/* PSC 初始化 */
% w8 R. \+ A4 r- ~2 b0 X& C/ N1 Q' N9 H/* */; l+ b) i! l# a3 f
/****************************************************************************/
/ D6 Q7 M a, ~5 ^void PSCInit(void)3 Y5 F' r( F8 c/ P$ L. U
{
3 w5 e, c& [9 s3 O3 I7 P1 P) o // 使能 EHRPWM 和 ECAP 模块
/ I9 a; E# A! ?; X // 对相应外设模块的使能也可以在 BootLoader 中完成/ ?2 p/ |5 r! F1 [2 N: }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);! @- z" p3 a1 y7 K& ^
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 _: c5 O0 n1 R" i) o) F; s' }}: D; n. h$ ]% C& ]4 d
; h% B1 G' X/ k6 Y- [7 \: N2 G
/****************************************************************************/
4 Q5 [9 [& W8 ^/* */$ B0 }1 d: | B+ ], p
/* GPIO 管脚复用配置 */9 v! S$ t2 z8 y* p+ G
/* */
6 \! q8 e9 N8 K' h: P/****************************************************************************/
" b8 X8 ^- e9 m4 j0 a0 V1 ]void GPIOBankPinMuxSet(void)
( Z& A. Z s: p$ d% k5 i{- z `. l7 ~* x/ H
EHRPWM1PinMuxSetup();( g6 D) N) [7 [" G4 w
2 Q: {+ i0 V" ]( V9 ? ?
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP), N8 n& P: x) g' i
// 作为捕获功能时管脚方向为输入- }3 l% O. s8 ~) h
// 作为辅助脉宽调制时管脚方向为输出
' L% ^6 x8 V! q4 y$ R1 @/ V // ECAP2 / APWM2
3 `" m7 F) ~0 C9 } ECAPPinMuxSetup(2);5 B) v" C7 w3 D, ?$ Y
: Y. T( p' n4 c5 d8 b* k# j // ECAP2 / APWM2方向设置为输入
/ D8 A3 Q- v7 I3 \, ? GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]5 O! `" p4 f0 Y0 q5 W7 {) o
}
" R+ R! n# r3 p2 \$ O2 u b# B6 o8 _+ L$ B7 q
/****************************************************************************/
; Z0 H- Z! M6 h3 |/* */* N7 z4 Y9 U( i- H4 \
/* PWM 输出波形 */
2 D5 U2 l# f( F: d2 Z/* */
9 d* B5 K) f) s2 X( ]/****************************************************************************/
' D8 r" }% b4 U) X1 Kvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
' e- i: d7 j. }4 m/ }{
. L6 U/ z8 a% `( \ // 时间基准配置
3 A0 ~" J, @3 L2 v // 时钟配置
2 j* C+ p+ y6 ?8 } r EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( J8 K3 p: \: g) {
$ n; M. w' Y7 l' W: X1 n4 i1 { // 配置周期1 h. N8 Q j+ ^# l+ U0 E I
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL, V9 U& H: [2 ?- m& o) q6 s
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);; c" q, H% i. P# H6 R
1 |4 W& w- W9 ^2 W' g0 Y9 }5 s // 禁用输入同步信号% R }; ^. M4 Z0 B9 Q
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
4 |( a% h5 E7 a0 o) i) W W3 H0 J9 c8 _/ t+ ^) X) K8 g# F
// 禁用输出同步信号
( k, x9 Q. Z+ N5 K EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);3 H$ i, [* `5 l4 {& l: h
P) Q% G3 D) a // 仿真(DEBUG)模式行为配置1 q4 ?( @9 z8 }" |
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);/ ~3 X: V5 P0 P8 r0 z
+ T, F3 A9 M6 _" q
// 配置计数比较器子模块1 `) d- _) v4 A6 _
// 加载比较器 A 值
$ D0 E8 x8 f' R EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
2 b$ p1 _1 H( c _1 H* ` EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 H) o# u3 O3 i" G+ c/ P9 p+ |; L. @3 G# K2 ^
// 加载比较器 B 值5 C. J8 _, {. {3 K+ Q) n$ o
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,% k" ]3 y& Y5 l# w0 G
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);1 m s, v5 K4 Y4 a( H
0 H# F7 j6 z9 l, A6 C7 P5 l // 功能限定配置(输出引脚触发方式设定)
$ ~# C. y% t% E: X // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出5 H5 q k: ?9 j4 J: i! _( i
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
, J/ A9 b" ~2 }# R( F6 I EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,. V: _0 f# N9 T$ U- }+ e1 ~5 Y
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
& V& k4 p" {' k; W, U m9 e1 B/ z
+ R7 A8 d& W# O1 L# _9 x1 H // 禁用(旁路,信号直接输出到斩波子模块)死区模块
x1 `5 Y/ i2 y5 a8 o& b0 u EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);6 u5 R5 S0 e8 ~3 w( g3 c
% i0 V! }' F9 C3 w5 Z! X3 [# S, g
// 禁用斩波子模块
6 r, S0 e1 R$ d2 a EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
. k a, z4 J. B4 K/ {7 W: ?1 E) j3 C& s4 o
// 禁用错误控制事件" ?- y4 N a, o( k6 V6 ]5 E! V& l& f
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);$ k7 y, ]" O- R6 e! g" [
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);5 D& l* Z2 g+ u$ U2 P+ J
* B* Y" ?8 a6 u# k
// 事件触发配置
- q, }) ?& f9 I8 \4 v$ N" a+ D2 _" ~1 ` // 每三次事件发生产生中断! T# I! M. X+ F" a8 H" d
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);" b2 e7 D) g+ R) S
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件4 y6 N1 Y1 o" z L, q! k
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
$ B- a& b& _9 p // 使能中断9 f/ X& z' O+ S2 Z% H0 c: s' h
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
, B" j2 g# O3 L# X" _* c& {3 Q3 h
// 禁用高精度子模块
" E5 [0 ~6 P$ ^8 g% J- D EHRPWMHRDisable(SOC_EHRPWM_1_REGS);1 t- ?/ j8 K5 K, b ~. O
$ g7 N) s0 u% y UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);- z w9 ?7 ~0 o
}4 i. e5 f: c1 T H$ c5 W( O$ b- G
% F3 P. T& Z D' U
void ChopperWaveform(void)5 [7 i/ h; m. o& _% ]& L3 u2 G
{
( {) J: R+ h! p4 C! k ] // 50% 占空比
- c) h4 d6 w- w" i& l" J. _6 ` EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
2 [7 y8 f1 m6 D3 ` // 4 分频7 E6 i0 ?# [& F
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
5 y' N4 u, H R: u5 b* n5 A! f: I // 单个脉冲宽度! P. ~: U# A& g. T$ r
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);' r3 h0 \4 W- D% F; Y- m
// 使能斩波子模块
4 t) Z, ~/ d$ o2 E+ B5 i EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);4 O. v6 r( y' K& c$ ^0 s2 V2 R
}
( Q+ i; ~6 r; F# J' a, R; j
9 a8 \1 x5 I3 z+ M* S- l/****************************************************************************/
2 L% n* Z- M& g$ s' H/* */6 f- b* ?2 v+ \. T
/* PWM 中断初始化 */
6 z7 j4 G* `" b/* */
- z4 Y; n3 M' _4 d ]/****************************************************************************/
3 \$ ~* C/ t6 Ivoid PWMInterruptInit(void)$ \. M1 }! L. P
{% e* r& X/ _% O! I
// 注册中断服务函数7 [9 m& N! @, U! d7 m
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
9 _: l0 g8 a" e; h9 |( R IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);# ?/ h* N9 J+ H: J ~
6 ]. h1 D; Y6 u4 X+ I // 映射中断' N) y/ ?7 G' ]" D" z
IntChannelSet(SYS_INT_EHRPWM1, 2);
4 p3 |/ N& I% P [6 v5 ~; ~ IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
6 {# I0 {3 ]$ z8 t5 l/ y; l# U5 }: @! W
// 使能中断
" y: z2 C% K7 s- H IntSystemEnable(SYS_INT_EHRPWM1);1 e: {: c4 f. U
IntSystemEnable(SYS_INT_EHRPWM1TZ);0 l" f+ Q+ y7 r1 ?* e/ N
}( {; h1 R c* |& h% l% u
2 H& j, j6 l- @1 Z4 v1 O
/****************************************************************************// G9 ^2 f; Y( G# {+ I) x
/* */) y# h) q0 r7 |
/* ARM 中断初始化 */
3 o, O8 O B8 M3 D" m/* */
, ]6 r6 @! H4 I: r3 [! _/ _( v/****************************************************************************/0 \. z- V1 p8 \1 \- o
void InterruptInit(void)+ K; ^, H! W9 q$ {. _
{: n) I" ?# H; j$ ?, m
// 初始化 ARM 中断控制器4 {5 z7 Q5 j# Q
IntAINTCInit();) f6 a6 @1 u7 W8 W, C ?4 I
/ B6 V) a, ^1 e+ L B& Y! H: X // 使能 IRQ(CPSR)
# n- D/ H& i& j IntMasterIRQEnable();4 W7 i8 N$ ]. ^; H& _# D' i
, s! i5 o! `) y3 }$ o // 使能中断(AINTC GER)7 O2 \: N& O2 i5 @" X# s) W5 D" f$ D
IntGlobalEnable();
: U6 A- {' l! S4 i8 M# T9 G
3 L2 l' J! U, z) H/ \! t4 P5 b // 使能中断(AINTC HIER)# [) I! C$ e1 W3 ^: b! y
IntIRQEnable();4 Q; `5 c6 y2 p* g
}
, b$ W V/ G' i: b; {" {2 `
* w. J4 ^0 a% h8 e0 U. j l0 S' E* f |
|