|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
' ~! {( F: G, V4 S% _) Q/* */
) l3 y# q1 |) n/ @/* 宏定义 */9 G0 K& w# v2 L3 {' i% q9 O
/* */ D2 L: a9 o; a9 i
/****************************************************************************/
1 M8 ^$ ~! B2 w( T _// 软件断点
# M# i G: d1 o9 y, E) B#define SW_BREAKPOINT asm(" SWBP 0 ");& Y$ s2 n+ u4 C: D ]
: U6 R% d! B! L& P! m
// 时钟分频
; a2 M' p5 W* m" B; }5 O; q' E#define CLOCK_DIV_VAL 228
, R/ `; `' I* w2 n) ?
( J* [! [8 V2 D" g4 M6 g/****************************************************************************/: B' E/ C: j! I. Q9 w3 ~
/* */! ?8 h" D( e2 _% @" G+ u7 z( \: M
/* 全局变量 */; l. A) E4 B5 o4 I
/* */
5 E* h& ^9 A& ~' I4 C/ F Y) l/ l, D3 t/****************************************************************************/
5 p o: I7 o4 S- G5 _/ M% }1 SECAPCONTEXT ECAPResult;
' C- O- V8 [+ a. l4 ]7 d5 l4 H3 }4 h# M
/****************************************************************************/" b# l5 T4 A% s9 G# ^+ j
/* */+ L# ?* \! Q) m1 A* N! |! b
/* 函数声明 */
$ V+ N- a" h* c _) _$ G1 F/* */8 a9 ?) f" R5 {- P
/****************************************************************************/( W( _2 S( d9 t6 E1 S1 o
// 外设使能配置
# X& P: p4 X/ S4 u' ~! K6 hvoid PSCInit(void);
% w h K2 ~6 j3 }8 I
( p) @8 \$ N( d// GPIO 管脚复用配置
9 ^" `; i7 m7 g% h! S/ E% jvoid GPIOBankPinMuxSet();7 r; l. L% \* x, N k1 y$ q
5 v/ f0 \7 T# a- J; `) \8 v% _9 E* Z// 产生波形5 z6 V: d3 {: X
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);/ E3 y& w$ w) H$ f0 \* k% U) `
void ChopperWaveform(void);
0 u* Z6 k# O1 M3 X; @ u# R
* C! I( J- D' I// ECAP初始化和读函数
; C% M' N4 D% F5 j4 Kvoid ECAPInit(void);5 I+ y, J9 Q# s8 z' `% N5 C
unsigned int ECAPRead(void);
$ k$ V& M8 ~# W9 o* D- [' x' N4 O3 T; r' I7 {- v
//ARM 中断初始化
# H; c8 |+ ?" m, uvoid InterruptInit(void);7 F# H4 W: v$ i0 B3 N B" i' A; p
* B! d+ o6 z: O- s9 Y
// PWM 中断初始化
& {3 k. L# i+ k1 N- ^1 Xvoid PWMInterruptInit(void);, i8 z( J0 B- P. x# U5 \
// 中断服务函数
{+ A' a9 w. g# w$ {) f// PWM 事件+ o! }9 H( @. m6 e! r
void PWMEventIsr(void);) R% A* S# K+ l# [' v+ o/ p( ^
// PWM 错误控制事件4 l, S7 d3 I U/ Z4 B
void PWMTZIsr(void);7 J* M/ X* i( z& b
3 ?5 c; |% }0 B1 o/ e! E, \/****************************************************************************/ W a/ x5 H A; {
/* */
$ Q6 s" y) O% I/ f% h/* 主函数 */; H Z. h" Z4 x- v8 \5 T6 l7 l
/* */
$ c% j! ?( L3 k) y O/****************************************************************************/
$ u& v# R+ e. A S6 ~* |6 oint main(void)7 [5 |( e; E8 S! B
{
, U0 u$ g8 `) E) z: L1 `4 u- Q // 外设使能配置$ j4 o) }; M8 ^
PSCInit();
, R/ [4 q/ g5 P/ O, r: E" z* R+ O
// 初始化串口终端 使用串口2: `$ p; f! m9 d! M8 H
UARTStdioInit();
2 C: I3 Z* y3 D8 a. U& a+ y9 Q* @; V . B: e+ ^: t Q4 X
// GPIO 管脚复用配置
8 N. [* q" [! b6 S% ^* ]; q" {2 ] GPIOBankPinMuxSet();
+ O! j. N/ x& N; n& C& X( N& K
& j* ~; t0 q) A' T% \. e // ARM 中断初始化
9 ~0 U U9 B& N4 I InterruptInit();* H( Q+ a0 s: d; A: Y" l
1 p6 u- K( @4 K* v' j# Q // PWM 中断初始化
+ h" Z1 E5 D0 l" Z8 i PWMInterruptInit();" A5 d7 W/ a0 A, R5 B
- G; _0 r0 t4 v4 l K unsigned char i;
4 F2 s0 M- `% O6 w" _/ e e unsigned int j;
2 d3 n; [$ k- A4 {: Z: }6 K$ g$ z1 \ o% a7 @. G$ `" K
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
& |7 v( b @: p% L6 @ UARTPuts("------------------------------------------------------------\r\n", -1);1 I X# I. ]) [; {1 Y: V# m
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
+ Z2 k3 P: W8 n" b: D( w! b* v5 G // 产生波形6 y$ [& L/ h4 d$ ]
PWM1ABasic(25000,50);$ @6 U7 N& ]7 C! \/ s5 i( ?. z# X& }
$ P7 N. q# c( K7 S4 J5 e
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
. I) B$ a& x1 C- N6 \5 O UARTPuts("------------------------------------------------------------\r\n", -1);
2 |: l- Q; I2 ~" b7 |" ?2 Q. A+ r" _# B
5 r6 b* \& Q: g$ ~7 ^% c" ?2 b% q
5 v, \% _ s) ^. r
- ^! c4 @3 I, i6 [* B UARTPuts("------------------------------------------------------------\r\n", -1);
2 v B' k, J1 ^" A UARTPuts(" C6748 ECAP Test\r\n", -1);0 P' s8 a" J! r0 R, _7 M
// ECAP 捕获初始化
, Q2 ]* Q2 Q+ X1 B" o { ECAPInit();# @4 z7 @6 G {: D: N3 v+ J( v& `
UARTPuts("Initialize ECAP.......\r\n",-1);; n6 s4 \6 ~1 S- ], c
for(i=0;i<5;i++)
' v; x) d a$ ]! A* O" M {( U. ~: u/ a* ]8 E3 B, H
for(j=0x00FFFFFF;j>0;j--); // 延时
; _: C% X: @% |, U0 ]2 v ECAPRead();6 D; R$ x0 h9 u5 s+ k
}4 B& E* J5 P/ ?& p% Z2 w8 O
UARTPuts("\r\n",-1);4 U& S9 M6 k6 c3 u( l
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);6 [6 H* X. P4 _# o- x; W
UARTPuts("------------------------------------------------------------\r\n", -1);6 m# i+ O5 r" I
# X! ^3 d. V" w5 O4 _
// 主循环* V& D! }" Q3 t% H0 |( F
for(;;)
# M A9 n# L4 ?6 }* [* @4 D; Y0 R {
7 q: N8 r4 `! h1 j( @) e7 H7 }
}
/ [ q! q/ ?# ^( v$ c}5 Q# M! H0 [5 u ~6 b3 b. h2 X
3 c! c9 f* b/ l8 h G- F
/****************************************************************************/) d0 p# t/ W7 C$ F# S5 p( L
/* */: J" S' `' P! o0 q( \8 S& u3 O; ^+ S
/* PSC 初始化 */" T8 |2 }4 C5 @- T) P4 U
/* */7 [$ s0 N' ~8 ~
/****************************************************************************/, Z! M9 ]- N' J+ @1 |- Z& {: D
void PSCInit(void)) f( k% }1 ?9 {2 s6 [
{" r- ]6 f: n \
// 使能 EHRPWM 和 ECAP 模块
6 l8 O$ U3 }7 e+ ^" m' t, p" N // 对相应外设模块的使能也可以在 BootLoader 中完成
, ?9 |( r0 p% B* i PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 L# n; V4 Q* w( }/ K2 z- U$ l
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 b3 X$ W1 w* t( K9 i}0 u4 x4 N* e: {6 Y. P
# d4 b9 B4 m0 [8 Q* [1 x' }0 Y, ?/ f/****************************************************************************/8 n X$ E6 w: A! A# B! M
/* */& m/ }0 g% m* [& R
/* GPIO 管脚复用配置 */0 u3 G0 l" y0 b0 D. g9 c9 b
/* */
( ?1 l9 i l: ]& O/****************************************************************************/
8 k5 }! L s: Q! o/ _5 J, xvoid GPIOBankPinMuxSet(void)
e; R2 i+ A& @! \3 G{
* `8 v+ K) _& o2 r6 j7 g EHRPWM1PinMuxSetup();
! v' H1 [% @) b8 g5 G$ [+ b8 L; v. f' P. @$ h
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 K f) I1 N; y* |4 K4 \0 i // 作为捕获功能时管脚方向为输入4 P6 t% S9 N0 E3 R1 t! u: w
// 作为辅助脉宽调制时管脚方向为输出% C" ?' p# v5 k
// ECAP2 / APWM26 q6 x, u( G' A1 k8 L3 ?
ECAPPinMuxSetup(2); r/ A& E" B/ O3 u: J' \/ F6 v
+ J- X, r$ P* G' R4 D // ECAP2 / APWM2方向设置为输入
1 r/ ~5 B* B5 I% O, Z4 L: h1 F GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]: k) |& |' [9 h& K: w+ D9 M
}! U; |/ l* X$ _2 p( k C
: u' _" I' q: i+ B% k! b! x9 G" f
/****************************************************************************/
8 S! A: J$ q. q1 C- i' c2 M/ z/* */
8 `$ y0 k& [6 g. U5 [/* PWM 输出波形 */
& `: d. o$ I1 {1 B2 ~0 o0 `/* */
# f4 c, ]1 e% R3 I7 J/****************************************************************************/
( \) D) y+ |6 d) }9 F nvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
0 H6 L; j3 i$ z" l9 L* V' n1 `, ^{4 y' u% l, V6 M6 n' a* O
// 时间基准配置
$ W) e n1 n4 X, r. k // 时钟配置
6 v X4 F+ e8 P. V; D5 p9 i EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);4 l+ ^) G9 E0 l7 I$ m1 M+ D6 `
0 J8 u( U) ?" k; q4 J
// 配置周期6 F w( F$ z+ R* W# O \
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
5 p! e, |# X1 | pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
; ?4 q9 B. m+ G9 K% D M& j+ I2 |! w+ c3 L) E+ a& H0 ^! c
// 禁用输入同步信号1 N& s& O$ q, b7 J0 K1 i/ I7 `2 e
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
2 B& v6 p9 F- _3 h2 N5 Z( j7 [4 Q% L# ^# G& b* C- C3 c
// 禁用输出同步信号
G" ~, \2 D7 d/ X- o @ EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);; E) w* W! t t7 j& x
0 u% C; r$ D+ ]$ f! m# A% \; \
// 仿真(DEBUG)模式行为配置
9 Y" x6 S$ _; @. s2 z" O EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);8 L6 J& F$ _9 L$ u8 a
' ?% m/ W. B- ?
// 配置计数比较器子模块
z' t! _* Y% l+ Q // 加载比较器 A 值5 p" S/ ]$ f3 Y% [
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,. w) I. ?5 @& H! W2 J# ~# P
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
. j6 c p9 ^% ^8 J# X; D# r [# w( w, w+ L
// 加载比较器 B 值
# V; w! F r' m/ D4 q4 j# d EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
8 R7 H* }$ g) q# ]- ?! q% s4 A. V% P EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);: G4 u" j) z. U& d6 ^
$ m( i# Y! L$ F" _5 f // 功能限定配置(输出引脚触发方式设定)- O: x" d+ ?+ O* C8 v5 b3 X' l. K& I+ T
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出2 x' `1 d9 E8 s) O
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
; M3 O2 g# H5 _( W' H8 f& k EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,5 s/ `. Q# J, o" p7 M Y
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
5 O) p" L1 i& s4 `3 D [8 Z4 ]1 x% l$ ^+ V0 W5 g
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
8 Q% R- _8 I) v$ L EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
1 x- Q# L2 J" x* ~* N4 [
7 k! }5 m. }/ m2 X // 禁用斩波子模块! f b- g* @$ _
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);0 j0 n" b. z4 V% Z3 I
- J$ q1 q; j" Q) ^1 }2 F8 p# I h0 |
// 禁用错误控制事件
/ P5 f( ?( T& R, S _. V$ { EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);% [; ~7 F( G, ` @: _: m! K
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
, H' H J' \/ v: Z9 H! z, @4 ~4 U
// 事件触发配置
2 R0 k3 ?" ~4 ^0 [5 I2 g3 O% t // 每三次事件发生产生中断2 a$ `- F8 U$ Z: e# w. H7 h
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- ?. x# S. D! J6 } // 时间基准计数等于有效计数比较寄存器 B 值 产生事件9 m0 G, E1 P* s
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
/ {. J8 f8 c" _* @) U" q K/ h( M // 使能中断
6 l8 {' j' G. W+ L. |! F, [0 T EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);9 r1 y' z5 ~) j( ?0 Y2 s. Z
1 I+ e$ a' k( {7 z% X H // 禁用高精度子模块2 w0 K* ^) K% ]3 y% B, H
EHRPWMHRDisable(SOC_EHRPWM_1_REGS); n+ `: ]9 \: c5 ?6 u! P4 Z# D
1 K( q- I8 {; X UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);+ ~3 A$ [. ^" N6 Q& l
}
+ O- P |3 L8 v2 g2 ~8 j$ `9 E$ P9 Z) H6 ~5 {; s
void ChopperWaveform(void)
9 Z' H8 @' g& @{" r0 b- ]2 t& L a* o( D* x
// 50% 占空比
3 C. } E) |% B( x6 n$ b EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
7 q2 K' z+ g8 w% n" V // 4 分频
$ l2 y8 ]1 a( G, f4 m/ F; r/ q EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);" E5 ~- m- j: d% Q/ e
// 单个脉冲宽度
* ]5 i% x4 V* s: ]. G EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);& L5 H& A2 x) V$ P Y" G: d+ v
// 使能斩波子模块
) g3 Z, {1 C7 f/ n: m. e1 g EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
; D! c3 z; U7 B) k}
9 |# R' I, i% ^2 c& F0 b2 j, k8 d& G
/****************************************************************************/' j/ R @' Y8 ~% N: ]
/* */' c) z% [9 H% w8 {. p6 w
/* PWM 中断初始化 */
6 k! N) i( `9 V5 ]0 ~0 t) o/* */
+ ~% p/ x& J# v0 y7 ?. J/****************************************************************************/
/ \/ [1 _4 [/ k* |void PWMInterruptInit(void)" L* D" {% n% v. F7 k; ?
{' v8 W' B8 U8 ], L5 t
// 注册中断服务函数8 O) h1 n3 _5 u8 u" U- o
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);( x! C [9 G1 R2 }; _5 A3 w( i
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);9 W0 P- B! u6 G/ K' W
: [4 }0 _ t. G% x) n i3 i1 I
// 映射中断- E' F, h0 _' m( R
IntChannelSet(SYS_INT_EHRPWM1, 2);
2 a- z/ c @1 w2 X IntChannelSet(SYS_INT_EHRPWM1TZ, 3);# _% Q8 e! X* X/ [# F4 o
" {2 t/ u3 n8 W& ~ // 使能中断* D2 U: y2 [& g7 x# O. O
IntSystemEnable(SYS_INT_EHRPWM1);3 l6 x. z5 h- y6 S4 j3 q- m2 |
IntSystemEnable(SYS_INT_EHRPWM1TZ);8 k! B: x! ]: Z. I
}5 e6 e2 Y5 k1 g, i/ I0 P
9 [* E. L* w' R9 ~8 U( C3 L, U+ C/****************************************************************************/, l* Y; u0 E- }( c9 B& g
/* */
0 I8 _% M" m: c8 \5 M' K% U9 r/* ARM 中断初始化 */ R( n) Z+ q7 i r0 Y
/* */6 K* v9 @1 R, C/ H5 d
/****************************************************************************/
. |' Q( e8 {3 X7 Cvoid InterruptInit(void)! x4 d5 s$ W+ k3 L8 X7 u- V
{
) `6 X' K' U4 j/ P // 初始化 ARM 中断控制器9 w! Z4 Y6 W, s6 j/ I
IntAINTCInit();
" c8 j+ j E1 W# T/ @% g1 r2 H: e
6 G1 D% k/ T" q* E- ` } // 使能 IRQ(CPSR)
+ k% k0 v+ A$ G8 z9 A2 o; F1 v% F IntMasterIRQEnable();
/ l# {* r: F0 c$ M0 ~
8 w" c& z7 j( v y$ v) t7 Q6 O) o // 使能中断(AINTC GER)
( c! C& W. U* S0 b IntGlobalEnable();' f' r8 Q+ P8 Y/ V/ {* N& v
0 B4 z9 J; J \$ G: e // 使能中断(AINTC HIER)3 [9 J5 w0 i$ t& d! B
IntIRQEnable();
2 R n- Y) G" H# W# p}1 n% |) C' V5 P3 y& h1 R
: w# {0 h Z- i* x* U
|
|