|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************// G1 W# D/ g( C: M8 ]$ i: _1 x
/* */
, s0 g$ J+ H: x% m/ Y/* 宏定义 */: I& k1 \; X1 R2 v' P6 W" r9 n/ o
/* */6 v1 Q8 Z0 P0 C" S7 n5 n
/****************************************************************************/3 X! @: n: ]9 V
// 软件断点0 d5 X1 l$ h f, Y
#define SW_BREAKPOINT asm(" SWBP 0 ");) A' a, n: c1 j
- C" a' v* d& `( t
// 时钟分频( Q5 W, C7 g* f2 j7 h
#define CLOCK_DIV_VAL 2289 t& O' f' R# X4 p; M5 [7 l& k! h
5 F5 c8 F: Z* B$ U! R/ `/****************************************************************************/
: _5 b/ E" R2 e! ^/* */
1 d% h% ?: y I0 M' |# R, V/* 全局变量 */3 y w8 l! Y/ d& _
/* */: [: `6 w0 g1 Y
/****************************************************************************/5 v. b/ J# r* F# t* g& c3 C
ECAPCONTEXT ECAPResult;& p! U) a. Q/ T( O+ |
( M N8 o# V* o* i' N6 O; @/****************************************************************************/
~6 H8 r1 U7 H1 c/* */
8 C) Q* n% v0 h" `/* 函数声明 */
6 d6 D( e! T6 z! t/* */. Q% Q' F4 \" Q7 }+ O
/****************************************************************************/
9 i) c) x) l3 v( M u// 外设使能配置: V* K- L. ^9 |7 W3 R( k4 L6 ^
void PSCInit(void);" ~$ N! ], |) q. c3 E
+ ^& \! t0 x" L8 Z& K: |& H( _9 d$ t1 d
// GPIO 管脚复用配置" j/ {& i0 l9 v( {# [( y
void GPIOBankPinMuxSet();
k: ]* c/ E0 v
& I" y, |9 t6 w3 u2 A. V// 产生波形' h/ m: j5 h6 N' z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);4 X* l" r1 T. e1 l& M
void ChopperWaveform(void);- d0 c7 ]- Y S5 u
+ b. a) a2 a! }( C// ECAP初始化和读函数
3 K O: s5 Y9 B+ y% c( _void ECAPInit(void);
, w( w; @+ d: O; C* nunsigned int ECAPRead(void);7 k% ^) o- T2 e O
- i2 V* K }8 F; {3 s! k
//ARM 中断初始化8 m ^2 ^9 [3 ^) W1 u" q& y! P
void InterruptInit(void);
; a4 l% y: _' T7 c8 Q, J, Q0 F# T* m }+ B
// PWM 中断初始化* n2 V4 V5 Q; w
void PWMInterruptInit(void);
, X5 E' m) u! s9 D// 中断服务函数( P1 e# R% A2 }% E6 T6 @! d
// PWM 事件$ [; Y3 p% }+ i, s
void PWMEventIsr(void);# a y' Q. e) g3 w& g1 \) O/ Q
// PWM 错误控制事件4 }% J; x6 d6 c# |; L7 K
void PWMTZIsr(void);
5 x+ Z* \( l9 @' ]
8 A1 p# q" ^& P0 g/ E+ }/****************************************************************************/
& m2 W0 s# T! w+ s+ u4 \/* */
" Y* J* ?6 ^' w% U/* 主函数 */5 k' E8 i) K0 b0 W
/* */
% {+ p* [" D; t1 R/****************************************************************************/$ ]. r) s+ k+ m% f4 w% M, B! W5 [
int main(void)
- K! v4 H% h* j3 a. }. C{. g8 c8 z- n9 H: _
// 外设使能配置
) d+ q& T; x9 Z( w; _1 y PSCInit();; I0 Q; `' U0 a- P) l2 L$ n0 g; q' j
/ R. {7 u7 I2 h& g // 初始化串口终端 使用串口2: Y( [& Y4 D2 a6 x2 }# y; ~
UARTStdioInit();
+ d4 ?8 n7 u1 z+ u" y" h* N* e
$ z$ i" L6 U$ T: T$ q7 K }/ M // GPIO 管脚复用配置
# ^2 T2 t2 O3 J- [ GPIOBankPinMuxSet();+ q9 w: j0 j7 T, Q) u9 ~
4 H1 B9 i3 V- v% b6 l, S8 M6 R
// ARM 中断初始化
& f! x7 ?$ `; }, x" y9 l7 @' h, p$ X$ J InterruptInit();" V, o* ^7 H, k8 J0 J& v3 R" ?
! l+ k1 c) t+ X2 [
// PWM 中断初始化% c2 f) M$ H. Q% F
PWMInterruptInit();
1 N9 a4 A4 A; |. |. f, {
9 W) t A; \: { f- v1 s unsigned char i;- x/ v* W8 A1 @8 v5 l: a3 d- Q. a
unsigned int j;, E8 { @, O9 o7 j, D
* P) n6 {9 _8 G. [0 d; ^9 _
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
' I% X- K0 G% R5 V: ? UARTPuts("------------------------------------------------------------\r\n", -1);4 c5 }& ]/ g- l( c3 @6 P6 ]5 f" r
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
2 a6 X4 {) y9 r6 n, E // 产生波形# m; V' O& Q% |3 A
PWM1ABasic(25000,50);
4 E. ^! W" I7 [3 F$ V" w4 N4 r8 V% e: S/ H/ a9 y
UARTPuts(" C6748 PWM Test Over!\r\n",-1);, ]! j5 E5 j! a$ j* a& {" j
UARTPuts("------------------------------------------------------------\r\n", -1);
# H' |! X+ }( U, Q. R. H% _% H- X% B# e
3 S f$ k' {/ X! j# ?, K3 c @" D
^) }3 T1 ]# x/ J& H! L0 s5 A
UARTPuts("------------------------------------------------------------\r\n", -1);$ V t. I* J2 o2 d2 w
UARTPuts(" C6748 ECAP Test\r\n", -1);
v1 u& f% J7 R" _. G. r // ECAP 捕获初始化
, o/ b9 \0 o8 r# u- Y( c, b6 _% g ECAPInit(); ]( P: D, s" u$ ~; I8 G. W
UARTPuts("Initialize ECAP.......\r\n",-1);* K- G: o2 ]2 @" M E( e% Y" \, j
for(i=0;i<5;i++)
0 |& m5 h1 I; v9 N. K {$ o& B7 `: t' d+ G. B1 L) z
for(j=0x00FFFFFF;j>0;j--); // 延时
" t$ J/ K; ^/ Q6 g ECAPRead();( Q/ ?. ?! M; J8 }
}0 N: S3 T; Q- |3 f4 g5 o
UARTPuts("\r\n",-1);1 W9 L, m% G$ e. J$ n$ o7 N
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
- R6 b& x$ B7 p UARTPuts("------------------------------------------------------------\r\n", -1);7 R+ k. W6 S0 ~ _: A. z* w, J& F
: A9 l* D; L- I+ a // 主循环( J; k/ t# A+ I/ y
for(;;)3 ^9 s( ]' r' o6 ~) T; ^- `
{/ S: A; c$ I3 \& r
4 W* G0 r4 U \
}: S; f' k& U( t3 D( M9 T- d
}9 K0 [5 _: h) h9 ^
5 x" ~& e, q% P F0 X2 P/ Z/****************************************************************************/
! v7 c! b' \; u) D6 S/* */
/ T, j; ]3 P! O' D4 t; Q# a! m; `2 E: ?/* PSC 初始化 */
, B6 R ~4 b+ Z8 z/* */
& [6 e/ e( w& U5 i4 |. a4 L/****************************************************************************/ X7 U$ {: n D% c2 G
void PSCInit(void)
. k. ~. R" [; c6 u# h' Q{
" m# Z' B2 k# D0 l) P$ P j: ^ // 使能 EHRPWM 和 ECAP 模块/ r3 x9 s/ F$ r/ f
// 对相应外设模块的使能也可以在 BootLoader 中完成
* p7 W: U+ b) \" q8 F PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ w( @, u/ H1 m% k5 q
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);7 {4 z( J! [, q. j/ N- G7 e1 L
}6 ?% q/ w! g4 J) L% c' [
$ j- B X6 g, ^9 j
/****************************************************************************/
) ]; e3 \: g- I8 Z( B: H/* */
* Y4 n1 `; J2 c+ x+ q/* GPIO 管脚复用配置 */5 ~9 J# y6 m# d2 a) t
/* */
$ X) x/ K X5 a' N& ]: c0 [/****************************************************************************/) ^" [. Y4 }% [3 D, k
void GPIOBankPinMuxSet(void)" |) t3 x8 Y% S& P9 E. ]
{
+ o& U3 j% @. d/ C1 B* ]+ R. [" F EHRPWM1PinMuxSetup();$ c4 P E/ h; Q8 J3 ^+ a
; X5 f( P$ x5 e( o7 z8 I
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 E. E4 R+ k7 ~0 Y" f8 @3 h // 作为捕获功能时管脚方向为输入& o8 y% Y' O- s6 S+ ~
// 作为辅助脉宽调制时管脚方向为输出* `9 z. I5 [) w5 {# v
// ECAP2 / APWM2
2 M9 X% X D1 ?% j k: ` ECAPPinMuxSetup(2);- c# k8 K2 E2 ]4 ]0 Y
! N9 m. ^9 M+ Q' q1 o( t" J4 ?- U // ECAP2 / APWM2方向设置为输入
4 A) ^/ T, y6 `8 k GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
* Q2 d- X$ c) f8 f8 p}& G7 Z9 q* c5 Y2 q/ L/ ]9 i. a7 i5 t
9 K( b) a( d5 d
/****************************************************************************/2 c) Q4 r. x |7 G1 I" n* I* z% h
/* */
9 i1 m2 t4 z' @% a! m8 G% t/* PWM 输出波形 */
- l0 @- G0 P2 ^& x: A! Q/* */
+ M; l7 v; e, G$ n, i! _/****************************************************************************/5 W$ q% h1 H3 p5 a/ |' ]$ F2 ]+ u, N
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
% i! _9 e' @0 y" ~& L{* b: y* w$ e8 R4 A
// 时间基准配置& ]+ S B' n+ { d( r
// 时钟配置, O* w* f+ ?% ?/ D6 m
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);8 o( X) I0 s" M: H' ]
: x) F- a; H1 T3 [3 ^ // 配置周期! p. b2 C1 G7 J; ^- i
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,4 N- A' _' [6 `
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);; ]2 m8 T9 S* v3 Q0 [
5 t0 i3 i0 I# h) P; A. ~& i // 禁用输入同步信号
5 s$ s- A$ h# b' w' b0 {) S EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
' g* I9 k/ r/ x9 R8 Q9 G$ T' j( `! Y' j- i* `5 M \/ E
// 禁用输出同步信号
% h& [$ K) [( o1 n, |3 R: E EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
( q, {/ B; w7 s5 L9 A4 q" r' h# D! U$ D5 y& k4 h
// 仿真(DEBUG)模式行为配置
$ d2 j+ x* B" _5 p5 h: w( B) a EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);- A% }6 s. n; R
7 z; ~4 U- Q+ N( V! z$ |0 g: [ // 配置计数比较器子模块' K2 b/ l0 w( q0 C' d0 \
// 加载比较器 A 值 F5 s* `) _) ~: R+ u# L$ k& u+ g
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,7 O. H6 e3 u0 N7 \' k$ E
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' D" \3 x }# Z
7 V7 h+ B( t7 a5 {4 \* [ // 加载比较器 B 值
. L% x6 M/ w# P$ I EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
1 C: K/ T8 v* f: l EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);3 t+ E+ o* H' U6 s% s
- b" T1 i# z* y8 m2 c
// 功能限定配置(输出引脚触发方式设定)
0 l S/ A/ t# |6 ?; e // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出2 j6 d# h; A' }. G" H
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
+ S& v( f7 C7 a9 R1 C EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,7 V O( l8 s, N
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);5 {- b I7 f: A/ n( L% g V3 B
! v/ T. T' ^6 S" n8 f% H // 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 C5 H2 I; \4 r+ b0 o5 K, F& n ] EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);4 e1 ` Q4 b v) y% D
+ \1 j. F0 X6 r // 禁用斩波子模块+ o+ x0 b7 `1 N- v& n. w
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);- a! ]: W5 d" y0 F/ M
9 f& O, s+ O/ A: F& j! o/ {8 a1 y* Z // 禁用错误控制事件
* ]1 B- ` t% ?0 e EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
( z: ^* n6 a, C' h EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
( u& J; c( m9 U- M- x+ y3 y5 y
4 _7 \3 X8 P, L7 B* j // 事件触发配置0 s) r8 W8 A. {+ X6 `
// 每三次事件发生产生中断. P( @) s7 _: V. w# O, d# S
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);. ?# A: P7 ~$ s& e& B; Q9 K5 N+ R
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
l9 `% t8 {: b$ Y. P$ { EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
" B$ f' I4 e( }# l- g+ Y) J! w" L // 使能中断
7 m' [0 S" K9 Z& ^, R5 E: ~+ z' H EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
$ f; @3 a, ^7 w: p& [. b, L
( z/ @& `1 x1 {' T2 G // 禁用高精度子模块
# c! x. I0 l1 G. u0 X EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
& `- B& L( U1 t
7 [$ o8 _" Y8 h1 z# W! t2 g UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
1 ?/ {$ U6 j8 N6 D& R- V$ J5 }}
3 u# q+ @/ R9 p# [- X- n4 T5 K/ O% Z2 |5 [1 O. @
void ChopperWaveform(void)
( F# o2 T: {# C/ ]+ A{
, U7 I; a( c. X" S K1 t, R // 50% 占空比% n6 W+ G- v+ O7 a7 ?" W
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
4 C* m6 w. t$ N/ D( A+ j. P( [ // 4 分频- G L( ?5 U; K" T) D% G6 r
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);2 \" ]) ~* Z& x% q2 W
// 单个脉冲宽度
- ?1 }* X5 q t, G' r9 h! a EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);& b4 c- `) s* F0 o* G
// 使能斩波子模块! Z7 t0 _; E6 u9 {& q1 t
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
$ M! ^. _- \6 \1 T4 D}% S! J3 q! {8 w1 S
3 s: N# N; T8 c0 B6 }' @
/****************************************************************************/' B8 `6 J& O# _2 I5 y% k
/* */
m; {5 ?3 i6 X) p/* PWM 中断初始化 */' {+ U* I. k L3 P
/* */1 x! H, c2 B5 {
/****************************************************************************/
% n* F, `: a7 q2 }* cvoid PWMInterruptInit(void)7 L8 }6 j8 U2 n* y) `6 e- ~ S
{% ~$ G- q. [9 Z1 Q/ Q
// 注册中断服务函数
9 \' B9 V8 \% O* B W* ^ IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
- G; Z8 y! W# L) S3 M% [ IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);+ H, Q( s5 C1 r! @8 \, S M2 U
" w2 @% _: ~" v1 L4 E2 {
// 映射中断# N w/ U! [+ D( }( m7 i
IntChannelSet(SYS_INT_EHRPWM1, 2);0 l, ^) q+ m) x2 C! M
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
`6 U' M+ Z$ X& V" W& ?2 \7 ~
8 v4 G6 ]2 d9 w, E( H // 使能中断
1 N8 ^/ s3 z, s( A; Z IntSystemEnable(SYS_INT_EHRPWM1);
4 A) n' s: x0 c6 ?$ ?% o IntSystemEnable(SYS_INT_EHRPWM1TZ);
- U6 z/ H9 r; _9 A" M, N0 a( `3 z}
: d# O. F# r8 ^) _
: y' @+ X0 l7 \& ~+ O u/****************************************************************************/
+ `$ C, i3 F! c! B( v) ]9 I! p4 x6 w/* */
: E/ s) [6 G* h, t! O! d) ?4 T6 G/* ARM 中断初始化 */, h5 d5 o* a9 f7 [* z( Z, {# D
/* */5 M, g: T% D1 ~& Q2 O
/****************************************************************************/4 g) a( \* o5 E" h3 x2 P- k
void InterruptInit(void)
5 E# {- c3 {; V2 a/ I6 C+ c7 V9 j{8 I- s% e- W; D% d9 i* \3 X
// 初始化 ARM 中断控制器
# S" J0 \0 C+ U" ]: \& Q3 t! x' W IntAINTCInit();0 r8 G. F8 h4 e
6 ]$ \1 }4 ]/ k6 d# L$ b+ b // 使能 IRQ(CPSR)
' B" S+ y2 g( c' w: d6 _ IntMasterIRQEnable();
& u1 F" g. q$ I4 {1 `1 O ^% M3 O }) t# E C
// 使能中断(AINTC GER)
' H; z8 N# ~5 P# v& t% l IntGlobalEnable();
) Z! n& c3 L I( j( h. p7 k
' | W, _2 J- m# f( }$ k // 使能中断(AINTC HIER)$ U# s# j6 s8 y8 C8 W8 v5 f8 q
IntIRQEnable();; ]$ {# x. l& H% X3 ]7 [) S
}
" _$ l M' q# X& ^# N" r" w3 a$ Q; z- [9 o! {1 s
|
|