|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
/ Z1 v0 s+ w/ D1 J/* */
! n% c3 v% G) J. ~1 E1 P& d/* 宏定义 */1 p ^9 w& ^3 c1 N7 X
/* */
$ L- u/ G( r2 R$ K/****************************************************************************/- H2 X' M5 n3 I0 m; s7 J4 V* C: o3 L
// 软件断点+ N; S- e. N ?* j
#define SW_BREAKPOINT asm(" SWBP 0 ");
% L7 G3 g+ M6 ~: z$ I) y+ Y M7 b* [7 k7 x2 _3 X' M0 W9 {
// 时钟分频! A; N* X% i9 H' _5 N1 a
#define CLOCK_DIV_VAL 228/ n, A3 w7 `- c/ c- a
$ Q: p! }- X9 s/****************************************************************************/
. u) G6 ^2 d9 `, J# u5 A/* */
& P6 z0 }* A; j# ^. `1 H/* 全局变量 */9 w0 D$ m! i8 M- s F# a
/* */
( q) O8 \; A, m9 W/****************************************************************************/3 \8 A- n2 c `6 f$ F8 {
ECAPCONTEXT ECAPResult;
3 v$ i" A$ ]+ B+ F2 Z! {2 h. |
- ? w- S- |7 S5 I- K& c% @6 }" e/****************************************************************************/
( n" ~. Z( O o9 I j. M5 ^2 R/* */
6 u- c. m& R* L: q# c/* 函数声明 */' A1 X9 r9 p, r! D$ N
/* */
; z. m4 x' p* I: C% [1 ~& U/****************************************************************************/
" s6 j% V7 o+ v8 s; |0 }// 外设使能配置" Y/ o! Z. o# r* a0 @% L
void PSCInit(void);
; J' P$ d/ Z! ]
( w/ ]$ d1 e! }/ _6 m2 I; r// GPIO 管脚复用配置8 p" o+ R: n1 ]1 c2 o
void GPIOBankPinMuxSet();0 D* C( v, J' S
4 k$ {' C4 s1 u- s! x0 [
// 产生波形7 U& T! I' U1 [( i
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);" @: L) w3 p9 J/ R8 d& K
void ChopperWaveform(void);
z. y" j5 P) l' U* ]; f5 r* I& ^. B6 c' t. f8 r2 E
// ECAP初始化和读函数
' J; s( z) T9 A. o+ Fvoid ECAPInit(void);
- n- f' l& _2 i* Q; h9 x3 Munsigned int ECAPRead(void);. Q1 Y3 _) c+ @- R% E
9 B* `+ G3 q6 o Y* V S2 K/ C8 j
//ARM 中断初始化
7 Y+ r% S" o p0 l6 p6 a! q. |7 \void InterruptInit(void);* [2 N% W' T0 h- E" s) L Y6 P9 `9 O" G
1 k' D! a8 _+ M$ S b+ C+ ~# b
// PWM 中断初始化
2 v, e& s w3 N" W) q4 C0 O$ c/ fvoid PWMInterruptInit(void);
: F$ c4 R* {1 I0 s0 z% Q1 A// 中断服务函数
, d* @* @- q A# L* t( b. ^// PWM 事件
' i/ r+ t. K; hvoid PWMEventIsr(void);3 F8 O9 f! d# m+ }" k% U& ^
// PWM 错误控制事件0 L% X- m, V$ M: _- |; J( G
void PWMTZIsr(void);
( S* Z; q) `+ k- d6 P7 Y: n! i: D$ E2 N
/****************************************************************************/' c( V- O% x' ?; T; ^+ |' O+ v; G
/* */
( p& j# A+ [! n+ w1 A/* 主函数 */- P2 I& i$ r: ~/ N5 I: X0 m
/* */9 L; P T7 B3 w; P f! `7 |
/****************************************************************************/
2 h: O1 P1 x4 w4 {( mint main(void)
9 `$ n1 {1 k8 @& g5 p% o1 S( I{
" \4 g5 b2 N# |2 e. G# [& o) V // 外设使能配置
8 {( o' ^4 M& X% w8 A% z) r b2 \ PSCInit();: N* ]9 C; w( D z. G5 ]3 z; P
9 L' }$ ]$ `; S // 初始化串口终端 使用串口2
. M& w4 s9 @4 ?6 p( t UARTStdioInit();
6 e: t. u1 u, ~1 r6 Y
. d- a' A- t" t7 v' j7 \ _ // GPIO 管脚复用配置
7 X' g+ x' K6 `5 }" X9 c GPIOBankPinMuxSet();
% {% k% r+ L. ]% ?+ e6 S; {( l7 ]
// ARM 中断初始化# f* u- H! I4 X- B8 I* k+ ? e
InterruptInit();. w7 O0 z0 @3 i
1 a5 d {* s! f& L: S6 N3 e0 \$ { // PWM 中断初始化( W. z$ w1 [. H1 L5 Z; }$ B0 {
PWMInterruptInit();
I4 J- _6 T* Y! T% z6 p0 f P( L [' t- }0 V% n
unsigned char i;; m& Z& F3 x/ ?
unsigned int j;
0 e2 }; U; r6 H* V1 V. ]$ K0 K- l% s% q- A
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
3 e g! Z8 |0 u5 w! \" I" f& y$ B UARTPuts("------------------------------------------------------------\r\n", -1);
: E4 k; u; a+ D0 _6 m3 x8 {3 z9 k" ] UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
% \9 y# o( L4 \" F. r9 t // 产生波形$ @) b" r/ K" _6 s
PWM1ABasic(25000,50);
: e, e: o6 C/ x6 a" l- @
+ D$ k; o$ z; }$ l$ E UARTPuts(" C6748 PWM Test Over!\r\n",-1);) |& [" {/ @+ |# X. v
UARTPuts("------------------------------------------------------------\r\n", -1);
3 B3 P' t z+ n( b* {& d
+ q& f/ v5 Q6 P n' U6 r% k1 y# E2 v& K B
4 X! m! D1 _3 n/ \. D UARTPuts("------------------------------------------------------------\r\n", -1);
! r( V( v- S: ?5 J6 _& r, s UARTPuts(" C6748 ECAP Test\r\n", -1);4 _7 z* c( S7 Y) I# n1 l6 k
// ECAP 捕获初始化2 V3 W0 I. v4 l# B: d0 n2 `5 E1 N
ECAPInit();
. V* ]7 ?% k/ Z: y ]; b UARTPuts("Initialize ECAP.......\r\n",-1);( a* m. ?7 ^# r0 B
for(i=0;i<5;i++)
5 H% z7 K% m V- z {3 ^' l& B; D- e' u, X. P
for(j=0x00FFFFFF;j>0;j--); // 延时
( D3 g+ D* X$ O ECAPRead();
7 Y. m# w3 U7 F6 d/ n* H }
4 _) f$ J3 T5 J, m3 ~$ }" P! T UARTPuts("\r\n",-1);; N' t5 X1 h3 k7 A
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);/ m$ N) C1 I( }4 b! ~2 y0 P% T3 \% `
UARTPuts("------------------------------------------------------------\r\n", -1);# m4 O- `# @. [
9 x( m+ u1 v: x' Q* O. ~% u3 M+ o# b+ J // 主循环 c& d* J7 [* V
for(;;)% E/ F6 ~+ X2 F9 b! J
{. z8 w# p" S5 {7 M
9 q( P$ K7 e- C j6 U
}
$ l! \/ J. K+ z3 Z1 m6 h* i$ O}% r3 T: C! V1 T- ^+ x
9 i; S6 `3 W: Q
/****************************************************************************/, T' i2 ~2 N/ q; J n* S7 k
/* */$ t% L' F( ]2 \" Q0 ?1 D
/* PSC 初始化 */3 V R( i, Q% I9 h: u/ c: j* ^
/* */
{! q0 Z" T4 D7 b. P2 B/****************************************************************************/
( e3 h2 `4 q- Q" }* O3 x. v* }void PSCInit(void)* V& S q6 z( O( k
{
- F2 \5 z b" J1 `% h // 使能 EHRPWM 和 ECAP 模块5 T1 r7 `2 x# T5 K- G2 q
// 对相应外设模块的使能也可以在 BootLoader 中完成- _6 p9 t f, [8 d4 h
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);! x2 ]$ }7 k @! @& N
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);; h- T( V% Q- V2 y6 z
}
* h0 l9 ]" Z. S$ J( n+ L
8 p+ [( \1 T9 R) f3 t/****************************************************************************/
/ U3 a: w7 _0 c/* */
4 [. o) a/ h! ?/* GPIO 管脚复用配置 */1 I0 L5 }8 S2 o% y
/* *// w8 L4 @1 F6 b8 I, R; F# ~. L5 b: |
/****************************************************************************/" v, Q1 o. \) k% V
void GPIOBankPinMuxSet(void) q" x9 P3 J: p
{) b. s, X1 a* O7 n
EHRPWM1PinMuxSetup();0 b* n( c5 K9 |3 n
" l/ Z5 }9 n# n2 i
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
|- a2 P7 V& N6 p // 作为捕获功能时管脚方向为输入1 d6 U5 U! |3 Z, j2 k: T, q* ~) Q
// 作为辅助脉宽调制时管脚方向为输出: B$ K) N& a; k! W- v
// ECAP2 / APWM2
, Z6 `( e6 i1 j) P" g9 c7 k# F( \ ECAPPinMuxSetup(2);3 u3 w" z$ }. j( L& T* ?+ F' D( y
+ k4 Q. B& G4 v: B- A# ]% T
// ECAP2 / APWM2方向设置为输入
; u9 e' ~6 |$ W: \ Y GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]3 K; W6 |, a/ h9 M- `8 O! u: O$ b
}
/ ?3 E+ b" l1 d4 g$ F
$ @3 V. h; U0 a, j/****************************************************************************/
0 V5 P, `8 D) |) _/ G/* */
5 b( r* |0 g7 P ~4 d' a/* PWM 输出波形 */
" G1 z, i6 p0 o* i) x: W9 z/* */
0 G3 X, {5 N& E, _% E8 G/****************************************************************************/) U% v T5 ^1 P$ @0 W2 x
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
& ^% }2 o; E" K% Z3 {+ Z7 J+ ?. l+ D{
* L1 \4 c% M, m; J // 时间基准配置
3 \/ t: L6 J$ D# D5 y% s1 } // 时钟配置# |/ O; x8 n+ x7 }! N e. k. H
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
$ m$ w# ?- `( j5 F; H2 X; L/ s, d$ @
// 配置周期' K" [5 [/ U: F# ]4 a3 n) x4 H& Q
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
1 O& u% G- J4 y \$ ^* l5 @; Q1 C5 V pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);4 w9 V7 j- i. r7 z+ H
5 o" c1 r4 f& q6 h& m% s) x
// 禁用输入同步信号
. |/ w. u9 d6 ?& U) i EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);2 G" s9 R4 N8 U4 Z* ]% F& x5 T- G
. x7 P) L% \9 p4 v6 h // 禁用输出同步信号$ X1 M- N* S9 D3 u
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);- I" u2 b; N) _0 Y$ |* U
! `8 q) l' f: S4 N. h, h
// 仿真(DEBUG)模式行为配置
9 {2 w6 Y" w, {, p6 G: P& L EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
6 }& a$ E3 o D6 K$ C" h: ~( B9 x
// 配置计数比较器子模块
$ i5 s. q6 {) R2 Y' U+ j // 加载比较器 A 值
) e2 {1 u3 r# W3 u! G6 J9 | EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
0 o# |+ T, j4 T0 z$ d EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);% ]1 L" L5 i& b
_; x+ V+ Q8 J- u1 W, T // 加载比较器 B 值5 Z, q" V; J' H$ H1 |
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
" @& X- b( g& m( c EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);# p2 w# b5 U6 j1 G4 H# o+ L& u
2 j, x3 z8 y W; }! U. d6 s, e2 P% z // 功能限定配置(输出引脚触发方式设定)
' B. V: }" K1 v4 b$ T9 L J // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
- R Z9 v9 _- |- k. x: w EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,. \2 n0 S; m3 ] }
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
) T% N0 m5 \; F$ k3 l9 _1 \. H EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
. c3 r+ H; g6 R R, P5 E5 j
s8 b3 K& o: X6 o4 J // 禁用(旁路,信号直接输出到斩波子模块)死区模块3 y( | \0 F0 d6 n
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
1 Q Z$ b+ l) j; V/ ~
; k* c$ ?/ w4 b; Q# a // 禁用斩波子模块3 e8 Q5 [7 [/ ]7 c: i
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);! x D& c8 @# w
+ p5 Y8 ^: v; k* X2 n // 禁用错误控制事件
8 S5 a/ G$ k- u; p$ z EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);# b) {7 q" b0 B6 x& {
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);/ B$ S2 U6 a/ Q' B+ j# r) F/ U! R
2 M1 t" L, D' L1 J; B5 k2 m R+ b // 事件触发配置* Q5 J. u* U0 Y7 D1 y
// 每三次事件发生产生中断/ D. i5 G) A* I2 w' M
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);' O- Q, B2 R! u. K( m5 H
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件5 y: p8 Y5 h6 u4 ]
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
/ N" \9 D6 r; `$ i% o4 m // 使能中断
& M. ~. O% u, S' L0 P) Q" D EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
4 l, N# {* o6 k3 e+ d, a9 }& j0 \! h8 j( Y* w% d: ]
// 禁用高精度子模块
9 Z" R. F7 Y9 i; E8 B EHRPWMHRDisable(SOC_EHRPWM_1_REGS);: h. K! v' G- D5 s( L& Y
i4 A B) i/ u/ ~4 b6 J
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);& u5 x& c5 s: u: c; l
}: l! J" H8 ], | J6 {/ r
9 a# s9 ?$ D( g! x* O) ^0 z6 X
void ChopperWaveform(void)! ^$ w0 y6 c B
{
: ~, i) x0 U. w* b t: W // 50% 占空比
) X+ X/ S6 ~( O2 u* H EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);8 q; k1 N2 n2 ^
// 4 分频
3 Z; @# u* v: a6 U# c9 X% U( J1 } EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
# Z* K! z3 R4 i, ~ I* r // 单个脉冲宽度
' ]. u, v0 t' [- g7 M6 h. T; k: a EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);) @1 T- H: V# [' d6 n9 Z
// 使能斩波子模块3 X" ]6 h6 `* F9 r
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);+ P3 ?! d2 s! F& @( Q- B
}
* ]$ b) L; v/ U3 }6 P
% P; U0 Q/ q0 L$ B5 b; v/****************************************************************************/- H* q9 r# e& c# ]4 f/ Z
/* */1 x' n! r0 `* k" k+ {! u2 A
/* PWM 中断初始化 */
) T: G9 P: c, p) j) y8 I/* */
- ~, f3 F. ^6 p$ [. j% W7 \/****************************************************************************/& x" T( w# F) W. Y# y
void PWMInterruptInit(void)
1 k$ d" C- J, s{
/ v$ N* V* L+ a4 g: v0 H8 A6 ] // 注册中断服务函数7 h2 N3 x( [3 l
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);$ W+ I9 ]; S4 r- e: V
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);; O, {) {$ Y$ A6 T9 p
# b9 {6 x4 t; I" N
// 映射中断
5 E3 g1 P; q6 ^9 T3 y) ~ N3 C IntChannelSet(SYS_INT_EHRPWM1, 2);& u$ @0 S# u% z" R D( E3 e
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);3 |" L$ Q$ P' s# s
& a& P2 M+ k4 e( `6 t
// 使能中断
6 R9 K( _8 B6 T. g$ y( q IntSystemEnable(SYS_INT_EHRPWM1);, o: ~+ x' i& z
IntSystemEnable(SYS_INT_EHRPWM1TZ);) |. a# ?" c9 Y, ]; k
}- c; x/ r- }( x1 [4 i: \
8 h. i; i# @8 g/****************************************************************************/
4 W; ^+ x0 I) T! K+ t+ x/* */
/ r& K" N$ ^' _: Y/* ARM 中断初始化 */8 j$ t5 }" x. `% e! h/ [
/* */
& n+ \& ?; T% I6 m( Z2 m/****************************************************************************/
! E* f* f3 r7 E$ q' c7 w7 tvoid InterruptInit(void)2 Q1 `# S- O- S8 E
{
' O! R/ j, E, V7 K* h // 初始化 ARM 中断控制器) E/ E* H/ _7 _4 g& v& `& B$ u& X
IntAINTCInit();
. }; [3 ]$ V3 e, T$ D3 O, f5 h! i. U
// 使能 IRQ(CPSR)
+ ?# _6 s6 R$ u IntMasterIRQEnable();
) B7 h7 H- f+ a
% }, B- V- N& M3 Q N& S7 v // 使能中断(AINTC GER)" F/ Z. d4 B: S2 ~5 v' E
IntGlobalEnable();9 ?3 |! \! y0 @4 T
# l5 o8 O* s2 g8 l- o! O // 使能中断(AINTC HIER)" b% h' }0 q7 m0 J- m1 q: F
IntIRQEnable();
0 D1 z$ ~+ R0 l: W( a# W}+ s# Y& {' j5 E, B( b
7 s- f% ?+ [4 S8 h7 v
|
|