|
楼主 |
发表于 2018-10-30 17:00:28
|
显示全部楼层
/****************************************************************************/
, G9 T5 ~6 l0 X( k9 Y, y/* *// d. v7 q4 n6 ?8 N
/* 宏定义 */
) ^0 H0 H/ `0 F' X$ C/* */& Z& o7 M& I$ \6 e( ]' M
/****************************************************************************/7 C5 A* y# m1 A7 q( x! A
// 软件断点
0 P1 S" D" G7 @4 f#define SW_BREAKPOINT asm(" SWBP 0 ");
% n3 m1 S1 w8 x& I
& ~" u# ?0 b0 T// 时钟分频
. a: q* a" G' o2 }& s* T#define CLOCK_DIV_VAL 228
( V. J. d7 {1 k: |& X0 x
/ x8 C3 C" k4 _0 k/****************************************************************************/& }2 b r# o& Q. ~3 P/ A9 \; U
/* */+ `. Q- S1 d7 D3 u3 z; p
/* 全局变量 */
- Y+ e% ^/ Q( w: t* o/* */
, ^% a3 Z% y& V6 l5 @) ~+ c/****************************************************************************/
' {: Y8 x7 n% l/ c6 l6 cECAPCONTEXT ECAPResult;* X( C7 A# X8 \, w b
% u& f* a B. l7 m5 n# c/****************************************************************************/
( g& I: | _1 O$ U* `/* */" V8 J# G7 o: I5 Q! R
/* 函数声明 */) H' X+ d9 u+ V( r3 B* C
/* */0 p( k f4 u2 r0 E8 l+ I/ W
/****************************************************************************/
, D. v1 D) r8 m w: c// 外设使能配置
4 k4 `; Y, Y8 L# ^! p, [2 s" rvoid PSCInit(void);" J+ n# G. r- ~9 E; @
" T' a% X5 s0 p" t2 A0 ~5 F
// GPIO 管脚复用配置( V7 G/ @0 r6 m
void GPIOBankPinMuxSet();/ [2 }! I0 [' t8 l. \) a3 Y
5 y: I9 _: O7 ~) R// 产生波形
3 [& R8 w' K+ O4 R; V& L% E! wvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);6 y. {; u4 ]: s$ k/ W
void ChopperWaveform(void);% C1 l, I W* Z0 Z
7 \" i/ T; E1 A% s" Z( i// ECAP初始化和读函数 Q, `) A. N4 ?' o9 x4 y3 Y
void ECAPInit(void);
2 z% `) F1 ]" m9 y" \' Junsigned int ECAPRead(void);
$ e/ i# A1 y% K. w& X: z5 y0 S3 h# e* y: q" |5 s. L
//ARM 中断初始化0 S# ]- t: M8 ]! Z: n" U! |* k, U
void InterruptInit(void);0 x) e3 s: a$ r6 T8 F4 [4 G" ]
; l+ \0 o/ d/ W' R, T+ b/ m// PWM 中断初始化, O) u+ [& }! R2 G4 z0 ?
void PWMInterruptInit(void);: G9 ]7 w+ h& Z! E5 _7 \. f
// 中断服务函数
5 V$ A# T2 `5 M. e// PWM 事件
3 t( T E: b3 b& [void PWMEventIsr(void);
5 y9 p+ w" W; _// PWM 错误控制事件
- o" R# ?0 ?( _% U w! Q9 c: d8 z( t4 Y% ivoid PWMTZIsr(void);7 v3 F2 c1 s0 y, Q3 w4 X
' ]2 p7 O; ^ t1 c$ f1 C! ^
/****************************************************************************/: s" H4 C% I$ b0 r% w& {/ m
/* */. y4 f% \9 S; @/ {+ w; q% V1 h
/* 主函数 */, y( h; O& @' c* _
/* */( j& J" E1 f/ W8 T7 x
/****************************************************************************/. _7 R" d( w" w H# G) r
int main(void)$ ?( ?1 q4 @. ~
{- B8 f( P0 i! t3 s0 s
// 外设使能配置( q2 o4 n ], j O
PSCInit();4 | v6 t* k9 I- r# c" R% `
/ p* `( I% `) S! X! n! l: R
// 初始化串口终端 使用串口28 [. \' H$ I3 U+ h, j/ G
UARTStdioInit();5 s& A7 J K) F( T" i
; R2 v; y7 M0 m // GPIO 管脚复用配置
6 B3 n* V8 {+ G6 N: Q* e7 D GPIOBankPinMuxSet();! x0 f; S! F* Y1 {
3 q+ h+ M" B. G3 P3 K" T$ K u
// ARM 中断初始化
; o: h. a/ ?6 J& E InterruptInit();
2 d; q, l: U5 S* [8 i+ e" F) Z: X |( u8 }! J- f+ t
// PWM 中断初始化
+ ^2 p8 k# D2 b; Y C1 u4 s p! x1 o: p PWMInterruptInit();
# p0 k1 U) h9 j+ ~) r8 Z' d/ {
% q# ~- b5 g: g+ ~' `# N unsigned char i;
8 J7 M& W9 d3 I' K9 f* c3 W unsigned int j;; \ l( v+ i5 ~7 ~3 P/ I" e/ G @
8 Y. `) s; @9 a
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
/ j2 H) ^0 G9 F3 n: b# V# [ UARTPuts("------------------------------------------------------------\r\n", -1);
+ F y& d/ |: b/ k UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
! i$ ]* A2 o$ ]6 M) |2 a+ X // 产生波形0 X3 j4 Q# y+ c$ H3 c
PWM1ABasic(25000,50);9 D' }, M5 _4 n2 ]9 {& [
6 R, e4 H9 s) ]! x ^" z UARTPuts(" C6748 PWM Test Over!\r\n",-1);$ Y2 Z; r' [+ I* }2 {# A
UARTPuts("------------------------------------------------------------\r\n", -1);
- K7 Z( }# Z3 e. ?; T: F( T+ `
3 T/ N* ?, x k, [# C) s6 H$ a% J- d
) M6 r' _! ]0 W I
1 q% e4 P9 T9 C# t5 R' ] UARTPuts("------------------------------------------------------------\r\n", -1);
5 T8 u6 r2 s, x l7 `) `0 y8 H UARTPuts(" C6748 ECAP Test\r\n", -1);
' Y8 @' {* n: q R0 B" `% l: V // ECAP 捕获初始化
! W) [) M6 b8 y1 E5 u( U( Q ECAPInit();
& {4 u* k6 x8 z1 ]& V+ I* l UARTPuts("Initialize ECAP.......\r\n",-1);, }) j6 }/ g& w" I" O: k
for(i=0;i<5;i++)
) P, ]) Y2 `+ K2 `, A" C {
' B+ T2 {( t" u& M/ I$ w# M for(j=0x00FFFFFF;j>0;j--); // 延时
1 Z" w- T( Q% u" s: O% _8 | ECAPRead();$ q+ y+ J+ Q; q2 m6 O/ W3 D
}
D3 l% ]' n1 T; E+ B' J* G) F! b UARTPuts("\r\n",-1);
' m8 T' \- @: m9 o1 q y" ] UARTPuts(" C6748 ECAP Test Over!\r\n",-1);% q# w/ Q: ?1 S& u" b
UARTPuts("------------------------------------------------------------\r\n", -1);
" q. g" I3 ?# [# V% ?
- h5 |6 G. r Y+ G/ ? // 主循环
, v' \% ~: ? m3 I L for(;;)
( b: A. x, g' `) X' i- F- ]+ { a {
% O w9 }4 C4 [3 B6 C7 z% d% l5 n9 m; v( o0 f( q
}
1 V6 P7 O: P% q$ M) ]" P6 O}
7 R1 z5 f) \9 n! g& P7 }+ ~& T* h; p( g& J
/****************************************************************************/
d1 o6 ]! Z9 u; o& ]. L& Y& @/* */
. u3 D/ Q% h0 O% I4 U/* PSC 初始化 *// o" P, @$ } d1 _* g
/* */
2 o5 p/ A$ P* J' N( t/****************************************************************************/% M8 z+ H* ~( U4 L1 b1 h/ l: s. W
void PSCInit(void)) w' \3 d0 A/ p4 z; k0 }6 y
{0 A1 t; L. X- D+ H/ |. f: v% M
// 使能 EHRPWM 和 ECAP 模块5 N/ U4 U; a2 ~5 `' Y6 u J. s4 H
// 对相应外设模块的使能也可以在 BootLoader 中完成: N$ z% G5 f' S3 _# ~2 y4 ?/ c# ~
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); X$ u0 g- s& Y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);& @ N% I8 F- g: Z9 d: P
}! h7 b* g* z3 `, Y- j1 ^, u5 H+ K
9 [9 ]. M# v8 M& J* H' `& u: F3 k/****************************************************************************/2 L7 j& D( ^: e+ @0 C# o5 d9 ^
/* */* B. u) k8 c. \: z% O. E9 o
/* GPIO 管脚复用配置 */2 T) `. p+ c5 l$ e2 X! H
/* */
- j7 G ^5 g0 Y: ?1 \0 W$ ? I/****************************************************************************/
+ \+ O3 C! V2 A% d; Evoid GPIOBankPinMuxSet(void)
+ \# O. o: f: @! X9 z{
/ |0 y6 D; e( ?% G EHRPWM1PinMuxSetup();
6 a0 H( P$ ?; W5 t" g' `- h2 X# m! }
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)! q6 i0 C& c7 t2 B( a" B; f
// 作为捕获功能时管脚方向为输入
; E0 e4 w3 E& m // 作为辅助脉宽调制时管脚方向为输出& z+ n+ Z S. E# R# \
// ECAP2 / APWM2
' J7 P1 |* m# x8 C2 E ECAPPinMuxSetup(2);
; |8 E* f, v2 F+ K! o5 R# w) B! P3 C% U
// ECAP2 / APWM2方向设置为输入
) X% F1 W) y8 Z7 [ GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
! j$ [6 u$ [5 T: A: c& z}! \8 [: j! j6 k+ {' P: ]' H0 J
- g+ R( r' C, ?/****************************************************************************/7 {3 U) A( A- B5 W" E
/* */, u. g% g$ p3 @; I6 `# u" K
/* PWM 输出波形 */
1 P# h" K2 W" U& `/* */9 Y, i/ w8 t; |' r* W+ J* B
/****************************************************************************/
9 k, q# U: z$ g7 J# Fvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
* U: h+ z! p# n8 `% U{. U- D/ |" A, O& C6 r# A
// 时间基准配置; A3 `7 s1 }6 q2 F7 ^
// 时钟配置0 u8 k5 S4 h# E1 t0 e* [
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
1 y+ [( H$ T: t5 B. D2 N8 x4 s& M5 ]( X# o" k8 K' W% Q% m
// 配置周期
( Y3 L( G& A j7 h% z EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,2 [# l7 o* e; _ ^# x3 p* [
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);* ~7 J# E3 }5 {& Q v* i; d
( c" L; L- f8 q7 y: | // 禁用输入同步信号
( }6 z. Q3 u- B9 u EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
% D/ J5 `' s7 Y, z2 m3 w
4 Q% g& S; y$ | // 禁用输出同步信号" h0 ?5 t: h% f& P/ D9 V2 C7 H% K
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);8 l i/ T; D6 |' r
2 P5 _" g+ w: ~ // 仿真(DEBUG)模式行为配置& u, n! u0 `! u
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
. ]3 R# t8 A$ p+ g- E
/ K- _! m2 h$ D0 Z! \ // 配置计数比较器子模块; i: K3 T+ |6 Y4 r7 z
// 加载比较器 A 值
' C9 S; J- b' O v5 u& k& K# \& | EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
8 `; f, c" [) m3 `4 t1 e+ ?) Q EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% F1 I& ^, U; f$ N
& N: J% Z |$ P4 k9 V- c1 d( B // 加载比较器 B 值
# I- c# s; j9 ]7 \" G$ t6 C8 \. J EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,4 H- f8 {+ U( I* g8 C5 j# n
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' b- z. i- Q' j6 M5 z
+ ^' e( c) o" n; e& k8 d' \2 o // 功能限定配置(输出引脚触发方式设定)
6 }: X& l3 D1 D9 B // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
* |) d6 e3 l9 F5 U& x, K! Y* @, \2 G EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
' w9 w# Y4 }9 Q# o EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,! ] T1 J Z: e/ N8 f0 H4 g
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
: C3 Z& @: o( f8 V
" q8 S4 p, N% a) D& Y // 禁用(旁路,信号直接输出到斩波子模块)死区模块6 l: T& g* {$ n: {. ]0 L9 y
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
7 x$ K! [9 R3 Z- Y
; k5 L% P) f( _& i0 A9 f% V // 禁用斩波子模块
8 `. A9 A( x% P2 C; o ?5 o2 `+ [/ k5 N EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
1 N8 ]. F- Q6 t8 H1 V
+ Q- c h, o: {) i' W" h // 禁用错误控制事件0 n/ L/ q8 u# _ j6 Z( c* @) Z7 W
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
. q) V2 ]! [2 U: G6 e EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);2 M0 ?& q0 n6 Z/ X" d0 I/ w
% v8 `& ?( g( A // 事件触发配置+ e4 Q" [- I& J0 b+ e+ G R
// 每三次事件发生产生中断
. ^$ i# ?6 B+ Z! k6 }( P: g EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
. _& @ O5 p% ?- k1 X7 X; c // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
7 Y0 L6 T/ Y, H EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);- v' C& y" n0 J1 z0 u
// 使能中断
! W3 ?0 ~: s- H1 U EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
9 e$ g# f" d8 r: Y. z- |$ x8 B* S' y
- F ]+ U# P0 @0 W4 Q: P // 禁用高精度子模块
1 y C( q8 H4 F+ g! q EHRPWMHRDisable(SOC_EHRPWM_1_REGS);# I2 U) b& n4 A: J# q
, h% M1 c" ?& r; U UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
" a a- b1 Y1 g( n9 |4 C/ m}0 a0 l# j4 w- _0 Z4 [ D# Y' f! c
* `% w8 B* p. O+ x j
void ChopperWaveform(void)
. K0 ^" V& v" ^1 T t G" D4 g{
3 R5 P' T+ l) L' z+ U // 50% 占空比
& Q/ |& y' d5 r4 v EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
1 |% [' F: E3 S8 `1 A6 S" C // 4 分频
& K* B# v ~/ N I EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);: K2 X) [' j7 e1 X% ~$ ~
// 单个脉冲宽度
2 v$ {9 i' T- N4 i7 R+ e EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);( K8 j8 g- {& ]4 n
// 使能斩波子模块
" M5 a5 x0 R$ S; B1 F0 L( o& p) F. d" N EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
1 c4 x7 o, r% O* ? J}
1 [+ M7 E. L* A0 h( C) X7 Z' t9 B2 t
/****************************************************************************/
/ \/ a; I- R( u4 A6 @' b( [2 }0 F/* *// s" j) W- ~5 d7 o# P, @. q
/* PWM 中断初始化 */
, n! e2 }- b. c, w n/* */3 L; r2 b- p% D3 @, J. O9 o
/****************************************************************************/; |" P' z& c+ |9 c& @! b
void PWMInterruptInit(void)
8 P! Q6 [- ?2 i0 o0 y" z+ F{
+ r' _9 O ^) D% R2 [ // 注册中断服务函数2 v6 {; s! V" x) {6 j9 E
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
3 k+ T8 J& X+ L' U IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr); V+ l) r' _) ?% I. B
, {3 F2 [3 s$ U: B6 i; X
// 映射中断! T" f. M* i: {$ b9 `
IntChannelSet(SYS_INT_EHRPWM1, 2);
* b; v. u6 T# p/ A5 P: m ^ IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
6 r' l" q# @) M2 S- X1 I! i1 L( R4 s' i9 _
// 使能中断* O4 h3 a: {. u9 Y5 q1 r8 ~; }0 b4 K( z
IntSystemEnable(SYS_INT_EHRPWM1);
5 x3 Q* r0 ]: s# ]4 r# E* O, L IntSystemEnable(SYS_INT_EHRPWM1TZ);) [0 Z% U; j" s5 y! }. J8 i, x
}* `' Y4 u, b R) X3 A$ i( P; n4 B
: ?& [1 K& J/ q, m% X1 K
/****************************************************************************/% H& L: K$ ^- G$ W( A9 X" |
/* */4 X' i& P! y' f T6 P
/* ARM 中断初始化 */
" x$ A+ m8 @& T E, n3 Q6 X/* */
6 ~) h# t8 Z) c- x M$ K" u0 Q+ ]! L( S/****************************************************************************/& F7 w; G/ a. D0 \5 k$ I! s* I2 m \
void InterruptInit(void)' }" Y' V( n h0 Q% k. u. m* Y
{3 A- B. |* _( a! Q/ [! P$ R; {4 _
// 初始化 ARM 中断控制器
7 a+ G' d$ K9 W IntAINTCInit();
7 N: u/ U3 }) Z( _; I& b/ s. C6 f& e, w2 Z A& y
// 使能 IRQ(CPSR)2 p! {3 F3 k$ K- ]* n; K+ O4 W
IntMasterIRQEnable();
. v0 }, w( o: q( H I/ i
/ I% L+ U& _7 V9 Z! _6 ] // 使能中断(AINTC GER)3 e$ S& W9 Y4 {6 Z- `1 V' a+ b" Z
IntGlobalEnable();
/ h2 i/ n+ y; k* Y# n1 ]
2 n, a! }/ U( q# c // 使能中断(AINTC HIER)
, }: D3 j* I8 m+ ` IntIRQEnable();" A) j4 V- [) U
}
, |2 z% `3 ^8 z- L; K% S1 K2 T K/ a% [) J
|
|