|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
& G3 I ^# m/ a7 A/* */
7 d4 x: J, D {+ f N/* 宏定义 */
. p- N {; V. v# f/ Q; w' O/* */! B8 y1 N9 q) o- b7 O$ [
/****************************************************************************/' ^6 O" I6 F3 N @6 p3 f
// 软件断点5 v0 @& i/ O% r" ?3 d/ L
#define SW_BREAKPOINT asm(" SWBP 0 ");: K# Y- C( D3 a6 T' [! ~
- x6 ^+ w+ c! X; s- H S* E% |// 时钟分频/ e- a. |- z# K5 s) @
#define CLOCK_DIV_VAL 228
+ t+ T0 H6 p) t$ K: H# E5 J+ f7 e4 H# ^2 S* [8 h" ]
/****************************************************************************/
) v" r! O; e, ]* q/* */
8 S& u4 E; X' j8 H5 P. V/* 全局变量 */- ]- S! x1 L& f, w
/* */
8 b9 ^. V4 J9 I) m/****************************************************************************/8 d5 g. b2 ~* t
ECAPCONTEXT ECAPResult;
! [, z) D3 `8 S4 j% j% z: t' r* @- |
! a l. U- w' J, y' Q/****************************************************************************/
! Z! y) U( n- j! ]- s' E/* */
# O( m; F* |; O3 x" s3 X' k/* 函数声明 */
& L& P8 J7 y9 c% H0 N: J$ K/* */
4 [, F) I" B8 K8 Y6 A' E/****************************************************************************/
! g# d8 ~& e i( L// 外设使能配置- K4 B: W$ G5 e$ `1 o$ M
void PSCInit(void);1 _ Q/ t( k0 @8 ^' o4 s! a" ]0 B4 [
0 ?( Y' T- D1 p: H" [6 k1 c// GPIO 管脚复用配置, u: E& E- { ^8 v/ G$ P1 H
void GPIOBankPinMuxSet();
; r! y2 e+ R3 a& ~8 r+ l# q1 p. n* d. d; O$ R% u
// 产生波形* E7 M" ]5 n8 m( r2 o/ O/ l( m# v+ P
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
7 c. P% k- T9 P% [# j* n3 mvoid ChopperWaveform(void);
( A' r9 P+ M9 ~6 e2 @" E! x* X% t1 @' `/ y' k
// ECAP初始化和读函数
) o9 O6 J6 ~; I/ X8 h1 Tvoid ECAPInit(void);
! I5 o) E$ f6 c9 G8 I9 Kunsigned int ECAPRead(void);
: C6 I9 y8 a. y# f8 k% P5 q1 N. s' h, ?: N
//ARM 中断初始化; Q3 Z; S1 c6 O* R, q0 n3 s1 i& w
void InterruptInit(void);
8 x4 q E1 U8 J* _7 m8 [
% y2 D( e1 W4 l. k// PWM 中断初始化
$ y: R" j+ _' R% l7 ^void PWMInterruptInit(void);
@/ e- G0 o. N& Q: W5 r6 G// 中断服务函数7 p, b( ^) G. [( Z) G x
// PWM 事件
+ T: X: f' o Q* Y+ D( i0 [void PWMEventIsr(void);
$ i- |6 B9 u+ Q// PWM 错误控制事件
! W& U* M' }/ k# g1 U+ x8 tvoid PWMTZIsr(void);
^: b8 M+ g; e, R( Q$ Z* Z
& m: b9 n' u+ g) @- H1 I" Q/****************************************************************************/) Y! W' Q- q+ I* ?
/* */! d0 m1 Y7 D1 h+ ^' C
/* 主函数 */5 F+ x$ ?1 ]6 f0 C/ v6 K
/* */
v9 I- P- m4 R: a$ L/****************************************************************************/
4 \& B4 @+ l$ I. S# C4 @3 zint main(void)
. Y2 Q/ f* Y1 W" ~4 V{
4 v3 ^2 A. v3 Y9 I2 }& _ // 外设使能配置! O3 V$ I( r6 S2 O- i: q& {9 X$ h+ l+ R
PSCInit();8 N, G+ E2 L/ ~/ i
9 Z( Y% X) W! d* q% p b9 x% Q // 初始化串口终端 使用串口2/ h6 `" A1 O# L: [* |$ e
UARTStdioInit();% w, e8 ^+ e- w" f t B V3 F
: v% X" @3 V6 O8 P
// GPIO 管脚复用配置
9 |1 }' _) _5 {% i- L GPIOBankPinMuxSet();
8 W. S. V+ [. l7 L. r2 ]# }, G' I( ~$ ?( r8 M! q, G
// ARM 中断初始化
% f+ v; U' N: z7 e# F2 X E InterruptInit();% C* {) E- i) q+ N$ X
' B& {+ }5 g7 v1 D+ t // PWM 中断初始化$ ?: t: D0 m1 J& n+ M6 \
PWMInterruptInit();3 m/ f2 w; e6 `3 `& R g. ]
* E- g8 q5 w& n& W) f7 ?1 N; b
unsigned char i;" U" r p/ R+ s
unsigned int j;0 j6 F4 v9 v# z g% e1 q4 v
5 L$ b; l# r0 Z5 j+ E6 }( }
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
. s+ u6 L: W7 s" `5 o1 U UARTPuts("------------------------------------------------------------\r\n", -1);
+ S, k- [7 K' m H1 W# L) r2 B UARTPuts(" C6748 PWM Test\r\n\r\n", -1);% O$ u8 D# S3 a
// 产生波形6 n) Z$ `% c, O: a& x
PWM1ABasic(25000,50);9 a5 z/ r& M4 x/ m
6 _% r- s2 z6 M' D" k4 X
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
9 W7 s: J; V* f7 ~# _* T UARTPuts("------------------------------------------------------------\r\n", -1);
9 R/ U8 Z# O6 ^! \6 Z- j Y& |; E% x/ n
6 q7 @$ n" c) T
# B1 L, j8 S5 p$ P
UARTPuts("------------------------------------------------------------\r\n", -1);
4 C. j9 {5 b) H- n UARTPuts(" C6748 ECAP Test\r\n", -1);- G' {: J& b/ \5 M
// ECAP 捕获初始化2 E$ j7 k) U1 I% _( m
ECAPInit();
' V' g+ _2 k/ r( \( N UARTPuts("Initialize ECAP.......\r\n",-1);
2 |9 j9 A; W9 o6 Z4 s1 M for(i=0;i<5;i++)
2 I; I4 s3 V' B {
8 t" D( u ? U for(j=0x00FFFFFF;j>0;j--); // 延时
& w+ ~5 o) y# b* M! F; p ECAPRead();$ b0 j1 q9 @5 W8 e! D$ ~& [
}4 S& Q$ k, }1 J! w4 u
UARTPuts("\r\n",-1);% ?. D% [+ ?9 s/ N
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);; F. u& F2 X) ]; t6 y) j: N. @% z# Q
UARTPuts("------------------------------------------------------------\r\n", -1);- U" T5 Q) P! e+ {+ { o3 A9 |
- b$ J( H. R m // 主循环' k! k7 Z l8 T5 y
for(;;)
$ {0 s1 T$ q! Z! c+ C! m {2 Q4 `: `, p( o/ f3 _
% b; N8 C2 u: A7 v
}/ c& n. Y9 L. f/ l6 J0 F% ]4 [7 M
}3 ]' x/ X+ n5 H: B, g' g- Z
% J; s+ h8 @) ?; o* t& o$ L/****************************************************************************/
8 V' c7 t2 Z' z/* */
" c. v1 c8 R$ o! W/* PSC 初始化 */
4 l* u$ Q, ]. ^. j. R6 r# I/* */
6 W; L9 N7 N, E9 |8 P0 Q/ x/****************************************************************************/2 V$ \" C5 }4 c- L4 S* E
void PSCInit(void)6 H# Z" {7 h P& H1 r
{
4 \* R6 u$ V+ N% {, C V // 使能 EHRPWM 和 ECAP 模块
3 Y1 H# k3 ]( [& m* o) V // 对相应外设模块的使能也可以在 BootLoader 中完成
! m5 U* l/ a' T0 j PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);3 p0 }! g5 Q" A
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* E9 y- s7 f( C1 I& w& R) D
}
4 |! E" l @2 h! J# O+ @7 L: c" W6 K% n/ h" c- k- Y0 A
/****************************************************************************/& M& X1 [# M6 H( k
/* */( P; j% J8 a K3 {
/* GPIO 管脚复用配置 */
& K: R+ |, B4 F# x+ g Q/ Y/* */
* G, `$ b9 a4 o3 A8 A" O/****************************************************************************/
; D4 u N3 I' L* q- X8 ~ T" Gvoid GPIOBankPinMuxSet(void)
2 v+ l; Z# ~; n) W) m( q{) s8 u- C- Y% d$ y9 i0 K) O) X
EHRPWM1PinMuxSetup();
$ p1 e7 I! o. w; }, Y4 F! N( R
8 o5 S/ w1 }2 L // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
* u+ j ~; W' O6 n5 G: S: u L // 作为捕获功能时管脚方向为输入
4 y2 P+ X* g! i" f* G6 H: o( p9 e7 ` // 作为辅助脉宽调制时管脚方向为输出2 \2 V8 ~* g3 G }8 L! l, b
// ECAP2 / APWM2
# y# F7 b. N6 P. c& ]) k8 ] ECAPPinMuxSetup(2);
, H/ u: f' K, J- w! O
- X& \9 W# f8 w# _5 O5 A // ECAP2 / APWM2方向设置为输入
# [' \- K4 Z/ L: Z GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
8 n. Z' Y% E8 B5 ^2 `# \8 y. N}
$ o" G0 P& @: J! u$ Z$ C: h; |6 N, A8 m
/****************************************************************************/7 |& f8 N+ f. Y+ Y1 X) A9 T
/* */( [9 P: D+ m! w6 x( _+ m: V4 L
/* PWM 输出波形 */: M+ \( F- o1 A) i/ M
/* */
& V- e- I# Y0 T, a. G. A1 B) J/****************************************************************************/
+ Q% V6 `8 y0 Xvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)$ ]! u. R; P/ m( W3 x5 f
{
0 @9 h, m# f+ S4 T // 时间基准配置 f: T% ~4 B( h* E
// 时钟配置 u1 @% d! }7 A, l
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);" G4 e/ U* J9 t' r, I# K
; N6 K. n8 e$ a // 配置周期
% I$ ~& \; o# S; j" f5 G3 P { EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
/ F2 I( w9 z0 L4 p l pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);, v5 N8 b) n) K( [3 ?- ~
" \9 U a; Y5 D // 禁用输入同步信号
" Q& E- G% E4 Y6 V N$ R, ~+ j% Y EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);! B" L- o3 ]" m2 Q( p' n
/ R5 }5 l) A/ K6 ]" {
// 禁用输出同步信号! b, {, d" ?% o
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);1 ^5 P* W( ?# r- J
2 b3 D( H5 [4 u# o' \* ? // 仿真(DEBUG)模式行为配置: E8 {$ o' [" x$ x; A1 e* R3 c/ `
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);0 c3 C5 I# ]$ o1 _2 w% V- x8 z
0 v1 e) S( V# x2 ?& f
// 配置计数比较器子模块- ]2 e$ H7 f+ b* z. _3 _
// 加载比较器 A 值6 \2 z+ M- `3 `$ ]' F
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
1 V) l- G9 c4 u- c2 o5 F0 D0 R EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 b1 K# {' P9 z. Y+ ^2 `) t9 w( U% l+ H8 n: V
// 加载比较器 B 值# y1 A* C6 {4 p; g1 y
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,$ w; X9 v' }! Q7 l6 L
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);# h7 o e7 G" Y1 H V
& @. }5 i' S1 u0 L% Y // 功能限定配置(输出引脚触发方式设定)! f% H; A/ I: f, M
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
8 D0 _0 O5 [4 p EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
z( @& g1 V$ C6 x EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,2 W" m, S, b5 m" t! w5 O6 X
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);. |7 e% `, n3 `7 f
0 D, t0 D. p, N* o- w7 H, D
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
. b7 q2 G0 Z) I% }' N EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);2 D. M+ c p: T. x
! G+ Z/ Z! Y; ^4 m
// 禁用斩波子模块
$ t8 ]3 k/ W8 { Z EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
; b. j: A0 \ ^ z8 h6 t" I2 J
+ g& J+ q7 I* k# @) ^) r w // 禁用错误控制事件
% z6 r) J" L' z9 t; \ EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
" t1 e$ C. a5 {) U: ~9 b) C EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);; H+ ~0 Y( ]2 `% L. D
# h$ q/ E, n& g M // 事件触发配置( ^" e- q+ _4 o% P* x/ X
// 每三次事件发生产生中断' m* v9 B4 L/ l5 n3 k5 j
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);( O2 Z" `/ c. i h0 b) k' O7 X
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
) r$ T2 i' s5 [: a' M EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);$ E+ s& v! V$ l% \7 f# i
// 使能中断+ f! {! H9 d' B# E
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
9 i1 o# U: a8 ~' E& w& _' E F7 Q
, |! }1 C. E9 j7 f // 禁用高精度子模块- d8 ]0 A6 R/ G* P" Y: z
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
7 S. h" g4 {+ I5 t' N
( x H( g# d1 i! m UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
7 f# ^- x. Y& A}
' g. J+ a Y9 b8 ~4 f) }3 E" J; _6 o \5 t/ H T# L
void ChopperWaveform(void)
3 O) r) J T( A% [! W4 y{
?6 r* s' L# j4 G" s" o9 m // 50% 占空比 U7 I1 e" S8 `6 E. C
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);' f, ~8 ]& p+ \0 f
// 4 分频+ v) d+ _( f% V$ n, _: P1 m( `, K
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
0 {8 x% @+ X3 z // 单个脉冲宽度# |! j' O4 U4 y, k
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
/ r6 N$ T/ E$ w // 使能斩波子模块
0 q3 o# j2 U0 b( y EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! M( {% q% F. A* B}6 I. R; F6 Y0 E, s* Z
2 e( d5 G8 d4 s6 O+ M% j/****************************************************************************// K2 L0 |/ M* i( _& j
/* */+ i# c+ [- u4 o$ e# b4 v+ Q0 Y
/* PWM 中断初始化 */
) g3 |) f% Q" w/ N" M" I/* */' N3 r, M" V6 n4 n$ a: n- u! l, w
/****************************************************************************/0 {) C+ S1 R) b! [: j9 k1 {$ }1 k3 T& F
void PWMInterruptInit(void)
5 O( h0 ?" |- Z{
7 D: n* i. q5 \& e // 注册中断服务函数
6 A( h) b5 q- ~4 }: V IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
9 \% f9 G2 \/ u; t IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);) q! C2 Y& b3 F6 z
- [! C B7 e, ^' K: m
// 映射中断4 B! p6 O! j) }
IntChannelSet(SYS_INT_EHRPWM1, 2);
* C) S/ x# z0 @3 K: I. G3 r IntChannelSet(SYS_INT_EHRPWM1TZ, 3);3 g7 }- p) M- Z2 Q: ~' \- o
" Y; {" ~' P! w# a% s // 使能中断6 ~7 `# B- y; r
IntSystemEnable(SYS_INT_EHRPWM1);
2 J4 d& F, X5 b( ] IntSystemEnable(SYS_INT_EHRPWM1TZ);" Z7 M6 T7 ?0 U9 i
}
+ n8 N3 _% q4 A! ]
( I1 ^4 F0 T2 j$ `( b# u( |/****************************************************************************/7 J+ F6 X3 A" T! y$ L; a
/* */
) ~, Q* I, S/ I$ k/* ARM 中断初始化 */3 w3 R8 f( h$ `/ Q1 W. z3 p; W
/* */. G1 ]5 H$ M8 |' t" M' t
/****************************************************************************/6 ?& q( D- Q- Q. S# ^
void InterruptInit(void)
/ X5 i& i; k8 c9 M8 W! J+ b, k{
7 V- a! \* R/ x5 I* `9 Z // 初始化 ARM 中断控制器 j7 B; j5 f$ c* D; h
IntAINTCInit();
9 n6 o9 N; J, [8 u3 d9 r. i: m! F( U' j
// 使能 IRQ(CPSR)( ?. D- t c5 x# S- ?/ X6 Q3 j% ~& ^
IntMasterIRQEnable();+ R7 Q" a) D6 x& Q h: Y- X
( v% D' l% L1 b. T
// 使能中断(AINTC GER)( W9 V! O4 ]2 B& I- ]
IntGlobalEnable();/ G3 ^. f( E( {$ g+ ]
9 |6 G6 `1 t% `
// 使能中断(AINTC HIER)
, V( p: I) X+ l2 }# e+ X* T IntIRQEnable();
' G* b e1 l' s( f2 B}
; ]# Y B3 Q8 z1 l
4 M" o/ F7 m0 o+ f A7 C- N3 k7 _! f9 W2 o |
|