|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
( e* M% Z! ^- [0 t/ s6 Q/* *// _4 E( B, F, u1 f+ u
/* 宏定义 */
. q/ [# l, A: A9 @/ R# l/* */
8 `& |8 A' E2 b' `- _3 @/****************************************************************************/7 q: T( L. V3 e+ p( L- I0 `2 P
// 软件断点- |. z/ O, ]$ P* X8 _' u! l* t
#define SW_BREAKPOINT asm(" SWBP 0 ");
: {" V9 s; x" m" y) p
# D0 D* s2 Y' Z$ L; B$ a! b// 时钟分频+ U% v. h+ E! @( m/ U
#define CLOCK_DIV_VAL 228
( ^: w0 z6 u) r4 u" [# B; q+ x
* [% _2 @9 f9 ?& W V/ `/****************************************************************************/
9 F/ n2 A! m9 ?' K4 N) \, ~/* */& ~' l$ b4 y4 U6 k4 {. t' M: i
/* 全局变量 */
8 s. P3 j; S3 k. E) t/* */
& T4 Q, l/ o" |5 F4 p/****************************************************************************/3 V- [& L8 _) W) n" P3 m1 L: Z% q( F. G
ECAPCONTEXT ECAPResult;
7 i& g3 n: g2 |* _, m& v
1 ^% N ]8 o: l1 N0 O+ m4 j/****************************************************************************/& j* o6 b3 t3 |! z
/* */
6 }- X9 b2 |" ?9 X/* 函数声明 */ r/ v- s0 P/ q
/* */* g. L3 W5 `) j
/****************************************************************************/" r* A0 C3 Q5 o0 n/ N, p9 }
// 外设使能配置5 C8 k( S. D. ^* E) R+ x$ t2 l
void PSCInit(void);
; [8 i% P' j Z# l3 `$ B! [8 e$ Q6 E9 \. e* {% D2 y
// GPIO 管脚复用配置
$ I7 z- {: {6 p6 Z* ~5 Uvoid GPIOBankPinMuxSet();! K7 e. B. _- A) ~
' {8 t d- t0 S; |
// 产生波形
: @- Z" Y0 \4 z+ w5 C: `1 Evoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
1 e( c/ B: x# ], g* c, ]void ChopperWaveform(void);
& _5 n8 B8 H0 W: q) z& K. ~9 ~9 w
1 M0 s2 h' a) A+ L6 Y% k// ECAP初始化和读函数# ]" m& L1 S) K
void ECAPInit(void);
4 W* i' l* F* c5 ~6 i4 G2 c# n% o) eunsigned int ECAPRead(void);
! v7 O' W. m: V
- q/ E% i( R" `0 x3 b. e+ Q+ A//ARM 中断初始化" o# D- @+ C4 x* ~6 q& A8 Y& |
void InterruptInit(void);
$ \3 ~! d- i) M0 @
6 s+ [2 b$ V# ]2 m |+ g, O3 |// PWM 中断初始化% c6 @ o+ H2 A: W
void PWMInterruptInit(void);! l1 B; S/ \; j
// 中断服务函数
. k' A* Q/ u$ y7 a// PWM 事件4 t) G+ m( ^! D* N$ a5 r
void PWMEventIsr(void);
7 U5 {4 N9 c+ w- b- m// PWM 错误控制事件: u( h+ c) F9 \) D9 I
void PWMTZIsr(void);+ Q$ T l: V3 c- R0 F( X& l
- X" N+ l* V( N0 j9 B2 {( Y; i) i
/****************************************************************************/ r1 X! H" C( j$ M$ @! ^$ F+ j
/* */
9 q' t$ J) ^" C3 r g# T/* 主函数 */
" F8 V+ S) i! q. K/* */
2 g' R: Z/ F1 ?% W; L1 l/****************************************************************************/* h) W* w6 F" v2 `- @; D7 V
int main(void)
" s- v I z$ a5 Z( I2 B0 T- b{' g% b/ k% L/ b. D5 A$ A8 X0 p1 o
// 外设使能配置9 b) w7 Z9 z! s# v6 X. N
PSCInit();- r$ y( g4 @5 e% z
. L, ^# G& {- I
// 初始化串口终端 使用串口2, N, E, j! O1 I' a! S0 c8 w
UARTStdioInit();
: l& u$ v# |1 {, u
( s8 l4 M1 F4 L7 R7 S& b! \" b // GPIO 管脚复用配置
4 o' _ K3 l+ n: r3 @7 W) @ GPIOBankPinMuxSet();' J9 Y: Y" s3 W4 O* j. D
) J5 q0 i, i, h- ^ // ARM 中断初始化
0 w' Q5 b' ^2 V4 b3 s& B InterruptInit();8 V4 Q+ E2 P- M+ j5 J
8 Q5 X, l) N3 \ _ // PWM 中断初始化5 k: p- C; G( N/ I U
PWMInterruptInit();
& W3 w: j1 H3 l- P8 o" i! V7 C- _7 t1 _6 U' L
unsigned char i;6 E/ E0 d3 G B& K
unsigned int j;
0 P3 [% I' e1 i' U/ y
! Z; F8 @5 [0 f; |/ j2 q UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);- s8 N* R& s) w
UARTPuts("------------------------------------------------------------\r\n", -1);) o1 q0 Y g& e A
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
# S! b, ^6 G- `: g // 产生波形
# Z2 y/ I0 Y1 {. n) @+ T- `# r PWM1ABasic(25000,50);
' K* [$ j. |/ K' z5 \
4 b& u4 C) }' X6 i1 m9 R UARTPuts(" C6748 PWM Test Over!\r\n",-1);$ A2 k3 a7 y1 E
UARTPuts("------------------------------------------------------------\r\n", -1);0 J0 d5 t8 T6 H6 F( E! `% D6 f
) l6 V( F1 L/ ]3 |+ p1 g' B
) r6 D6 G" h, l& I0 ^) o2 y* ?9 u
UARTPuts("------------------------------------------------------------\r\n", -1);- j y& E4 @: w* W) x2 X5 ~
UARTPuts(" C6748 ECAP Test\r\n", -1);1 L' J8 P3 I. p. u; g
// ECAP 捕获初始化
3 H( C! f) y* C* M ECAPInit();7 Z; {1 r# D. X8 v: z" g
UARTPuts("Initialize ECAP.......\r\n",-1);! g1 h% W7 d2 u% R5 d
for(i=0;i<5;i++)
, ~, f% u- S+ }' j {
' u7 B' S# m4 w3 e' g) e for(j=0x00FFFFFF;j>0;j--); // 延时5 y, T5 X1 \8 }. F% c& |
ECAPRead();
# P# V/ g' i5 c7 G: L }
+ N: ?+ I2 `* K4 E$ c7 d UARTPuts("\r\n",-1);8 H3 @+ S0 `: v0 M5 t
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);& a x9 j8 j. y& q3 p% e
UARTPuts("------------------------------------------------------------\r\n", -1);7 h. H, g# d5 Z/ j7 N1 n, V" J1 a
% Q5 C5 o$ x1 q* |! s // 主循环
6 [. v+ L& n) q9 _( m for(;;)* _+ F' `7 G2 B% w, P
{
% P4 s# U. U! l/ y8 A( K4 g' c8 _) h9 l6 W( M# ^
}
' I# e8 r3 t0 M7 w/ f}# r* w' L% M& J
: y9 k0 r- U# l+ ?# Z* R" F$ T$ _
/****************************************************************************/, _- V; k/ a: u# }; }# O U
/* */& s$ j; |* G( T3 r, l5 P
/* PSC 初始化 */5 l4 e7 [4 [' W7 w, Y* M. M+ S
/* */
5 W5 |( a8 x; D V4 r/****************************************************************************/( I- ~$ ]" v* J" _, }" X. E: i( `
void PSCInit(void)
: K* ~5 T1 I, @# f9 q7 j5 y ~4 N7 D{
6 Y* L1 g9 z" O$ k' O/ g/ y // 使能 EHRPWM 和 ECAP 模块
7 Z: u* `5 C/ e$ h5 M! Q // 对相应外设模块的使能也可以在 BootLoader 中完成
* _5 p; Z5 U/ M6 v; R PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 X, G$ U/ x( r- c( L1 J. [( h5 y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
, p8 R2 O) [- ?; n) b7 c- M2 [}
( X4 u; B0 d+ q# @
5 y" N# H% P. H p/****************************************************************************/! w. n) z$ H' N* @4 c8 H* z3 U
/* */
" O9 d& d$ x: o/ o i( e: o/* GPIO 管脚复用配置 */
, t" t) C* j* Q. k/* */
/ S, u- P% b% n4 ~/****************************************************************************/; U& |1 a. P0 H; a1 w
void GPIOBankPinMuxSet(void); `# ]; m. s. z3 t# L% t
{
1 |- g0 D3 ]/ x4 N4 @ EHRPWM1PinMuxSetup();
4 m( y) `2 T h( `* v" g/ U; h1 j) \; D. ]; H
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)# e7 u6 Y0 L# ~* z; @: i; V) R' Z: d
// 作为捕获功能时管脚方向为输入! \' M, [6 S- g6 V
// 作为辅助脉宽调制时管脚方向为输出
' e* Y3 v0 }1 b: _4 ?% W0 P // ECAP2 / APWM2
4 B: K3 X. g9 \5 z0 F, U1 B ECAPPinMuxSetup(2);
K2 k$ Y# ]9 h1 x
3 @* r7 w, l" C9 ?7 q9 L4 R // ECAP2 / APWM2方向设置为输入
. M# ~' n% N- I5 K( K GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]2 j8 d# c. \/ A$ `- n
} s* b1 b" z' T5 I3 @. y
8 Q0 y7 ^7 @, E: _; n4 I. X
/****************************************************************************/
/ ]& |# J/ r" e5 `! m/* */) r& }5 J1 X' p: `0 x
/* PWM 输出波形 */% R3 Z1 Z, O2 H7 ~* O
/* */
; Y; |1 ~4 F- f/ ~+ f: {" [/****************************************************************************/% q! {& r! }# F9 P0 |7 r
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
$ t5 P2 q) J) `) Z) `3 ?8 U{- p6 z3 u$ c) S3 V t
// 时间基准配置: f3 Z S( |9 Q: S
// 时钟配置8 o% _1 @4 U" I
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
9 t6 \3 \. S% @9 y# s) X
, H5 C1 I! ]3 y5 K8 T! I6 l+ p2 Q9 d. a // 配置周期* N, D; ^5 u' e$ n! o" Z0 s4 H
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,1 ]1 M* M$ h+ j$ W
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);# L- f# a! O# M8 V2 u
, F) r S4 Y. }% o$ e1 g7 V j8 ]
// 禁用输入同步信号( C8 a" {5 X& w. D h" f
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);' U5 E1 w5 o1 d* T% g# X5 M
+ }9 K0 X& p3 k
// 禁用输出同步信号
/ q1 {* F0 D+ ~6 t/ v/ \ EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
5 h: w& ~$ `; Y& t2 i8 Q6 @9 H6 F6 u& r. q% z. A- i) p/ P/ t6 N! e6 E
// 仿真(DEBUG)模式行为配置
, ^ F4 T* S( l) O EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);& f5 A* y, B6 @- ~, E
8 j/ t9 U" W/ c, T/ [ // 配置计数比较器子模块8 R( p( ^& w5 k. y* R
// 加载比较器 A 值" z8 M ^" `4 {. }. [$ ]4 n
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,2 ~ Y# M+ e. K" P; q- I+ X
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);" l4 r" T- [# ?4 b/ z' q* |8 K( Q7 x
7 y% ?' T A3 I z // 加载比较器 B 值
0 P2 C+ {& ^- X8 W% Q EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,1 T* c u" r/ L. i8 W/ B' f/ `
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);: F2 Y6 W3 _4 X
' F, O5 A" N1 J+ n5 g j
// 功能限定配置(输出引脚触发方式设定)
; S! N) I Z1 { // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
9 ~2 i" e# y" m* x EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,0 D9 p- _% M: |; V; g
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
& O' U: C0 x, V l EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);" ]- ^2 {: f5 t) `
S) l+ ]' c) T4 Q
// 禁用(旁路,信号直接输出到斩波子模块)死区模块( q* m- ~: E5 A, k7 ]
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
0 Y+ s8 |" g' ]9 u4 w2 M3 n( z8 {2 `7 @2 _
// 禁用斩波子模块
1 t6 p' ?! f( m+ R EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);9 X" P2 z$ N' W: V1 H ]
! U. I8 b' z1 m6 i! z8 l
// 禁用错误控制事件
* S! V# N" {9 T& J) |3 a EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 u" X5 D$ a5 |, D' r- P
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);. o9 p; x" L5 e1 R+ d% O. b
& x5 J. n' O$ s u' X) b3 }- r1 [ // 事件触发配置) J4 k3 b: _# a$ b# ~# A! |3 S
// 每三次事件发生产生中断1 ~/ Y2 R' P7 h
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
6 b1 Y6 z2 F9 o/ p // 时间基准计数等于有效计数比较寄存器 B 值 产生事件; }2 S0 Y' A/ }5 V6 @3 C' b2 ^
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
3 `4 N: y* ^" ^! ^ // 使能中断
, `1 z0 J# ?1 C/ M7 ^ } l% P: @ EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);/ n& ?" d7 ]0 a% Q5 [
6 z w8 a$ _/ b( ^2 }
// 禁用高精度子模块1 n$ J" k5 H9 a/ z
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);9 O- k7 ^( H$ }8 ~5 J+ g
+ s- [4 ~; r; z9 K9 @7 X% D3 } UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
3 [; w- \. k7 [6 B \" j}' V1 L9 K, R/ o3 m- w, N
( U6 p' e+ k6 S8 d Q( D; z
void ChopperWaveform(void). q/ l$ C- _1 a+ a
{$ h! \$ r: \ Q% `% U1 V& m: K1 z
// 50% 占空比
8 e0 _! V5 m# L" H- r. J4 G EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);. `! l- {) B5 {5 L
// 4 分频
. A; g# H1 h/ _0 v EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
# _% b( o; m3 w9 z" A# S: g7 W3 C2 D: X // 单个脉冲宽度7 J7 q. o `) _
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
3 C; Z! p l- L // 使能斩波子模块
. U( ?# `9 F+ E# z$ e7 H, ^+ H EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);2 ]* B) z5 h- _" |9 i! S
}
! p9 g* h, D! ^+ F" J# k+ \$ v \- U9 e4 _' \. m: s
/****************************************************************************/+ G% v+ Y* j- c& g/ H- u" C
/* */; t h; _8 h: c+ \* T
/* PWM 中断初始化 */
# @0 g" N; Q8 t( F$ D3 q/* */' t5 m, T/ X0 o# r! E% v" b L9 t
/****************************************************************************/
! p. N N5 S( }. x5 g. Cvoid PWMInterruptInit(void)
( A* n7 y) h1 {{
$ s0 d, _1 h( j0 } // 注册中断服务函数
6 I% q R1 x6 P0 F IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
7 R6 Z9 A: M S, r IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
) \1 y5 M. k4 D4 c9 {, A$ S
+ B6 a+ z/ C2 I- y! t' m [ // 映射中断
0 N0 k+ P7 e! ]; p9 J: m0 c IntChannelSet(SYS_INT_EHRPWM1, 2);
6 ]) q/ {2 x8 @# C" [ IntChannelSet(SYS_INT_EHRPWM1TZ, 3);0 l% b D1 ~! B# T
3 h2 `! C* O$ C% s7 w) a // 使能中断! {, ]9 D( W& v7 d, ?
IntSystemEnable(SYS_INT_EHRPWM1);
5 B* c9 s {, V+ `7 I- t IntSystemEnable(SYS_INT_EHRPWM1TZ);
& S; ~: `" r4 R9 o* R1 p}
M: X/ M0 `& L
3 ?- e; C1 j& A+ k2 s8 c/****************************************************************************/ t4 o# Z) d) b/ H+ K2 e2 R
/* */
+ R; O( V; r! v& A- n* N5 m/* ARM 中断初始化 */
) ?. n* j3 H# P v- b( h+ I. E% z/* */
3 |! I0 o: { j. ^7 r5 @/****************************************************************************/
% Y5 Q; Y8 b* L5 e5 Hvoid InterruptInit(void)6 }' R! N% O( l/ J$ C/ g
{$ h ~9 |# X. p9 f+ L. h
// 初始化 ARM 中断控制器+ W) m- z$ o% ?0 ]* r% ^
IntAINTCInit();/ x- X% |5 {2 o, L# s
' h( x3 X# D* J9 \8 l7 z# S // 使能 IRQ(CPSR)
6 c! D9 V; ~8 ^8 `: A IntMasterIRQEnable();4 t+ p9 Y2 b1 ?( L% p7 B
+ `5 s/ B. ~; K, P0 J, V. R% k // 使能中断(AINTC GER)
+ Q7 c5 x- N$ K/ g- Q5 ^: t6 q IntGlobalEnable();
+ _7 ~- j! d- m- _5 P/ A' s3 r5 H/ R* b
// 使能中断(AINTC HIER)
& t) b$ R# S3 l* q' J {1 c( B IntIRQEnable();
) j4 W6 E* T e}
1 c; k4 L8 b# W( k9 i# p4 s: `5 v; y8 O( L' B0 J" p+ V' |; Y( R
|
|