|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/, K9 b, R; E9 [( M4 b8 w4 o
/* */3 e' x' n% J+ T: R- x- t" Z
/* 宏定义 */
1 d' z2 ~, Z7 U, Z+ S/* */- L8 c" u1 w9 \' q' q% D8 r
/****************************************************************************/
7 b+ Z" |, f6 h; Z# `// 软件断点8 q/ g5 Y7 Y, p3 P2 r
#define SW_BREAKPOINT asm(" SWBP 0 ");
]2 l7 `; Y$ z V, C2 p" t# V5 r% E# |; A; U
// 时钟分频
; b; ]- Z+ L6 `6 ?0 F$ Q1 a4 v#define CLOCK_DIV_VAL 2285 E6 o* ]" E0 L& y( X* T% V* |
$ T+ g2 q2 k% o/****************************************************************************/
5 v3 W* X9 m( T: q) M7 e/* */
x& V- w' s- }0 O0 @9 s+ O/* 全局变量 *// z5 A3 x, y; X4 f$ m7 g5 @ \. f9 z
/* */
$ y! O. a9 k) ]& u4 @3 A/****************************************************************************/
+ C2 ^. b: M2 n; p2 D" y( DECAPCONTEXT ECAPResult;
5 B+ J& G- W2 o( P( ]# [/ ]7 s X2 B0 ^
/****************************************************************************/9 v3 W0 l/ x! L, n7 X
/* */2 [, W6 v# \, S( A: [
/* 函数声明 */
# _2 y, J! B! f' s( |$ ]/* */, t& \ m3 D2 X3 E0 l
/****************************************************************************/
1 L$ f9 q/ w0 X1 n: p// 外设使能配置
8 t; [% C) x. {" x! N5 hvoid PSCInit(void);8 p& Z0 y* |5 e$ Y( T+ O% n) i
! B7 b, ]2 f7 k5 [3 N7 O2 x2 l" }
// GPIO 管脚复用配置
( r7 R6 F0 _: [' e9 F! Pvoid GPIOBankPinMuxSet();% R. a- `! F D3 i
" J6 m$ t) j4 Z4 z W, S
// 产生波形
, I: y' p4 I& V7 y: d% e' V, e- }void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 W* M7 V! B& r% ivoid ChopperWaveform(void);
f& a; {1 e$ z) s- n
+ S+ |& {0 D8 ~// ECAP初始化和读函数
2 G9 ?$ z2 G6 j; ?void ECAPInit(void);
0 Y& l$ Z1 V1 J5 Runsigned int ECAPRead(void);, d6 o( J A+ j, r& {" \" D
9 K8 @/ {2 I& b3 Q8 R//ARM 中断初始化
1 I! @9 W w5 N p4 @void InterruptInit(void);7 m# I/ N4 j/ H+ H6 j& c
* x3 R8 L7 K* @8 ?) l: D" Y, \
// PWM 中断初始化, q8 S# H3 J. y
void PWMInterruptInit(void);
: N+ k. i4 U9 Z// 中断服务函数# {$ E1 g! _; Z2 S
// PWM 事件
( S3 t! T, Z0 l7 g' p/ m2 kvoid PWMEventIsr(void);
4 {- t- m. s) b) E* I// PWM 错误控制事件# U- |" ~* @1 P. q) {0 c0 g8 K
void PWMTZIsr(void);
9 p: }7 K0 L+ T2 W* ]6 C1 n7 Y
9 R$ z1 P4 v$ n+ i/****************************************************************************// @ O: G$ h) z3 G$ g3 R
/* */
2 o* Q3 B5 n: v1 V4 X/* 主函数 */
% e: I8 ~4 U9 ^/* */
, L8 F. D0 E6 k# ?5 |/****************************************************************************/$ y* D2 X. {- S) f
int main(void)6 b7 g' O. z4 p
{( g" q- l; E! G+ N
// 外设使能配置
2 }3 a6 g: g* F PSCInit();
2 N1 y( \6 n, Z1 i% |1 l7 x- \; c. @+ v7 c7 j
// 初始化串口终端 使用串口2
7 H& u" L- K2 u; q/ C UARTStdioInit();3 M. ~) c$ \" o" N4 P2 I7 {5 Y& T
5 c- P( |6 r+ K9 @" D9 L
// GPIO 管脚复用配置
% }/ g$ }4 m5 Y# m GPIOBankPinMuxSet();# H' Q& [* I& B8 e4 ?
& b; ~" B# U0 r" @! G |
// ARM 中断初始化% ~5 m5 p; u$ b
InterruptInit();
; ?, f, z" Z( x2 v( i; j4 {, c
# t) r. X$ N y M, Y // PWM 中断初始化# h6 \9 R$ U$ p2 v- j
PWMInterruptInit();* E& \7 [% R; f; ?8 C6 r# W% z5 ]
' C7 X" u+ }/ N$ s" h, k
unsigned char i;
5 S" U* \/ q* g1 B" h$ y unsigned int j;
& H3 G, ^/ ^0 J0 l+ L) Z$ P$ ?7 f3 V3 _$ c+ {7 j; E
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
, C8 o. L$ r' O/ {- s$ ?+ J UARTPuts("------------------------------------------------------------\r\n", -1);; Y- M' W/ f' e- _
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);, k4 O; D* k! P* l5 k5 @" L
// 产生波形
/ b$ H* n g1 Q& w PWM1ABasic(25000,50);3 _4 ^, m! D$ b* }8 ]" W( M
5 y5 g/ P, h2 ^+ g7 y# k- M UARTPuts(" C6748 PWM Test Over!\r\n",-1);
9 K4 \1 S7 K' k. u3 R0 G( w UARTPuts("------------------------------------------------------------\r\n", -1);
9 c/ t- n# k* y; u' m( |
. e* T2 y( e$ t$ m* x9 ^, j. j0 E3 p, a {+ r3 J) |
2 C o6 ?% t* B! B, {" e
UARTPuts("------------------------------------------------------------\r\n", -1);
7 H- U$ t6 b+ ?: D5 w1 X; z UARTPuts(" C6748 ECAP Test\r\n", -1);# e: V9 ^( v7 f. H
// ECAP 捕获初始化9 ^* e- @$ @& Z4 I' E
ECAPInit();
2 b) \& I# X2 |( ^! K UARTPuts("Initialize ECAP.......\r\n",-1);
# c) X' ~' W% r$ p; _ c* }3 E0 y6 v* \ for(i=0;i<5;i++). n# f+ d4 A/ b8 k; j6 ~
{3 m6 j, j! f) x+ ~
for(j=0x00FFFFFF;j>0;j--); // 延时$ _- a0 X; {2 e2 p2 p
ECAPRead();1 F! {1 y7 B* f9 ]& S+ r# B0 D* d
}* H' `/ v+ M& s1 ?8 B0 d* a: r# L7 W
UARTPuts("\r\n",-1);
! }% ]! w" V' n9 l0 v7 o UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
& L1 D6 u7 X- U) {/ ~6 O UARTPuts("------------------------------------------------------------\r\n", -1);6 E/ D( r- y( u' U3 `/ r1 Q% a
* M m! g' C5 d+ n6 w; I
// 主循环
# b* P5 {% e6 t4 D. Y8 ^- A for(;;)/ a# n K \- Y- V# P* B( F
{
# }, L# F; [" S5 m4 n4 Y
1 L& |; s# X4 X* m, L }
' B; S% `# j% Q7 v* _}
. L y Y! Y/ \( x3 M' A( y4 q9 d
/****************************************************************************/8 [+ J+ o8 Y/ _& ?2 u& l
/* */5 C% h. F$ A% ]7 ] }
/* PSC 初始化 */
1 ?0 Y) D8 R. a) C8 T% l/* */
+ g' Z* l" n7 ^5 X7 {5 p/****************************************************************************/; y5 I* c) n% R9 q) }$ R
void PSCInit(void)
& q7 |9 L5 i7 \! m* x{
1 M Y* k3 f& c1 \1 S' ]6 L3 F // 使能 EHRPWM 和 ECAP 模块
: u- \. G/ L1 H" @' m& B9 G- h6 e // 对相应外设模块的使能也可以在 BootLoader 中完成
/ m, {( q" S! e" t: H( }) G7 Z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 ~% J( _0 J# o8 ^: E# Q F PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ a2 V+ P3 r! d! E( N4 a% V$ }}: B2 `: ?: x) z6 ]* J
3 g7 Y( ?: R! K& j& D/****************************************************************************/5 P. u' \' S0 b2 ?
/* */
) _' b# x5 j8 [6 h6 e/* GPIO 管脚复用配置 */
. x; O: `) Z# ]1 P, Y/* */1 B' X, T% U# j- u
/****************************************************************************/
5 s1 Q A2 L4 P1 ^. y5 r' vvoid GPIOBankPinMuxSet(void)
0 c( N4 w$ C6 o. ]{! e0 y, ^4 Y% z" u: a
EHRPWM1PinMuxSetup();2 E( M4 Y0 g# l
9 r. M' U, G3 O1 Q5 y // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)4 `2 j; q5 e' }$ ~2 |
// 作为捕获功能时管脚方向为输入1 x6 ^, o5 x6 V# o7 k
// 作为辅助脉宽调制时管脚方向为输出# o, A$ I0 o4 u3 F) D' X
// ECAP2 / APWM2
, d" k+ i, q R' s0 y- V! H5 _4 B7 F ECAPPinMuxSetup(2);& \+ `* Z m: T% a! H' U+ \
, D2 V# `& f, O3 m! O
// ECAP2 / APWM2方向设置为输入) A) i/ j/ N" U2 V6 G& `
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]. J) w0 q! m; d9 k. f0 n
}
" W( l7 f. q) m
3 D2 P7 `$ Q' C( \5 [& n/ _/****************************************************************************/8 ]1 K+ q, h8 j. t- j9 Q) d/ @
/* */
, Y- i+ K4 a( }: K; _6 Z/* PWM 输出波形 */
' a& Q. I2 y% t/* */) @( V n+ T! p
/****************************************************************************/
: F2 e$ k( a8 R- Cvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
$ W; O3 f' @# _/ `2 u z{
2 x$ |8 Z y+ v // 时间基准配置- w0 D3 ?) C, E |9 A+ Q
// 时钟配置
& S+ W+ j; I% a7 c. x EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
* R8 c; v3 ^: V
& Z- q, z0 f3 b4 \. m // 配置周期- [5 ]4 R% @/ u& M/ R
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
% b8 Z, O& I+ _ pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
0 g# Q6 ^7 B" s
9 B" S3 p, P% H- U+ O3 `% \, t6 f // 禁用输入同步信号
0 W' M+ }# o& ^9 L EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
3 ^" [+ i1 J+ }4 m/ u
* K3 i2 P1 I( s6 g, G" n; u // 禁用输出同步信号/ C+ o! r" U& Z- w5 n
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);1 r% o) |" b7 X& k
' l. v% \' @3 j! b% Z // 仿真(DEBUG)模式行为配置
- g% t X( b! N7 s. h5 @& x! v) e$ V EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
# W, M W/ z+ f( H
' ]% ]" z( M2 Q" y8 V // 配置计数比较器子模块
' l0 ?( S: o: l/ G; `2 l7 f$ m, @* V* m // 加载比较器 A 值 {- K( m) S+ g5 W0 f: a) T3 r
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,, w/ F! |7 G8 f5 v, L
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
z q# e3 {) X9 h) J/ g
6 m: M2 {+ a' M // 加载比较器 B 值6 S9 B: r; V' m. `- p9 X
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
, n0 i8 _- s% J/ [! U, B EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);2 i4 r' x# ~3 A9 [2 C! X; s
6 ]( Z& E6 I5 t
// 功能限定配置(输出引脚触发方式设定)" j' S1 r- d5 _( L
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出8 w7 V, v- u5 ?$ q* V& n0 E
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,! N( H/ m/ u9 T3 X- E$ Q( y
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* [6 f Y N: J3 p EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
9 M4 ~# M+ u3 X# A
# O! Y9 ]# M- H! H, B& s // 禁用(旁路,信号直接输出到斩波子模块)死区模块
' w B6 m" H# W$ W/ M7 e EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
0 e" ^) U. e1 x7 ^
- L1 \5 a6 @6 R7 D // 禁用斩波子模块
+ u6 ?6 j; S' d/ U! o8 M EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);+ c9 w0 a7 O, Y+ J5 F6 o/ A' m
+ ^, e+ z8 F% }( A* i
// 禁用错误控制事件
+ r5 B+ B+ S1 `3 X) j EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
4 D: q9 W* ~" h% T6 O0 F2 K EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);3 R9 ?/ V# G0 s0 Z- R
. ]; Q2 R! K4 G' \8 Y$ q% f# J @ // 事件触发配置
' s* s" }0 R8 j% y, k3 {, G( o // 每三次事件发生产生中断
1 \3 Q& @) N" V3 U EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
, O ~' P& F8 L4 T5 `" n3 g // 时间基准计数等于有效计数比较寄存器 B 值 产生事件( p2 }, `8 l. {3 P: ~0 Z& r$ M
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);: d8 J$ z, S& u" v. x3 R
// 使能中断
3 e2 s* u+ O6 ]5 l- e3 T EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
; \6 Z7 ?2 U* g, d7 U. A: ~) X+ P& `# d t4 A% r5 }3 E$ K! @
// 禁用高精度子模块
2 D5 R; I3 d6 E f u* ~ EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
5 ~) d+ m$ {0 }5 J4 x
: u' b7 X4 G4 M9 r$ D UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);5 H* z9 Y6 T7 a8 A
}8 ?! x$ E" M7 ]2 h: I! D/ m8 l! L
9 d* o/ h6 \2 q% O# D* j" ^void ChopperWaveform(void)1 Y' q+ I L- q0 d4 S
{
( r. v* ^! m$ R* k- P: s // 50% 占空比
! v* n3 w& {4 v6 N; T0 Y+ ]4 I EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);$ x# z, U$ z+ u
// 4 分频 U6 L' f- c$ Z2 \
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);0 f/ Q$ U e9 A
// 单个脉冲宽度( Q0 @ g/ Y0 j/ x, o
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
1 q7 s: Z+ t% o! k, m+ \! t // 使能斩波子模块
8 x# l S; ~2 Q" p7 j/ c9 N1 ] EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
+ I) r5 m- J& m6 w" D% m}4 }3 c( d$ [! A
% S( B T: t X$ s
/****************************************************************************/
6 ^' C3 G( S U2 ~% { ~, j! X( |$ o5 z/* */
( l( z0 ] Z# j& x7 S6 B/* PWM 中断初始化 */
' a- v u0 c5 y/* */
. U/ _, ]# S1 @7 E2 I+ |/****************************************************************************/
# W; p( B4 w8 x: w- P; _0 Bvoid PWMInterruptInit(void)
. q& ` t: Z2 l9 ?3 [1 Q6 @{# w; L8 ?' p) N5 g6 Z# V
// 注册中断服务函数% Q2 W1 N0 z3 g' Z
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
3 X5 V( [0 O1 h. [, j6 j/ [ IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
; _' Y, s( F! r# D! G5 c
! b0 Q1 F2 y0 ?' `+ D3 Z" u // 映射中断
1 d+ G% u" _$ j IntChannelSet(SYS_INT_EHRPWM1, 2);
" w8 ~4 x% R( G: I" b, E- w1 e8 x IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
# X' }! H) V+ V j) ]2 }2 f9 h6 Y
// 使能中断
! [, K/ Z# u: A+ U: w; f& | h IntSystemEnable(SYS_INT_EHRPWM1);% O9 F3 O- L' l' P
IntSystemEnable(SYS_INT_EHRPWM1TZ);! } N5 n$ T( P- I
}
- F7 ?0 w; k( P5 X& g0 k# e. ^0 B. t- C4 N) v
/****************************************************************************/+ [# p' Z X; r
/* */8 A/ Q6 F7 ]% Z8 l
/* ARM 中断初始化 */: I% D! P J$ i; |- r6 W9 r
/* */1 x& R5 \3 u1 C- U; G) u; q, s
/****************************************************************************/
1 s) A. S; z* v; R! evoid InterruptInit(void)! G+ p, h/ Y: X9 X' o3 e; z3 z
{* ^$ H, V+ y \
// 初始化 ARM 中断控制器7 F7 ~' D0 O/ Y0 [$ U* _
IntAINTCInit();
5 m/ r' H# g% k& g) j) z6 f6 z
: }+ a6 ]( [* r9 J) W5 c; T // 使能 IRQ(CPSR)
& R' }1 ^$ ^9 _ x( h0 h IntMasterIRQEnable();
7 J' _9 x$ B$ m* O' G {; A
, T! M0 v# L* s! _' L // 使能中断(AINTC GER)
5 L7 v, W B: y8 j8 D IntGlobalEnable();
- D2 o. B6 I' W2 _+ w+ s" T1 g! j6 a B5 V! B/ e" F
// 使能中断(AINTC HIER)
4 V- B" ]4 H0 ]' S IntIRQEnable();
5 F% ]" p7 J% q}
* t3 L/ E* B$ P; ~3 ?/ I* L0 ]7 d8 i6 \( t& L, y- k/ U. F
|
|