|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/+ L# Q; Y3 d. g s2 p
/* */
9 u0 H5 @, l2 Z A/* 宏定义 */
' P5 B0 Q0 `7 \# o [/* */
8 q' g% V8 K* N/****************************************************************************/
! W5 ]: ~5 ^/ I, v6 E& C// 软件断点: A: [9 K! I& q
#define SW_BREAKPOINT asm(" SWBP 0 ");
3 E8 Y2 R1 F6 ]2 ~ K2 r* ^5 s2 }: y7 T8 \3 ~
// 时钟分频6 p# r, S0 b0 \( A, S: v" N
#define CLOCK_DIV_VAL 228
+ w& g3 o2 Y0 _6 O3 h! c% r$ b$ C' l V- t
/****************************************************************************/
3 j0 f- }: J( c- _0 _5 r/* */
+ L8 T% s" L& z6 C" a# i/* 全局变量 */
) f' S5 A& E8 }& `4 H4 `0 U/* */4 ?/ k4 B% d3 d, S2 H
/****************************************************************************/
. @, \5 W0 a! kECAPCONTEXT ECAPResult;
$ [! d/ ]( I. e: K& s2 z/ T9 S& t6 p9 j
/****************************************************************************/
1 _8 g U# v$ \) q' v+ N/* */ J: l6 I3 U; y1 B4 {7 r! ~
/* 函数声明 */
# @/ `' v0 n7 \1 u5 j" h* p/* */
7 Q1 b6 _4 J4 J5 H+ D8 [5 @# x. O/****************************************************************************/
5 }2 f2 E) v- ~: H1 J: Q// 外设使能配置
0 y( x" V- h9 Z; p- ivoid PSCInit(void);
5 j- |2 T! m9 C, I. ~3 C7 W4 q. c0 o6 y6 T! q$ f2 K
// GPIO 管脚复用配置& I% D% m! L" y
void GPIOBankPinMuxSet();
5 h" K7 h9 u o& S3 A1 U9 c( E' y9 I& h+ ^/ [9 [- G
// 产生波形4 v+ z ]/ v" T& P/ V
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);9 ~3 r S' C1 l" C
void ChopperWaveform(void);
/ C/ c/ [) x* k6 d( ~# R. ?; l6 }4 ^5 [4 ? J8 N
// ECAP初始化和读函数' u+ R/ q" [) @# Q/ d
void ECAPInit(void);
4 o, v6 t3 A) n# ^" a5 D9 }, nunsigned int ECAPRead(void); G. c h7 B" m" Q `
8 V; E- Z+ [$ z
//ARM 中断初始化$ S5 ]3 O3 [9 f, p8 @
void InterruptInit(void);" z; X- q/ f5 |1 e4 N
# F M& \! q0 j& L* d& U/ X// PWM 中断初始化4 L n! [" x P% R2 w
void PWMInterruptInit(void);
, _. z' \' k4 A% Q; x// 中断服务函数
( I5 C7 ]2 h8 Z. N" k8 V! q// PWM 事件
- \, R' i9 C8 {void PWMEventIsr(void);
- R$ r, w' o* }- ` |1 |// PWM 错误控制事件
8 Q, O" M/ p7 J$ o& lvoid PWMTZIsr(void);' [- B9 j: f5 t; n! f
8 ?2 K3 X" a0 h3 \/****************************************************************************/9 i: }7 ~8 f6 B7 s. C! C+ m- n! ?: t
/* */% u5 v* [% y7 d }+ |3 ~: _$ W
/* 主函数 */7 N0 J* V1 V) L5 P6 E1 Y3 B5 e" t
/* */% T. r9 I: |# U, \) \
/****************************************************************************/% d, V9 U9 a+ ?
int main(void)8 K$ V2 u' H3 c1 J
{
a* B" @/ C; d- i // 外设使能配置2 k: ]) m- z3 x# d/ ?
PSCInit();
2 W9 a5 h8 f R
3 w9 d4 p. D7 E% U h5 N% I // 初始化串口终端 使用串口2
( y' S; H4 |! ^% ^$ l8 [ UARTStdioInit();, j$ A1 W5 g- f$ R% T: F& F. \+ E
6 e4 f3 Q4 E0 T: X% R3 U // GPIO 管脚复用配置/ G8 b3 [( ]5 A8 l" H, `! B
GPIOBankPinMuxSet();
" T7 J/ u+ d4 L8 b) r5 G( M) M$ Y/ L- A) B" c8 {) X! j
// ARM 中断初始化
& u# m9 m0 f* v# x InterruptInit();
! J2 S2 B+ j4 U4 D" ] L% B4 ?6 U" w$ c2 T& f5 ^) M
// PWM 中断初始化
- y7 C0 }: D' T" t; [$ F0 F% i PWMInterruptInit();, O' Q6 w0 D$ v. \4 e- d
2 i m( y. B% o8 h6 ] f& K
unsigned char i;5 o* S2 a4 }6 S: X! I: V
unsigned int j;
" [: X* Z& m7 g, m$ I! A, {
6 M7 Z; l! G2 V8 W p UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
$ f' ^/ m; L/ V UARTPuts("------------------------------------------------------------\r\n", -1);. j; ^* x" y$ X4 D
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
/ {( k; p$ l) e5 Y* P( {. ^ // 产生波形- O% m3 g8 L8 J. r0 @' | C
PWM1ABasic(25000,50);3 J* D3 i& j7 l( f+ |4 H
& [' X; T j+ ~$ U UARTPuts(" C6748 PWM Test Over!\r\n",-1);( V3 t8 E3 r# P+ `4 F$ V
UARTPuts("------------------------------------------------------------\r\n", -1);/ D8 S3 e% ?/ r' P
$ C$ Z, H- J- }' r; L9 o* P+ ^
4 |6 f( E- }% \+ z8 f( \' k; r( d2 O; C+ @% a- L8 g4 {
UARTPuts("------------------------------------------------------------\r\n", -1);* x0 j( }( K! j% c
UARTPuts(" C6748 ECAP Test\r\n", -1);
% e( j+ `; k% X: ? c // ECAP 捕获初始化
2 Z$ d0 O, \4 S5 ] ECAPInit();
& t' ^- I$ l! r' {' y, i5 H/ E UARTPuts("Initialize ECAP.......\r\n",-1);0 ? t9 j& }6 Y3 i; z w
for(i=0;i<5;i++)# S) V% ~' d1 K; ]& X
{5 W( B( h6 B0 Z
for(j=0x00FFFFFF;j>0;j--); // 延时0 r7 F& q1 ^# e/ u2 h
ECAPRead();
" Q/ _; Y$ h5 V }+ S2 s5 Y3 f6 z7 O1 T
UARTPuts("\r\n",-1);; [* N$ i" u3 w7 f; g1 W, ^
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);2 v' B! ? Z" }4 c( }, U
UARTPuts("------------------------------------------------------------\r\n", -1); v& F9 d1 d9 c8 Y( m, M6 v; @7 {
E5 J/ X+ z+ O1 s // 主循环
# n+ n* i/ a$ }2 L) D for(;;)
% e- @6 B% j! Z% p& p, a {$ |. E& g5 s+ {$ C
9 f9 P1 X: q) t2 A5 V0 g
}
; v G; Q7 m, a! _}
5 [% d# F( n* B! ]+ ~
" T5 f1 O3 b( {/ ^" M3 I: F/****************************************************************************/
, W) E( a1 @- l1 V+ s/ w/* */9 f4 ~) X V' |: e
/* PSC 初始化 */, X# K9 k+ H" z: {# w! r1 M' }+ R9 L
/* */
9 k1 q+ O8 \4 Q7 Z+ c0 [/****************************************************************************/
$ B' P. f/ q) @. q$ Dvoid PSCInit(void)
' o8 U1 v- l- A: Q- Y{
8 K9 p, _$ C6 R/ z S' w // 使能 EHRPWM 和 ECAP 模块0 e9 c' B# m7 S& H
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 T5 s; ]0 k: y8 ~( f PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);. \) @" B! q7 r8 g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);7 W$ e0 |5 K8 v
}
- f9 ^7 d' o; Q) ~8 J: `. V$ O0 e- C
/****************************************************************************/
8 g. R/ @9 K8 H8 f/* */- {2 t! m" `. @
/* GPIO 管脚复用配置 */8 n" H, i4 N |! @7 k
/* */
7 @8 ]' t g) K' v! s( M7 Q/****************************************************************************/
( [" B8 I3 b: i3 n5 Mvoid GPIOBankPinMuxSet(void)
& z4 ^5 Z# l2 k5 C, K. q{" L t9 C+ j2 m1 l r0 N
EHRPWM1PinMuxSetup();
0 ^% {, f4 U$ p! N, S4 U+ D6 u( F
. [ q% k! M8 r$ L$ T) d // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)0 n$ \" T* Y& ?/ g
// 作为捕获功能时管脚方向为输入( V d+ p9 A4 M) J" ~
// 作为辅助脉宽调制时管脚方向为输出
$ O8 Z$ T% \1 e8 A* ? // ECAP2 / APWM2
) ^) W# J, q. I- }6 [ ECAPPinMuxSetup(2);8 Y9 v+ O& F: A* K2 Y
- O8 |; k$ m1 x1 A: h/ B, o0 ~
// ECAP2 / APWM2方向设置为输入
7 P) C) D0 w: v" U7 T1 [7 l* o GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
! `% Z+ x4 ]. m$ C9 T6 y}0 ?( @/ R- W" t+ \+ p" i
2 q& c" P+ F, l- a; |& e$ f/****************************************************************************/
& ~* O1 x5 N! z4 }0 a. M: y* Q/* */
) M0 U6 p* T/ O* y/ B) s6 L/* PWM 输出波形 */! k$ `2 x" z7 n7 p' `1 Y1 q/ ]
/* */
% F2 |, E/ ~# r, B& t/****************************************************************************/
O$ O- p* D2 ~void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)8 g, R9 H$ U8 ]8 H
{; H$ e3 p/ O5 S
// 时间基准配置
/ g; ?% ]- ?/ A& A# r& ~ // 时钟配置
! P! r9 J: p7 ^% j3 Q EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ); \4 g) g+ h; a8 ]/ ~; {
, P: v' `- i1 m+ X* m // 配置周期
8 }7 M5 E5 ?5 X2 s EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,2 |7 V* K' _3 E8 w0 A, y
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);& g. P2 M! V; I. T: s' N: Z Y
- n# C8 F& l( P N* y, {1 g) a
// 禁用输入同步信号6 Z( j, v- R. g! n$ B# J" \
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);6 L' y% _; ]$ i
- b; o2 G. u* G- c
// 禁用输出同步信号3 {9 P, ^+ H# r
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
" C' E/ D. J# Z% ]* R7 {( M+ b8 C! {0 ~8 r' w _' v" c
// 仿真(DEBUG)模式行为配置
9 H0 V x i$ Z1 n3 s4 [0 U EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
$ w2 d$ `1 T- l% _+ _- Z: x1 j r4 l( ]* y! w0 u4 U
// 配置计数比较器子模块0 @$ p! o+ `2 d0 G' f
// 加载比较器 A 值! Q& p# A4 H0 l0 M6 `" f
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
# I; s" T* g. f! ]& i EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# ]4 N" _2 N( e9 v5 w) q0 _* Z+ B: T6 v1 W
// 加载比较器 B 值
' B5 a5 K+ q4 p EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,3 m, z5 F6 u! V# t8 C
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);# F8 M) p- r: f- y5 D$ J+ s
; U% l" u2 C$ x3 y- P+ P' ^: R
// 功能限定配置(输出引脚触发方式设定)
6 u( T) y9 g8 a0 r; ^5 T4 t# ? // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出! `3 s; q4 m& ^% R% \4 _* E
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,- c4 |/ W1 j* k7 T* M3 p1 n% @
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
o9 R6 }3 u1 H: Y9 H EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);' O7 g0 x, c; u% l0 i$ O
# ~2 l$ z' ]( S3 B& K // 禁用(旁路,信号直接输出到斩波子模块)死区模块9 R0 ]3 ]' `' ?5 w$ D( N& G
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);) `, ?3 }2 s: l) Q8 V
" o, |+ e7 C0 a* W. s // 禁用斩波子模块3 Q, {. I) w( E
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);( j5 u6 r% e$ G. E0 w! y9 a
9 ~; w `: \3 p3 u/ s
// 禁用错误控制事件
5 c+ s( c% B6 `6 d; V. V EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);9 t$ X. R$ A/ H% k+ a1 P
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
: O" _) `' r/ ?! W: K2 B" i! a$ g7 w) G! C
// 事件触发配置
% p5 a& a$ w+ k // 每三次事件发生产生中断
' F! J3 \1 N2 R. U$ k EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);, E1 ~% u% i1 ^$ H
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
% a% o0 a* ~* B8 ?0 a# V D/ ? EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);3 M, U5 x& M3 o. J5 T
// 使能中断5 o# F% |9 k2 ] H# Q
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);, J: ]- s( i" ^5 q
! T. D$ n) @4 M0 y) p- C3 X* g
// 禁用高精度子模块
' p$ R. o) W4 I EHRPWMHRDisable(SOC_EHRPWM_1_REGS);9 `- D2 T0 i: ?5 v; |
: t. Y# B& g: ?2 d& H UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);( u# q/ `2 m8 [* m, j4 F$ u# g" \0 r ~
}
; V# F) G! E( k Q4 C! P4 E8 b* m7 V
void ChopperWaveform(void)
2 O5 k0 x( a/ X6 G# b( `4 P, ~{
+ ?8 U v! V2 S( t, w. N // 50% 占空比
" b) N' c* q) n" `: H2 D# P EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
, R% l5 ^1 Z/ f# {# j // 4 分频
7 k: C" D, z9 J# y, e: W EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
0 u) p& V+ e# h- T // 单个脉冲宽度
8 \, j* [8 U. w& |7 `* M9 J3 e& r EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);& h1 L, \1 n2 Y ^5 X$ C
// 使能斩波子模块3 a# F. w0 ]% i6 P+ y. ?. ~) B& t: A' M
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
, {9 ?! }1 s) Y9 ^( R# [- [}
5 \0 i. \& y+ P$ Y
& A; [. G' C. t/****************************************************************************/
* s ^6 g/ w# J f6 Q/* */
' x2 t; C# w& O9 m* Z' y% q; N, l& i/* PWM 中断初始化 */
9 V% ?* Y4 U" E: a% }/* */
9 w6 [' X8 a# k; K/ J$ W2 ?+ c/****************************************************************************/
2 y5 \# N$ q! k* R; Q' F4 M+ a# I* ivoid PWMInterruptInit(void)8 _, B m7 P. Y
{
% E, C$ `( X9 z9 O" H. I // 注册中断服务函数( r6 x- X, Z- [7 a# f' K1 P
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);# i0 @5 r8 m7 Z( R$ O
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);( W4 v E1 L2 Z2 }: m2 D$ T: H
& ^4 S, a! C( F* t // 映射中断
* h8 B2 F+ }3 k5 }, C* A- _ IntChannelSet(SYS_INT_EHRPWM1, 2);( n2 g" s H$ [4 }# [- x
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
) }' ?3 ~7 w# b. k
( C8 R3 C7 G# l+ _* K: w2 d // 使能中断
8 S" a; q* M" _! T/ k! q IntSystemEnable(SYS_INT_EHRPWM1);
! P$ F5 ]+ y6 j K$ _8 U8 p IntSystemEnable(SYS_INT_EHRPWM1TZ);
9 u6 O$ t; }' g0 D) ]- x: N, g}6 \. ^ h6 I% w3 Z: t& |; ]( [
( X' C6 x6 P, n% u5 c( F# D$ \7 g
/****************************************************************************/
! f" s( G+ T+ K9 @/ a/* */7 }0 M( p( w" w. T+ j/ q
/* ARM 中断初始化 */
* E8 {5 }" O. ] T: ?+ w6 p; z/* */% [7 `( g; E! ]' f4 O/ d
/****************************************************************************/
) M, m; j) X% i( E+ uvoid InterruptInit(void)
! Q, G- f2 Q* m2 E5 G& W2 i: H{6 _% T5 b0 o9 w6 V8 q w
// 初始化 ARM 中断控制器1 B& p) T2 Y3 o* [# n- @
IntAINTCInit(); e8 K3 C- }+ c1 n
# K6 W2 w7 y. w$ J4 X l/ c' J" \ // 使能 IRQ(CPSR)
e, G, k" P& U3 _- ~ IntMasterIRQEnable();
; T4 K: r) w- X& r% p9 l2 q+ m3 l$ Z* b8 k7 r& M+ e, n2 P0 ~
// 使能中断(AINTC GER)% F+ L- j$ s/ d! {
IntGlobalEnable();) b/ i$ t l; A
! I. h* u2 u. _6 ^
// 使能中断(AINTC HIER)5 r5 B) v8 {9 `) y
IntIRQEnable();6 e4 {; N! M) X( x
}
- i& X/ \% Y+ Y* I: T
) F5 _8 p' f/ b: A |
|