|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
8 x( }$ \; K! W5 S5 Q1 U/* */6 _/ X: z' Y$ y7 ^
/* 宏定义 */: |) F7 m7 z, S) U2 _
/* */+ U: N$ Z7 f5 ^
/****************************************************************************/
$ {& V$ F8 I6 @- D6 `// 软件断点2 e7 v1 }; w, E. y3 n
#define SW_BREAKPOINT asm(" SWBP 0 ");6 g; z [5 J0 W5 I. h. x% @4 s8 z( g5 P3 d
( ^" M1 A8 a- W/ u& h
// 时钟分频
: j# G: `3 v* P1 Z, b3 b/ Z#define CLOCK_DIV_VAL 228. Q* a5 N m. K2 z
* R1 {! \, G6 m- k
/****************************************************************************/
# C0 d6 r1 J8 V* Y. t2 v3 r/* */1 P V# A$ i. v! c' [
/* 全局变量 */
! k C' W' D2 \& b. V/* */
) }/ _( C- q# t }# q/****************************************************************************/, y4 @' s3 q# }) S/ K' e# s
ECAPCONTEXT ECAPResult;4 O+ Q+ G( p/ `8 f' X& [
! J O8 b; E1 J- f& @* ^ h, R: W
/****************************************************************************/
: {: G) U/ h/ U0 z/* */
~& w8 S% A4 g6 K/* 函数声明 */8 c0 k8 e9 N( q
/* */) i4 i% K3 ?# f8 o
/****************************************************************************/
1 l E+ q5 w+ g m& A, S' f& U- ^// 外设使能配置% a. W7 u" n" b+ c. a; H; O
void PSCInit(void);$ p& S- V( W' B; D
, x5 |$ c0 R* D7 F9 e) _, B3 }; |
// GPIO 管脚复用配置% L' \- C' ^4 c# i( ^
void GPIOBankPinMuxSet();% d4 \+ R" `. O, Y
: A0 E1 n7 \# |+ e* R9 F0 | f
// 产生波形. ]& z* J& Q2 t; L
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);9 [5 ` v. b) _! X
void ChopperWaveform(void);3 k+ _6 z* w+ u
- w" V; ^( [$ ^+ f// ECAP初始化和读函数
9 i0 l; F1 U2 H. p% _8 V# avoid ECAPInit(void);
* e1 ]7 G& D7 o8 Y( d% F, Eunsigned int ECAPRead(void);
- U: C/ {! p0 u
) _2 R8 |3 c8 J' L# X, A0 y) X//ARM 中断初始化6 l5 O8 a! ~% `7 g3 Z" x! P
void InterruptInit(void);
5 K+ \& b' w) R' J! G' w( {4 Y9 ~7 L' R: P
// PWM 中断初始化( C" A# e* B& w- a
void PWMInterruptInit(void);
$ Q6 T6 ]. o$ y o+ |2 t// 中断服务函数 u4 h9 Y- d2 L. _
// PWM 事件
v' T8 d! d/ I( u* w) hvoid PWMEventIsr(void);4 g) T5 t* @; F5 d4 K
// PWM 错误控制事件0 Q( U# L1 C8 E0 K+ r
void PWMTZIsr(void);5 n4 i# n( ~. I8 f b& J, a
+ [( G" ^- _4 F# N) s( ^/ ], y
/****************************************************************************/$ S$ r% m, Q! E9 H. r
/* */) i& I. V# Y O# u& K
/* 主函数 */
( ]# U+ |1 I( Q% E/* */0 m1 T. z+ R; G5 l. }2 j' N$ x( l; Q
/****************************************************************************/- h; `/ A; j; C; O) _
int main(void)+ q( |5 e; y* x- v
{
: i- f+ Q! | ^/ g' a' f) X$ n // 外设使能配置. V- a8 I v( L/ b
PSCInit();+ W: T3 O. z9 m' ^/ i. l- I
5 t& E$ @7 ^# ]3 i# N* B' V // 初始化串口终端 使用串口2! y$ U* Q! [; B8 g7 m2 `1 O% W$ G
UARTStdioInit();
* `4 r% {: C" R. z 2 P. D7 X; t e( j6 T
// GPIO 管脚复用配置7 P) m# l, d0 C; X% y0 T
GPIOBankPinMuxSet();% P3 E- N0 w. X! p
9 \) \$ A* w- H+ A
// ARM 中断初始化; R, S" t. h0 e) J, B& E
InterruptInit();
0 Z9 i; i8 R+ k
# t8 y3 I( g A w0 o7 A // PWM 中断初始化/ f8 Q" n" q* H/ D+ c& g! v# [
PWMInterruptInit();
3 V! t) m3 I! s5 e7 o+ @& N4 B7 t3 ?" k! R
unsigned char i;+ k% k- e" g9 V; {- I
unsigned int j;, |# e: M) }/ l' \
3 \" T, ^+ O6 v9 Z9 r8 J UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
" ]' C8 ]- x7 u J% [ UARTPuts("------------------------------------------------------------\r\n", -1);
3 I- y- B# I4 g, ^: y UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
& ~# d) O/ h; |0 l+ u5 G0 |7 ? // 产生波形
9 Y) ]4 T; w! b4 @$ k PWM1ABasic(25000,50);, q5 y9 M- } E5 l2 F
6 [1 f8 ?" n6 P UARTPuts(" C6748 PWM Test Over!\r\n",-1);6 |. u! L$ \* N
UARTPuts("------------------------------------------------------------\r\n", -1);
7 Z0 u1 K6 L( y/ a& L# b9 m/ Z/ i2 P; v l1 ^+ Q2 e
8 Y6 i7 t( K6 g8 t
: o3 d, j6 n. L! f" U/ D UARTPuts("------------------------------------------------------------\r\n", -1); d( k, D8 S$ B2 d* C4 M
UARTPuts(" C6748 ECAP Test\r\n", -1);
6 f) Z: C/ }+ Y0 k; K // ECAP 捕获初始化/ e. h; ?* `$ v/ ^9 S; S- w
ECAPInit();8 B1 t% t% ~" A t1 b6 n: m
UARTPuts("Initialize ECAP.......\r\n",-1);
9 k. _0 c' w a/ t* h for(i=0;i<5;i++)
. p1 L, n9 V3 b {
' _+ ^2 D T4 y1 m$ y9 ] for(j=0x00FFFFFF;j>0;j--); // 延时0 u1 G1 {6 V$ l) L& |
ECAPRead();8 k" a- Z1 J' y0 j2 S( j9 t% Z
}
2 _6 c5 z# D" A6 a UARTPuts("\r\n",-1);' Y5 d. {; v( `6 ]- k
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);" j+ }: M# s0 r+ B+ ^; P' |7 R
UARTPuts("------------------------------------------------------------\r\n", -1);% J, t S! J0 I( |
& h: X$ f% H7 d `1 D // 主循环
& ~$ B% U9 C* f ^( m for(;;)
! o1 q+ h. ]0 F4 x8 T1 ], `) z {* _$ N' x* [! S4 C
( ~+ K3 r( t3 D9 P
}
! y3 u" b& p8 V! X6 E/ c}
/ H( B* m3 [/ G& g0 \$ } ]" M' d' @/ C3 B; `- e1 [7 i
/****************************************************************************/
1 X" C/ W/ e6 w' R l- _5 P' w/* */9 B$ {+ h5 J. Y
/* PSC 初始化 */" K/ l8 a9 @3 t6 l6 n
/* */
1 R) {) i3 e# ?8 q% u0 V/****************************************************************************/
; |- s ~; u5 }- O7 n. Q7 [void PSCInit(void)
3 c6 P' w' R; [, D) ^" Z Q# A{/ e. S0 }6 E8 o" Z) s& {$ K, s
// 使能 EHRPWM 和 ECAP 模块1 s! T7 p, \' _5 ]
// 对相应外设模块的使能也可以在 BootLoader 中完成+ e6 `1 r# V7 m) Q: d, [
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);1 S4 v0 M C6 A, u
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( b" {7 Q! w" f1 S; e}
" b( m+ w: R. w+ w1 D$ J5 D% ]& Y' U) e8 v# T7 i3 W ^! z# a
/****************************************************************************/
* b7 r( ]1 j) h! X( g9 G/ r c/* */, @1 b4 w7 ?, s/ x
/* GPIO 管脚复用配置 */0 f- }. e$ d% a- l% j
/* */
$ O) g: K. @# j. R& f/****************************************************************************/0 A; p0 D' g" n3 W- ?
void GPIOBankPinMuxSet(void)
9 `0 _; D0 y- s- @, F{
. |; \8 Q4 I( c; {; n7 i EHRPWM1PinMuxSetup();
0 q2 M( [3 t& T3 G
/ }0 u, w3 q+ O // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
/ e9 H& @0 L6 K8 z3 I( q! k // 作为捕获功能时管脚方向为输入) F: h# H% Z" G
// 作为辅助脉宽调制时管脚方向为输出
`- l) T: \, Y* D- \7 r3 X8 |- O // ECAP2 / APWM23 i( a7 Q# C* F2 ~! A* _1 c# K3 S
ECAPPinMuxSetup(2);
/ [. H u+ x5 N, v/ n/ J; J# g" ~9 S) `
// ECAP2 / APWM2方向设置为输入
/ i( a! U: B; f( q- G GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]# d9 _- M, P5 ~ q e9 S5 S8 \& I4 |
}! |1 r) W, A' B* U5 m5 x! T
K6 m, o( s( b9 r" ]. K( C
/****************************************************************************/
3 L) @! |& I( U- s/* */
8 q0 I: C. y B# \# L8 \0 i; v/* PWM 输出波形 */% v9 q; D) I' O- e' U
/* */
* [" {3 N6 Q% T5 H. p$ U& {/****************************************************************************/; V% C* U; H) X$ P; l6 i. i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio), _- X1 Q5 y7 m7 Q
{$ C% ^7 h3 G5 K$ a# {
// 时间基准配置/ ~! n' i+ q+ I# s# b
// 时钟配置
. m' v& P9 h1 E EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);- Z) q' \. [" i& C# h
6 `% |0 ^; f0 j# c // 配置周期
. n2 T" A! }5 ^+ \ EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
b& O4 q& [+ Q, S9 x$ `5 i! }2 e$ C pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);+ l- X' l+ |1 q% n5 v' N
1 V, S4 D5 b* D% P$ H1 j& |7 P // 禁用输入同步信号! b) [6 x1 l) \" Y3 H y
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);) G7 M) E/ w+ Z2 }4 y3 T
4 |0 N' {4 c! `4 i( ^ // 禁用输出同步信号+ q6 U1 y% l: K/ F1 w u
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
" v. c/ y2 o& G* D
8 b6 u5 @% f# |7 _ e% x // 仿真(DEBUG)模式行为配置7 Z+ Q+ ^: p, Q: Q2 Z" `
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);; |, C( z; i5 v" E3 L
, m4 I: G( |3 k9 G0 R; I // 配置计数比较器子模块4 Q2 u0 W8 ^$ b. Q5 W+ ~6 Y% z
// 加载比较器 A 值/ q1 p) [( K6 ?! i, @
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
, Q( M0 `, b5 V1 [1 Q9 M- U8 C EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);, ~3 E, L' b7 n6 n! C
/ H' h! c% d+ `& I
// 加载比较器 B 值 R, o" \- i' K/ _, V& _9 a
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,) _# `0 _0 `4 S3 k( h
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);2 b( g: v/ _* I8 v1 @
8 n1 \ c5 x2 A, }
// 功能限定配置(输出引脚触发方式设定)- x4 b' |# S$ J* U
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出3 y, `2 Q/ v4 l" O! D3 l0 Q, T) A( M
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
9 E1 ]' j' Z m K4 H EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,* I. H5 F. f8 _9 c
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
* @! S2 n8 z0 J4 G- m7 a8 f" a, J( `0 m
// 禁用(旁路,信号直接输出到斩波子模块)死区模块- y6 Q) e( Y3 Y! L
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);. f) l9 U) Q) Y2 }" O" {, H
& |$ n! ^1 a/ G6 v: z9 Z) M9 y; G! c // 禁用斩波子模块
6 e8 m5 y! a5 B9 \6 g/ h7 h B EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
6 a) e% k- K2 H8 u8 k" v7 _
8 r! z2 N1 H) }* K$ J8 q // 禁用错误控制事件8 k1 t5 g% d1 {4 W) p9 b
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
1 y( t9 Y3 c: c& O$ L" K! S& @ EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
/ u9 x$ V/ l& E* D2 U1 _
3 D& s4 y. n( j // 事件触发配置
/ f6 \ V: T# r. Z+ ?8 t: M // 每三次事件发生产生中断 r3 _& q7 J. I6 v
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- S' ?6 l( Q( x" L // 时间基准计数等于有效计数比较寄存器 B 值 产生事件, U$ e) n8 \* e1 J
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
( l1 N" a$ d& @/ ] // 使能中断* w# [( H6 ]5 s e' c0 b- M7 Q: }; K
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
[" m" g* r$ o6 T. Y) R6 n) u% ~, R) Y2 q0 Q, W$ y
// 禁用高精度子模块
8 G0 T, {% c4 d; z4 {+ } EHRPWMHRDisable(SOC_EHRPWM_1_REGS); V1 h( F$ ^8 d* H- Q
. e( j9 A4 |3 U3 `2 A6 \9 h9 I2 _0 x UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
0 S% v3 o' a# b# U9 x2 ?* l G}
' \5 w2 [1 Y: O' W7 L4 [, W5 D5 S; o; c% w: m" v1 K
void ChopperWaveform(void)
! ?. y5 f" s( C" s: r{* t& j- W ?) [3 H/ ]* \" b
// 50% 占空比
' M7 {0 s2 K: N! Z EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER); n9 W$ M. l# n' r% b
// 4 分频
* |- o4 B3 B- Q1 U2 C9 U EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
) N$ ?5 J* p- q6 U // 单个脉冲宽度
4 D% j2 u" g1 S7 \" G$ r EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
8 F" L& Z3 E5 i+ Y! V/ i // 使能斩波子模块
' _: `9 M1 J+ c& F5 g6 T EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);$ [3 ~, v5 B8 r# o; n {7 y
}
: t! Y0 z1 A+ D. [ W a) w* p8 j7 }% r. J2 i
/****************************************************************************/
# d: P) L& M- h/* */2 p3 |3 N9 r0 \# s% E
/* PWM 中断初始化 */
- ?7 o/ \5 f9 r+ Z5 V }( G+ y' Y/* */
' p/ d: O2 i8 `5 W# }$ Z/****************************************************************************/
; u7 ^& X& }" Q. m+ ]void PWMInterruptInit(void)
, n4 G, q6 k- m, P, p1 q/ t{ g' i5 L' H' r: ]
// 注册中断服务函数
+ y9 ~3 L% J5 B# ?2 O3 p" W- ] IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);- r7 O% _0 N J+ S$ b+ i, f8 _
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);5 b9 g0 \7 t) J q% Y" ], |; n9 C
4 w4 m: M! @9 L5 W9 s$ r& x // 映射中断3 G3 }/ m9 ?2 r2 L) Z
IntChannelSet(SYS_INT_EHRPWM1, 2);0 V3 |; N' N4 v1 {! O3 h
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
: M) D8 V: I+ D% s' }& [. o* d- T8 l$ u; K- @' v/ j$ D
// 使能中断
/ s7 t T% S) A& k( I' G IntSystemEnable(SYS_INT_EHRPWM1);
. v+ p: w* I) b; e f+ Z IntSystemEnable(SYS_INT_EHRPWM1TZ);
' {8 D9 C1 H) v2 u, O/ a}
K5 T, h) c7 h1 \, e- p; Q/ s" f+ d, }
/****************************************************************************/4 \/ m |# O( w9 Z" V
/* */% Q+ n4 q/ P) t3 v+ U; {+ o# b0 F
/* ARM 中断初始化 */
% R4 _" N! _9 ]+ w7 w) N/* */. [8 I7 q) K& M
/****************************************************************************/8 {+ B- a2 ?' i/ M1 z4 E+ W1 u) X
void InterruptInit(void)
0 R% }1 X9 k& c3 s2 b3 c{# y, F) `+ @/ r+ i a$ e' S8 G2 G
// 初始化 ARM 中断控制器
' U5 v: Z* e, x: O IntAINTCInit();
( T+ j: p" D% @) S& M$ L* L- p/ i9 x# @
// 使能 IRQ(CPSR)
9 Q" ^, B" d$ S3 Q4 u& p5 p IntMasterIRQEnable();
@3 h P2 X8 A) Q% C1 E' R8 N5 g1 ~$ d) T) W
// 使能中断(AINTC GER)2 @& @' O0 ?' {5 t
IntGlobalEnable();
- p& \/ ], O; v3 X) y
$ ~; j0 J1 m% N+ x // 使能中断(AINTC HIER)5 X$ m! X" m. i5 N
IntIRQEnable();% ]$ B4 C" l# z0 Q6 t% s- k3 f8 h Z
}3 B$ f7 D3 i: M O
& ?) l( V& a/ g$ P |
|