|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/ N0 z8 ?8 m* q
/* */
, m' t: B7 z$ Y( S- E [+ S. V/* 宏定义 */
) a, a5 ~ f# {8 C% R/* */
4 V3 Z% e' F9 L& o/****************************************************************************/
0 a; w* e/ k7 q// 软件断点
: H) a* l6 r: ?+ i& ?#define SW_BREAKPOINT asm(" SWBP 0 ");
8 k! q- Z$ m% [: b$ C
% a0 Z! I( l* i- f- P: |// 时钟分频
$ i8 \9 Y4 |3 }$ |4 k% {6 v#define CLOCK_DIV_VAL 2282 W' l* }. l6 T, n- s* p/ r
8 H# u& f! e, O% z ^+ [/****************************************************************************/
- w4 Z" q( R' z/ g& A/ D/* */
! c2 L% P& T% p9 q7 s& ~/* 全局变量 */* J& r K0 H8 `0 F, X( J0 }% M0 j
/* */
6 Z3 J3 L1 ^ l. ^: s/****************************************************************************/
) d% {' x. r5 |2 ]5 GECAPCONTEXT ECAPResult;
- g0 Y- }( [, C
. X1 B0 j5 }0 G% o" y, v$ i8 N/****************************************************************************/- g' i: S" R& C9 e# i
/* */# X6 {4 A+ L" }- v: v
/* 函数声明 */# J0 O0 n% q; o F$ E; F
/* */3 j5 z/ Z) ^5 X! Y
/****************************************************************************/
2 m9 ?, q5 L P+ @. _// 外设使能配置! |! D" H, S% H5 \" J
void PSCInit(void);, \9 h) P, w& }
8 z4 x' q7 i( |8 v0 O// GPIO 管脚复用配置4 e1 I5 T$ g! t
void GPIOBankPinMuxSet();
* h- Z9 G4 a% {8 a! n' {& ~9 w4 b) ]$ X/ g. {; R2 D
// 产生波形; O, X/ t* y+ X0 g& x4 F
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
+ R2 B/ O: {+ l& T. X( z- z1 u' uvoid ChopperWaveform(void);
. C! [1 L; }9 U4 a; x
9 N5 q4 C* J. l" x% S1 T// ECAP初始化和读函数
0 T- m* V) H: I8 j; Dvoid ECAPInit(void);
# @2 U S! c9 [' g3 t: Wunsigned int ECAPRead(void);$ p+ r% `& I1 z. C4 Z- Q
2 C" ^" K7 P ^% a" ?- V//ARM 中断初始化. P3 Q! i, I N; y0 d% l7 T
void InterruptInit(void);# B* Y& R5 | y! _; Z; g* L
7 o: c4 _) [6 l# N. l! j
// PWM 中断初始化
! E. d! K; d3 u8 @3 Vvoid PWMInterruptInit(void); B, o+ \ e$ V* v0 D& R
// 中断服务函数, V/ E3 \# u6 n( }0 j; B8 |5 u) V
// PWM 事件
# d; |% r# ]6 W0 O3 x7 J( X: ivoid PWMEventIsr(void);5 E# ]0 ?6 ?. s5 h& |0 C
// PWM 错误控制事件
6 a) z9 S e% R% ?- }void PWMTZIsr(void);7 O( K+ \& |1 m8 X2 J c8 G
, ?$ C; r) V( v% I/****************************************************************************/; L; D5 t; R G+ X8 p/ C- X
/* */+ }. t1 {9 i$ K2 b v
/* 主函数 */2 `, K P* y: i* ?
/* */
4 e0 ^2 g m+ O- w, U* g/****************************************************************************/9 M0 |5 I# n8 s) W0 U" @- Q3 c) O
int main(void)
- ^& o& N" q9 G/ {! k* ~1 H{8 x+ k5 `: \& Y9 `' N) L3 j
// 外设使能配置
9 R8 X( i8 S' ?. v PSCInit();
- x9 b) I* ?! j" n K N0 |( D6 E6 M8 `; l" G! `3 m8 e
// 初始化串口终端 使用串口2
( {9 Z, Z2 b/ c: ~" | UARTStdioInit();
6 y5 y) U" K, o. l, { 5 N2 D/ M$ Y8 L* I
// GPIO 管脚复用配置5 H$ ~; p& v5 _! Y8 {# s
GPIOBankPinMuxSet();
8 `; c$ q3 s: }6 ?9 x" d0 ~" P! L e4 W! s2 Z& r9 p
// ARM 中断初始化& [' B$ l! h2 g5 l$ `3 {
InterruptInit();
6 T9 Z* l5 e9 ?' H4 G; Q8 b2 {. Q1 h$ Z) E, j) z$ _; H/ t, Z& u1 ?$ o
// PWM 中断初始化5 M+ s6 n8 `4 r4 N' f! D
PWMInterruptInit();
- `- f1 N) s& x! [2 \' _4 A
7 j& W* D- F, c6 E+ Y5 b" z U+ |3 i unsigned char i;
, ^- ^ i4 K. [% _ unsigned int j;: U* E, o, p& o3 ?9 v- I7 |6 p
& p4 z6 b9 w. r) [9 F UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);! F9 a; i3 z1 g+ u& }7 K
UARTPuts("------------------------------------------------------------\r\n", -1);
6 `1 V. p5 S- e& b G UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
6 t/ M4 X) W8 h( J, M- T1 | // 产生波形
* X4 g/ B" ~$ T: ]' {: _ PWM1ABasic(25000,50);- x- i; L% t; z" |7 m! m. Q. Q# \
5 l0 C @) _) G& }/ s' b" ]
UARTPuts(" C6748 PWM Test Over!\r\n",-1);, A( Y: C8 T9 ~ Y* [
UARTPuts("------------------------------------------------------------\r\n", -1);
e! L; z2 f' L: \4 l( [- h1 I; }9 E8 z3 f1 t+ A" A' a$ f/ _: H b ^
! Y+ S, L3 o" ?8 a
' a) H3 t$ `! E' n& y+ i
UARTPuts("------------------------------------------------------------\r\n", -1);. Z8 j, n& P8 ~, {1 c
UARTPuts(" C6748 ECAP Test\r\n", -1);/ q& Y! T; \2 J( M$ h9 j' {( @
// ECAP 捕获初始化2 Q$ y" {9 ]2 h9 a+ {
ECAPInit();
" m9 o. X; E% q& f# u [; {, ^ UARTPuts("Initialize ECAP.......\r\n",-1);
D; R' q7 y5 P0 K for(i=0;i<5;i++)2 m+ _9 q7 O) X; N# G" R
{
" Y7 H% g& D! u for(j=0x00FFFFFF;j>0;j--); // 延时+ ]$ H/ r2 I( m- `+ ` f6 f3 T
ECAPRead();' t' w- O7 `4 G# s
}
9 t& N8 l1 ?) N* D! p& d UARTPuts("\r\n",-1);
* W: e' e; X) n$ ]0 n6 T- y7 v4 { UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
* o: L( ~3 {' T% y& }1 e UARTPuts("------------------------------------------------------------\r\n", -1);
4 s/ I' [3 m' v- k ?" N5 g: V
& @3 a- o, L; K1 r // 主循环6 q# B% [7 \! g7 }2 w
for(;;)
5 n |" Q8 d( h( k/ \+ q, j' o {, @: n' G* v: O6 T8 `% b) k
2 {5 _# @$ b2 X6 { G# g. P
}+ b4 P! H' b ^& E
}
& G, f* ~7 ]; B( f! a0 n; d. ]& R. ?
/****************************************************************************/+ c X+ ]# {5 u! n' u# ^
/* */
( I( c+ q; R; b- ~4 e/* PSC 初始化 */* Z) g4 e9 s* z$ [
/* */# S& z: @, N7 M a
/****************************************************************************/1 y; H$ G: Y4 N" z" ?4 Z5 `2 B, a
void PSCInit(void)2 r; V# N# Y& E) i& V
{' |* Y4 R5 r" K3 o- P; n$ w$ O
// 使能 EHRPWM 和 ECAP 模块8 v* K0 b/ A$ ~. z K- Q; z
// 对相应外设模块的使能也可以在 BootLoader 中完成9 ]: V" e6 J5 F9 h
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);9 p a$ u4 s, A( D: d( s. F
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);4 G( w' M# v8 S( j* K. K. q
}
) v/ ~( p+ A5 z" q
, ` u# o! n3 o" T* B/****************************************************************************/
" o4 @% Z2 ]4 i; _/* */
/ P; I! ^% w* ~8 p/* GPIO 管脚复用配置 */
5 w% q% o4 E* u2 ?; ^( H/* */
$ S y5 E) o. S0 h- h/****************************************************************************/
! r- X6 B2 X$ T) }( hvoid GPIOBankPinMuxSet(void). |% c" V; N' B0 [
{0 p" S- l( T, }5 K" ~* R% g
EHRPWM1PinMuxSetup();, W0 T9 I/ Z9 U- ]3 ^- `) f
2 [2 Q5 @) B8 w0 N6 D/ ] // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)" P6 a4 | m' K5 B. X) s' @: O
// 作为捕获功能时管脚方向为输入
: N' R- g' V. D4 ^ // 作为辅助脉宽调制时管脚方向为输出3 k! A$ b) a. @: a7 O9 q- b+ ?1 A
// ECAP2 / APWM2
* {4 I' p# F0 t( P1 X8 ?5 K ECAPPinMuxSetup(2);
3 ~# o! t( u" D' z5 Q8 P; O P$ n: i0 U4 q9 D: p% b# R+ N
// ECAP2 / APWM2方向设置为输入
) F/ M% D+ F5 n( u0 l GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
3 k5 x' G7 |! t' A}
$ k6 [: A" n/ N: j% t" _
2 y8 w( m1 U) ]: I5 `/****************************************************************************/
4 G0 F5 {, ?. x9 ~) I! c+ n/* */
/ R f$ R; ~3 z' q) h f7 v/* PWM 输出波形 */
. @+ T* D" z3 I7 N/* */
# w" p: K% A6 S" u3 H. \, }: |/****************************************************************************/+ B* b3 s% C0 b, V; X' z3 A7 o: R
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)5 E5 R/ B" r1 C4 Y5 Q b0 [6 x. |
{4 s0 y/ y! B" G h( _4 K' P% |( a
// 时间基准配置
& a3 m% {; r0 Z& n // 时钟配置+ ?0 [- g2 U; {) f' P9 X' c# a
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);5 I$ n3 `, D% {0 s( ]
) l* m2 D% H7 k2 z5 x$ m7 e // 配置周期
0 D8 G! h" n D9 I EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
/ f# L7 t- n6 k pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
" r" _- b J: X+ o9 y8 B
1 w1 I1 z; F: F! j2 d9 u // 禁用输入同步信号
6 w& B8 [$ J9 M. I2 ~ EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);& u& |* Q. Y; V5 z0 V9 R9 E# b# P6 M
4 o& J5 \) b) `: u* }* \8 F
// 禁用输出同步信号3 u: _6 w5 P+ M
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
5 ~) {$ A/ X1 k5 N3 N6 W5 {! T% |0 F$ J& ]) x
// 仿真(DEBUG)模式行为配置
3 l# U1 G4 @6 B& O EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);! r. a. I+ s) G6 c# ]$ _" D- Z/ |
# O2 `7 r' A' }/ {$ f! H# M
// 配置计数比较器子模块
# [/ s8 f( u7 G; I. y& V3 t // 加载比较器 A 值
0 S% V4 s8 Z. }" Y H EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
+ w3 a7 W/ p- ?6 Z' q EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# K( o/ B9 w. c; D
) d* b2 ~6 }4 \; J( Q/ ` // 加载比较器 B 值$ ~) S4 u3 X; J* t2 b
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,6 n; ^ \4 o0 W5 S8 Y2 W5 H6 ]
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);) C+ u; x+ z- b8 }+ f
6 |9 j: `) s3 i$ } // 功能限定配置(输出引脚触发方式设定)
- p% K! O; w$ v4 G; b // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
; ?* T; C7 ^0 V% ] EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
. E1 _" ]$ v' L8 C2 }0 s EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
8 f v2 h9 W5 v0 a EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);$ G! Y N2 }5 M3 w0 K# L1 z& Y6 D
# c4 X; L( }' |- t0 w+ F
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
. d2 d. Q4 r) t/ b5 W EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
5 E- Y) Z! h& X. }
5 g% l; o7 b$ `7 }8 T. J+ z // 禁用斩波子模块3 {; W3 }3 {3 O3 M) c
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);) h1 Z% Z9 W& `+ c& W8 H* K% e; T
. E4 f% u# U5 Z: p$ Y // 禁用错误控制事件, `/ g: p9 k% n8 f% N3 K
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);0 W# F3 ^2 b( O; v: o1 P
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);3 ^- F+ u) O+ a8 F: l0 C: {, k
1 F7 E* i' `5 I" B. J4 t, v/ }3 p
// 事件触发配置
6 {6 J0 |" k/ W // 每三次事件发生产生中断2 H2 N) \4 W6 y3 V
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
, q* p4 _9 [" O# g // 时间基准计数等于有效计数比较寄存器 B 值 产生事件0 p! e* H6 t% k; J4 q
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);, |5 Z7 J* ^ T. U* E) ~; |
// 使能中断
0 B& ?* E6 Y+ x5 I/ C EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);7 N- a& g) D/ |
0 H4 `5 ?+ y' {5 }, H
// 禁用高精度子模块2 G' I# S+ X4 M
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
" v% {' u0 o( O# p0 r' k7 b: s* n5 m* [
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);! c J+ }5 ^+ H4 e# M. I( m) O
}2 K8 t/ `- f, Q
& u! p7 H |# W$ `) d$ A! q+ tvoid ChopperWaveform(void)+ O7 O& {# d. D/ `5 ]! u" j% ~
{
$ i3 o/ H9 I9 n% f // 50% 占空比
2 o5 N3 x0 M8 z% B EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);, t( I- `( E2 o! U7 N
// 4 分频
' |! `9 k( w- x+ t1 M1 O EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
2 ^; \! O' E* T! U' l // 单个脉冲宽度
# }4 T2 b% C) _# s2 ~ C- p EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);$ g: m) e5 P. g) H' `
// 使能斩波子模块5 S* ~- V$ z( e2 \
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 t# q) m; {& W- I8 |}
3 u1 k9 M2 O, }; k0 P0 |( c" R3 v3 d" |3 p+ A
/****************************************************************************/
1 _& _! m0 ]" l% i2 V/* */
. Y# I1 C7 r- s9 B/* PWM 中断初始化 */( e k, ]. x2 O/ a5 K0 M& t
/* */
% ^' j5 O! I( Y0 l8 D7 `! ]" @/****************************************************************************/5 t: r' d* C- a; h% t
void PWMInterruptInit(void)9 U0 c: [ P" x1 u0 {) x4 g# X
{
1 C6 n" Y2 l) {4 V // 注册中断服务函数- r+ W$ v/ E7 c
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; h0 [3 m$ p) H IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);8 A# f/ e# k# p* n! j. v
3 X- {: }( d, O2 i) N // 映射中断$ m3 @% O! {# n: a% \% ~
IntChannelSet(SYS_INT_EHRPWM1, 2);; H) U0 @: R8 Z, b" M1 p
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);2 i1 `( T9 Y8 G* g7 ~0 A
0 w! b/ h) T4 U2 d& l* w // 使能中断) t: Q/ @! O2 C( [1 ?9 C/ i8 P
IntSystemEnable(SYS_INT_EHRPWM1);
/ K9 P1 u/ u( B IntSystemEnable(SYS_INT_EHRPWM1TZ);
" G2 I" @1 x8 t8 U6 R# X}: s. f5 {* {' w ?1 V. s% M+ j: t
3 y2 V" q; P7 }/****************************************************************************/
1 p2 x' q" G; T% {/ A0 k/* *// t$ c$ f2 w2 n+ C i
/* ARM 中断初始化 */
1 `9 `6 v8 V* K% e/* */
0 o# `8 m! k) R( h9 W# c4 X; E4 `/****************************************************************************/
* ]0 V% N! Z- b5 |void InterruptInit(void)" h( S6 y, w, W: y& |/ I$ x' ~" U
{8 M/ l7 Y2 B6 u' y$ O$ |
// 初始化 ARM 中断控制器
. |* ?3 [- N: ^1 [& @# N% W, | IntAINTCInit();+ G7 R# B6 D" H& \* j- X" Y
& J- @3 n/ a F @2 P! E // 使能 IRQ(CPSR)# |0 v4 O, U- L( w& U
IntMasterIRQEnable();
1 I3 z4 c: H' y- F. |1 G3 l7 s7 E/ i! z& A) d# q/ T
// 使能中断(AINTC GER)
, ]3 y2 `# P# {& _. v! N5 C- u& y IntGlobalEnable();
9 w9 }: I, R& Y
& \ W& ] [* E. n. X7 k // 使能中断(AINTC HIER)" y' K8 E: J1 K" _' o& B- Z4 h* F
IntIRQEnable();. j7 J# X- Z' L# P* x
}
5 {. x) y: P; d; k' r4 X$ h
) h; _ X ~. h( b0 ~7 H( c( r |
|