|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
( b6 c4 C* }" x( d/* */
7 V3 c* d9 c3 b4 @/* 宏定义 */
- m& s2 f, A- @. f) n+ p/* */
. L; {3 R6 ^! _8 f8 b8 z2 B/****************************************************************************/5 J0 v1 D2 |8 y
// 软件断点9 D3 j% q; c6 s7 @) w" b0 Y
#define SW_BREAKPOINT asm(" SWBP 0 ");+ o& r7 P+ J1 o' o$ v
p5 B! N" R1 `: y% y& D& a
// 时钟分频
" k( B1 q9 }1 T0 f. E2 T4 J: ?#define CLOCK_DIV_VAL 228
. L2 R8 A5 m$ m6 g
4 a& A5 o0 z1 h/****************************************************************************/
/ T8 ~3 U+ E* E0 S& @/* */
! O% ?1 T- T* B7 |7 k- _/* 全局变量 */
2 P# N% U( T; y/* */
; b0 F( O& _! ]$ v% x/****************************************************************************/
) y/ E- U+ f% l+ f" e$ K) BECAPCONTEXT ECAPResult;( Y* Z" Q& _4 |$ g7 p
) G2 q% ], E {0 J, f/****************************************************************************/
' y/ S ~/ E: u! R4 ]/* */
@! U9 a7 c! q8 q0 a* Q/* 函数声明 */0 g* c* ~+ J* p6 A" [
/* */
6 p( E* S. B1 O9 y6 P: I) |7 n/****************************************************************************/. W2 x* G2 p0 A5 B$ h4 ` E
// 外设使能配置
! |) e+ s f: V# v( ^void PSCInit(void);. R F2 t* L4 f3 ~$ t4 D
3 j8 f; Z6 H. F
// GPIO 管脚复用配置0 x9 s- B" U/ i$ W9 A" ~
void GPIOBankPinMuxSet();( w# J$ W ]3 q d8 Y, u
& p: c, s* @( J( L, M" a. a! P
// 产生波形8 a) ?4 s1 x, i2 b3 T! @& D. f
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
3 {) y& t# F; Lvoid ChopperWaveform(void);
; m0 K* r* e- u$ }: W
# K8 W) o$ ^% r& n J% E- O// ECAP初始化和读函数
; I5 I+ m9 D/ w p& I- \void ECAPInit(void);
% @" ^1 T* T7 ]. ~, z) a2 L1 v1 punsigned int ECAPRead(void);! I6 R. v" A6 K, S s
7 ^/ u$ t! d7 H* Y4 o& W# @" c//ARM 中断初始化' F5 W. P8 X8 G; c3 _
void InterruptInit(void);
: N: D* u7 G( ?+ l4 |1 I3 l5 v/ s, A5 O% ?
// PWM 中断初始化
" C f5 [' x3 U1 T1 M* ivoid PWMInterruptInit(void);
8 S9 p8 ~& x0 F9 a// 中断服务函数
) U; L; I7 r) ?/ V# A// PWM 事件; m* @0 T" F2 m2 g/ X( Z0 m
void PWMEventIsr(void);) E5 c& c) N" d) Y
// PWM 错误控制事件
P+ r3 A+ q# P) M& Q M) `void PWMTZIsr(void);
4 G) o! c4 `# D/ Q( t" e2 R7 L" U6 e H9 s6 K
/****************************************************************************/! u7 D/ `* ^" I7 P7 E
/* */
]0 u' r% R+ M4 q1 M/ E/* 主函数 */7 g2 t! ?7 l9 Z$ s( @& v
/* */
# ?: j8 T; z7 D, M+ l) K: k/****************************************************************************/" G, n4 W# h8 i0 g- A
int main(void)
5 H7 J: C/ Z) S' r7 N+ f1 b; m{" q+ ^# t' d0 i7 a' h9 S; F
// 外设使能配置% i1 O$ Q+ A' H$ N( q3 a0 n
PSCInit();# Y* E' V: ?- W* V+ h
: ~# h: K5 [& r! Y3 F; ] // 初始化串口终端 使用串口2
1 \. M8 D; s, n# ^8 l" E- y4 t UARTStdioInit();) y i' G8 j9 o. M. n( P5 u& s5 \
2 w( @( j" n; T) V // GPIO 管脚复用配置
0 T0 }1 R' h" P6 j+ k: m0 V GPIOBankPinMuxSet();
& w6 ^" C) ?$ y
' g+ V1 }9 O) u( _3 s' t+ ^ // ARM 中断初始化
: i/ b$ G4 u' ? E( _; B InterruptInit();9 P; v9 A- M) M* g/ q
0 p- W( z9 d: ^/ v6 a
// PWM 中断初始化
. h4 @9 W; Y- E: n PWMInterruptInit();
( o1 ~, p# E+ `2 ]( t* F: Y. x$ }9 K4 Q* ]
unsigned char i;9 ]6 i( h6 H. l! D. ^! ]6 M T, H
unsigned int j;% G% }4 ?5 @: I+ d1 |4 M. `
& [, g& |+ @9 g UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
6 {/ y/ P3 r( M' A UARTPuts("------------------------------------------------------------\r\n", -1);4 ]: R( \6 }- Y" D' B& h5 u
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
. U3 w1 J# K% v! k b // 产生波形) ?7 G v- ?6 I6 O1 \
PWM1ABasic(25000,50);
2 P$ W% v% p, y
+ l5 v8 S9 i; G' i UARTPuts(" C6748 PWM Test Over!\r\n",-1);
1 T( \! r5 z6 C4 I0 r, A1 x+ V UARTPuts("------------------------------------------------------------\r\n", -1);; I0 a0 t T4 m" `; N
' ]6 C% } E& B" I
* j) i) e/ @# q0 E. v# X" q
/ e0 b+ U1 \; m0 A' y& P; B4 s UARTPuts("------------------------------------------------------------\r\n", -1);. E) J Y% S$ |) [: H5 I) ~4 j; C
UARTPuts(" C6748 ECAP Test\r\n", -1);
6 D6 R X; i. j9 F( y) z. t @7 a, q // ECAP 捕获初始化8 A! J* ]" x+ [, [
ECAPInit();- `$ F% k ~" ^# Z H
UARTPuts("Initialize ECAP.......\r\n",-1);9 D$ x0 X) Q& c4 m& |* i
for(i=0;i<5;i++)8 d w6 e2 O+ i2 F
{
) y! N/ q" @- \: Y: t7 r for(j=0x00FFFFFF;j>0;j--); // 延时4 m1 |" w6 X# D6 C1 c! G
ECAPRead();. t9 y4 D( F j* S! z- Q
}
% d9 X% h& H- k, C# ?8 u UARTPuts("\r\n",-1);2 a8 v3 t9 `/ i" z7 x4 Q) q
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);$ C$ m( O k# D. E1 x& k4 u
UARTPuts("------------------------------------------------------------\r\n", -1);& ?6 e& T1 t/ l) Z5 v' z
! Y1 M/ @4 W5 i7 @ // 主循环" Q# c8 ^% l4 g. R
for(;;), G2 R6 G- W! J3 E" W
{
6 p0 U7 `! @$ o) W% |& Q' j0 {$ g9 _1 U/ N
}
7 ^9 D, L% b" n. l) v7 I}! i; [7 o9 g1 o1 |& I, m
* C" {" ]' M7 y8 C/****************************************************************************/
. z; p( J$ R' c( y# d8 J/* */
& a E/ _; v: C. U( P/* PSC 初始化 */
. s# \2 i( Y! b9 \5 {3 `, G/* */) I- d7 i6 o% h6 V4 ~
/****************************************************************************/
9 J$ d/ q$ k( N/ I. D/ i) A! mvoid PSCInit(void): ~8 f4 O9 P. R
{
5 D0 x# t0 ]6 R2 _& T // 使能 EHRPWM 和 ECAP 模块
' A* Q7 {! a+ N. l2 G+ w( X8 s // 对相应外设模块的使能也可以在 BootLoader 中完成7 l4 z: x8 i1 u4 A& L) _. o0 q' [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 Z7 E& s7 S& ]8 _+ K: Y) i PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); v$ Q$ x9 p2 U# F: U7 M% f3 \
}5 Z) y' _* m/ J V7 n
- }+ w6 }1 s$ g/****************************************************************************/- P+ i0 X: ]8 X( c9 r
/* */+ }! u( b* p6 ^8 i1 Q
/* GPIO 管脚复用配置 */% f( c- b2 O: p/ A2 L0 z
/* */
2 S. k( u2 r$ z, H" p/****************************************************************************/. S% L. z: T7 @# o! W8 V
void GPIOBankPinMuxSet(void)
* v* G3 t1 q. P. X6 k1 k{- Q. q8 D1 O4 ^1 z; B
EHRPWM1PinMuxSetup();
/ r' F( @" Q5 o2 O, r6 n
9 u- [9 `# `& T. ` // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)/ `/ {3 k5 P9 q6 Z: V% T$ W
// 作为捕获功能时管脚方向为输入5 c1 \; {8 \( _
// 作为辅助脉宽调制时管脚方向为输出
; N$ d, D& ]* r# [% g: } // ECAP2 / APWM29 U. m6 w' {( V( T! {
ECAPPinMuxSetup(2);
; g- e- @) l7 v( Y: w7 ^
$ A4 `4 w) z- [) Q1 w, F // ECAP2 / APWM2方向设置为输入
( [% e% ~6 W7 q$ y# P GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
. q! V7 p, {- a/ t4 q}
5 _/ F' i4 e" g" R) ^8 X
, D5 n* Q! A$ o: Q8 r3 l1 e/****************************************************************************/
5 A+ @) d2 o) N( W, O7 x7 d/* */: l* l, `, z3 j5 h( X+ Y% @
/* PWM 输出波形 */
c. j" \& N4 ~ H: E! d$ k/* */
! K- K& O" f5 W9 w/****************************************************************************/
. i2 f9 \6 @6 j6 C- f+ O0 Q! ?3 Ovoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)3 P. d3 x# F/ F3 R/ C# M* F6 `
{+ u4 r3 z, ?4 q6 m$ @
// 时间基准配置' y$ n% B. y9 ]- G$ ?
// 时钟配置
# ^; e* V6 y& M" u# V2 ^ EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);% z$ l8 ^5 ~' v: Y+ f: Z/ \' n( M
; Q/ h+ O3 s; u9 r- [! x' g! x, j- D // 配置周期
# v; Z/ W& V. [: G EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,# O' c5 Y) T8 |5 y* G
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
+ h* u! }- X8 V2 Z1 J8 A" r; m% m0 X; ^: d
// 禁用输入同步信号
1 _6 b: P5 T8 J EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
/ K/ N+ {" | Y8 e/ t) U2 a, _8 c; o7 y) S0 z8 X
// 禁用输出同步信号+ m, g9 A, J( o$ F* f
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);0 B! T$ e" x3 t
) ~$ E- m: ^0 F) d // 仿真(DEBUG)模式行为配置
& t, a- ], D, t' P5 B- I! d EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
+ E# E' h" \" S" d) D2 E
9 g' J0 R8 y8 W9 K6 H% ` // 配置计数比较器子模块
* _0 E/ z" v7 U6 w& c: y // 加载比较器 A 值
6 t ^& ~2 J, N! Y EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,1 Q7 ` Q( L! q7 n1 ]
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
$ J4 q: k8 R+ f9 ^' ]* u1 Y6 B9 S+ L- ~$ \& ^1 U* ]
// 加载比较器 B 值7 v+ m: b6 e# j7 @* j* E* \
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,) B( O* Z! y" H1 Z3 x/ T
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);0 @8 f, w4 c8 O" x2 @
1 Z/ B' @/ q* [$ s0 _
// 功能限定配置(输出引脚触发方式设定)
3 m1 s. y, P: L6 L" Z1 z7 w7 ? // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
; }1 g* z& j* z9 ~( @1 T EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,4 j+ [0 b0 _$ r9 L
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
+ n9 z. m4 n' _' { EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
2 q8 h# f. S+ f7 h# `% K2 W7 R5 ]4 M& l) Q" F a% g+ \
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 ?+ A- }0 M3 Q# U EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
' n0 A0 q8 k: p, ^
# m: b: O- L) B2 y1 p( L( j // 禁用斩波子模块
0 f# n8 G4 x) o+ G7 a4 r) B EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);/ A9 y5 V7 q+ z, v
K2 d$ @5 Q; A7 C // 禁用错误控制事件
) { R5 J4 r+ p EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
) [: a: b9 Y4 ]2 J6 N EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);8 {4 @! ]% \# {0 P% Y9 N
7 V) @* T9 |) S) h, p5 _; X
// 事件触发配置
8 ?* |$ x! L+ T // 每三次事件发生产生中断
- E8 s: L" @& L+ V4 `4 O0 ?6 [ EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);) L2 Y1 L( c! z5 ?( B$ c
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
# m5 w A+ J7 e$ r0 H9 \- C EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
" {$ V& b* u9 M9 y" y // 使能中断
! m- g' ~9 p/ j EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) q: g1 e6 X1 B$ a6 `: Y/ p0 L1 s; A! H* C) _( }
// 禁用高精度子模块& a/ _0 M/ r4 Q2 w# v h( G4 i
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);' D( q; f& l; y, F9 o& Y
' [. n2 A! E1 y
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);; U. q7 f) J9 ]" N. i" f
}6 n$ `( p* l; ~6 v
! ~3 M d( p/ e) }- I2 f5 mvoid ChopperWaveform(void)5 h1 ^# G% K; ?& {4 c# z
{2 a: V7 G3 A4 v* W, a, f
// 50% 占空比8 S# x& L W: c6 |3 n
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);; a& l; v7 n4 j% _
// 4 分频
9 i2 {* i# i( a+ A: N EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);' H) d0 H2 `1 Q. r* X8 H U, P
// 单个脉冲宽度" _# @3 e/ t. _
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
4 v/ R* i% d+ j7 t // 使能斩波子模块
; b$ V9 j( W2 l% w* a: m EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 u/ c6 q' Z7 i; Q2 w z B}5 {8 d4 _3 C9 K! B' ^3 V9 j
$ F% a' b0 E7 e c$ v% G/****************************************************************************/1 N) E: k& l% u; A9 R
/* */) A5 h* A& `& `3 Y8 k, Z' B
/* PWM 中断初始化 */: ~7 P; G$ |: }5 R i& T" r
/* */
& z6 U. y2 V# l$ w/****************************************************************************/
1 L5 d+ w; _" n' M! x$ Q* W* Uvoid PWMInterruptInit(void)
) g' f/ [9 l. b t- X: F{3 G0 w$ o. s+ } _6 q+ i
// 注册中断服务函数$ ~8 p. I3 G& l$ y# Z9 V
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* A& a t N0 Q1 C: w2 z& m+ i IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);2 z. F6 Y' |; i0 [& f0 i3 w
9 }3 ?; c( ^. W+ i& \
// 映射中断, r, m4 w' i4 K5 q
IntChannelSet(SYS_INT_EHRPWM1, 2);2 O# S' a5 [4 s5 P
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
( Q- {; p2 l; u! L+ g3 d
) o7 T3 ^; C; V, x9 f // 使能中断
& ]- f z0 q3 }9 H2 w; Y4 y IntSystemEnable(SYS_INT_EHRPWM1);
! j( u. q; S6 y/ J IntSystemEnable(SYS_INT_EHRPWM1TZ);: n8 r& ^' b1 B4 s% }
}
, l1 o h2 s+ w4 }0 ]& |
' J) V4 s% r( c+ z! Z$ w/****************************************************************************/ D3 q r" H' c [" Q
/* */
- O6 G8 S( c" r0 M/* ARM 中断初始化 */" ^* \0 {, B$ ^! T9 {# a
/* */
9 H7 f3 ^% |7 M4 x/****************************************************************************/
3 ?9 c/ Q; `7 W& J$ V) a$ ovoid InterruptInit(void)0 y$ q# h, X$ D3 ~ b
{
. F2 x" V9 R. ?0 p6 g1 A // 初始化 ARM 中断控制器
* Q. t r, Z& w& O* k! @9 u# H) a D" @ IntAINTCInit();
2 X* L7 P7 ?& n
7 i% | Q1 }& ]- Q // 使能 IRQ(CPSR), y. a/ \6 f+ e% Q, c% D3 \+ L
IntMasterIRQEnable();
) Z6 i4 N2 U6 ?+ {/ m4 g: f
8 n& m. N& T& ~ // 使能中断(AINTC GER)
: d* b; o% p% @* ?' w IntGlobalEnable();
# H# n3 ]% x v) R0 ~7 \8 f4 \" C4 a- w! V- x& J7 j& o
// 使能中断(AINTC HIER)- \' y w5 s" o' B/ N3 P' w
IntIRQEnable();5 A9 V, ?* M4 v5 p9 x6 a
}3 Y* ^/ g. B1 x0 ?% v3 W
. o! A& C5 I% _& A2 J$ h
|
|