|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
7 ^4 b/ `' w$ _* V- N( M3 V% z/* */
! c# h4 N) W& b( N; o$ Q1 |6 e, P/* 宏定义 */, h# V$ i B7 N
/* */
% w2 h1 U, B; X: ]5 g/****************************************************************************/
6 h/ ]! p9 a: J5 Q. k// 软件断点! ]8 d, V* B" u% J: j$ f
#define SW_BREAKPOINT asm(" SWBP 0 ");0 k: J7 ]0 w8 D5 T2 E0 d, h
% x% t2 u0 Q" o9 }& u$ p! t6 Q
// 时钟分频
) G4 L5 l! Z! U- l S1 @#define CLOCK_DIV_VAL 228
2 `: t& U% O; w! ^8 ]* ~( ^/ M/ e; h0 y
/****************************************************************************/& E/ v% I( ~% R$ t( \
/* */
$ s4 [) m( B& K# a: z/* 全局变量 */
8 J l. W( @4 v0 f/* */
5 F; `4 b( }+ O7 ^* m/****************************************************************************/) L0 O; ?) J% y: J$ L3 a" q* Z! e1 F
ECAPCONTEXT ECAPResult;( n s" Z: z6 |# y- G# c. w7 ^/ E
' H+ y( U' J9 R( M/ [+ V
/****************************************************************************/
& d7 V- z# ?, T/* */7 o5 O, @ Z; c" v
/* 函数声明 */
$ D& {: b1 [) W5 R/* */
. {# S! O$ a7 h H/****************************************************************************/9 o8 i: S/ U2 C' {8 b: s% j* g
// 外设使能配置% |* p% w; }( Z0 a9 ?
void PSCInit(void);
- R8 x; B$ V# x3 N
) G7 A) L% L9 a' F// GPIO 管脚复用配置
; w& w4 m6 R/ jvoid GPIOBankPinMuxSet();
" f2 [! m; F; g4 W( B+ u+ N; M# B: i! J
// 产生波形
+ W! S E% k) J8 X+ D5 Uvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);' p- U4 `$ `8 Q! O" t3 I* J( a0 y
void ChopperWaveform(void);
1 u$ |% t' h+ U7 d4 Q
4 z4 L+ @: D+ P; d// ECAP初始化和读函数+ P, F6 \& @* m; j- I
void ECAPInit(void);
. v$ I( m$ I. t- O# E5 f4 S% H, P2 Uunsigned int ECAPRead(void);, t6 ^+ | E' ]) m; _
& r$ A3 V4 m# Q; m. y
//ARM 中断初始化6 ?% {; D6 h4 b
void InterruptInit(void);4 }9 a3 @+ S2 I4 M7 o
; C- N3 h2 _7 t7 X// PWM 中断初始化 d9 R& d# Q/ N3 v( Z
void PWMInterruptInit(void);
- o$ R! @% k/ P( E// 中断服务函数- A0 J2 b9 @2 Q* A
// PWM 事件. f0 u# B) T+ k
void PWMEventIsr(void);5 n) J( W. e% A6 B8 N6 c
// PWM 错误控制事件
7 R9 M5 i2 |6 G. [; s' q# w0 m: O' zvoid PWMTZIsr(void);
! V2 ~# o. ~% C. O5 z6 o- w; d. [4 \8 u
/****************************************************************************/* M4 C6 ]1 b3 R2 ~7 J M3 s
/* */
) P2 r2 T; V3 h! @/* 主函数 */
( }7 r V" w/ P8 s/* */6 G4 @5 R9 b4 ]5 M1 I2 s2 r
/****************************************************************************/
6 n1 f3 m, c3 j" u( i* Yint main(void)
/ ]% ]+ T& I; ^{
U5 C# J8 Q0 F6 I0 ? // 外设使能配置" {$ y) g! t5 p r7 i
PSCInit();
% I' `5 G, p% W8 }( q- h# u3 L+ m! _$ Z+ @! g
// 初始化串口终端 使用串口2
, a6 }4 S, J4 ]8 }6 f UARTStdioInit();
- Q1 @0 Q6 q! t2 [
/ `7 ^) A3 N4 Z; L' C) q z // GPIO 管脚复用配置
# ?8 u8 F0 l# ]+ R) D GPIOBankPinMuxSet();
& `* X0 L6 Z' E) W2 ?; W$ j+ i# C$ W( X& q, N1 `
// ARM 中断初始化3 r. f- l9 {+ F" L
InterruptInit();: q' d3 r1 T2 g& X5 \/ _' g
: P( }4 {/ I% C& D% n // PWM 中断初始化1 K% _' a% _1 M T+ X/ e6 _
PWMInterruptInit();
2 G, ]- H8 X4 s0 D6 I3 {
4 M8 F9 `+ U$ K9 v; n. D D unsigned char i;
7 e* }0 V) `% C" o( }) v1 E5 { unsigned int j;
# d4 C2 t; U A) E. Y* I5 I/ w! K
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
' o6 n1 \' D' }9 A2 |; k; ~. a. @ UARTPuts("------------------------------------------------------------\r\n", -1);
v- S% k5 |, ?% j UARTPuts(" C6748 PWM Test\r\n\r\n", -1);9 k; ^' S* E, R7 o' v G5 E
// 产生波形4 ?5 v+ T3 G, A1 {7 n$ t
PWM1ABasic(25000,50);
/ p8 d1 i* O0 H# V0 A# r, }$ @8 b4 X7 _
UARTPuts(" C6748 PWM Test Over!\r\n",-1);0 F, T/ U4 v6 E/ E& m$ l
UARTPuts("------------------------------------------------------------\r\n", -1);! I8 e) R7 J8 }$ i0 C6 v
: H; n6 j4 s8 p
. n! S5 |# z- q2 h; q4 R: b. d! r5 N. Y5 K
UARTPuts("------------------------------------------------------------\r\n", -1);+ w% y/ z/ @6 \4 U) c7 e+ G" ]- m U
UARTPuts(" C6748 ECAP Test\r\n", -1);2 c2 C. }# M6 r8 k$ E
// ECAP 捕获初始化
* t2 b7 j D: @! z ECAPInit();6 c/ `7 T/ C" J g0 b) A/ t
UARTPuts("Initialize ECAP.......\r\n",-1);
1 \2 |- `$ j! J1 r5 f- H% F- f for(i=0;i<5;i++)
- p8 [: [' ~; U" O) }) B0 w5 C9 W1 T {$ H8 V2 F5 t( g9 @8 S
for(j=0x00FFFFFF;j>0;j--); // 延时$ D( Q! m( x" z8 ?4 W t
ECAPRead();
( q1 j8 l$ U' ~ }
$ h; H+ o$ j! G* w+ d UARTPuts("\r\n",-1);
- P, r1 n6 t1 J1 P+ Q UARTPuts(" C6748 ECAP Test Over!\r\n",-1);5 J& H+ [# h7 Z! h% I
UARTPuts("------------------------------------------------------------\r\n", -1);
1 }( l# U" Y: O$ u, P. m% A/ x2 C. T
// 主循环( B$ l! y3 Y$ u/ B# P1 u! B
for(;;)
/ {; b' o% V8 O: s {
3 d% j V+ e) f) i
G& `4 w7 {4 D0 i+ k7 U/ Q }
9 l& R5 X+ d$ N& p( S5 T; ]2 A}) {$ T n. D) ^5 R
" n4 A. V2 {5 }7 C3 n4 x& l/****************************************************************************/- l0 w! e' V/ o- t* R0 O
/* */$ N, l$ R- @1 I# _- V# H
/* PSC 初始化 */8 d: B; G8 U o( h9 \
/* */
9 i; @$ Y! X V8 m; n( q) w/****************************************************************************/1 s! q" ^0 t$ ^, ~# b) k, C
void PSCInit(void) g0 f0 P% X8 m6 ~
{
- U+ a: M$ X- x+ h // 使能 EHRPWM 和 ECAP 模块
' ~7 i1 D$ o5 q! B, O) E( k // 对相应外设模块的使能也可以在 BootLoader 中完成
- e U$ `6 u1 m$ Z1 C) j1 [ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
1 F- i( G, w( d1 \! G! o PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);- U# K6 Y" t+ k' S( K9 y2 g
}/ m) U* S$ R* }% `# x X% A# I
0 W) M) Y) Z6 m/ e/ ?, N) m2 s" d
/****************************************************************************/
/ _) v8 f% j9 m! A0 a) i/* */- h' o' W3 }; n. f
/* GPIO 管脚复用配置 */( ]6 B# S/ ?6 U" F4 g
/* */3 u$ Y, g; l2 Z3 r" N
/****************************************************************************/
& g: b8 m& z3 t6 [ Avoid GPIOBankPinMuxSet(void)
5 `: c0 s$ D, Q7 q{
, T5 J& g" z) G( M* m EHRPWM1PinMuxSetup();
v# e: Y# n1 E; ~
( @3 ~) L; N3 }9 _' C/ ^' a3 d9 e // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)! R. D8 P3 m" B5 l
// 作为捕获功能时管脚方向为输入
3 C! S6 N1 O4 Y" J' ^ // 作为辅助脉宽调制时管脚方向为输出! `4 {- T0 z# ?$ c
// ECAP2 / APWM2
. z, z U$ x- @5 m: H7 Q ECAPPinMuxSetup(2);2 j7 x0 \; `. M
3 f7 Z1 G! }, B8 T. n) n
// ECAP2 / APWM2方向设置为输入8 L9 ~8 r' T1 i3 e; c, |
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
' x9 a8 I; f/ ^! X* |7 R}
+ y- D/ `! l+ K. w4 @% U
4 ?$ u$ C7 t5 M0 n! P3 t8 o$ `/****************************************************************************/* O1 F ]8 _2 {; U% F- E
/* */: u9 E0 A2 A% c. }2 a6 g2 ?" y/ p: B
/* PWM 输出波形 */0 J; _4 ]8 m. f9 j) ]8 E
/* */2 E4 H m: F2 r4 E6 ~) e
/****************************************************************************/. J1 C0 I. p3 i4 \
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
; n7 `+ h3 I- S+ [1 G{
5 |1 |% ~6 P, t // 时间基准配置
! t% q P. [5 R! a6 e // 时钟配置
6 h* h1 b, ?9 S7 Z/ @# }; g9 d EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
: r- s8 f! \, Z
: F4 q6 C$ W- w: F- A // 配置周期
0 S3 _2 k) M' H: {8 M- S2 ]1 r( Y EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
7 g7 S4 x, h" f+ H0 r3 U) j, s pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
. B2 P3 p. c1 H1 K2 r `5 ?
4 k7 n5 u$ K+ \' y // 禁用输入同步信号# @( T# J3 I( |+ q$ z7 p; C8 _
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ C) e! M3 [% A& ]" ^4 H9 t
1 U0 A H1 C% Z2 S2 I) z! l // 禁用输出同步信号9 r }' M+ E! P. D
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);4 {% Y% W' i& L$ T) @
" i7 _- U/ s1 O3 i$ m/ s // 仿真(DEBUG)模式行为配置
F" k& K% E; T& p+ a! Y7 s, A EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);, ]0 \8 @8 X0 M+ T- q
7 s: U# x( Y. P$ P
// 配置计数比较器子模块
, \* U- C6 C0 o- C# D // 加载比较器 A 值
* m0 k# g5 ?% e# x, r4 d EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,! l. _1 X7 G3 u3 t1 |+ }
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);! B/ D8 O0 w( _% C) q- N, s
, a0 J5 M' k" ^& l/ F5 `
// 加载比较器 B 值. q& F% i$ @6 c$ ]0 U% F3 c- c
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,9 L9 W B- B1 ]. X' L! f
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 U; O! r' a8 }# K( T
% `9 m) f$ I5 ]& R0 K! _
// 功能限定配置(输出引脚触发方式设定)
/ a& ^% w+ a/ K0 E5 n6 x' g% G$ f, O // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
4 m' \6 K; `: J! |' E EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING," U" N$ ?: r3 _# Z- B- E. m
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
o% g( }2 w$ X# s7 \ B) S EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
( ~9 u6 V2 ^6 `8 ?( _1 Q/ f h3 ?. g) A! k' x4 g
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
/ |2 F( b' ^; |* g$ o) q0 ^ EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
, d9 ~' A+ T5 z( e( S* T) J) S, G, X" w1 }. I' B
// 禁用斩波子模块 J$ M7 T: F, ]! U- U
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);4 ?% k2 ?& A5 M/ S
; v8 Y/ B1 z o! @; e$ m9 ~
// 禁用错误控制事件 r0 l9 r( q o) l4 N1 J# y+ l
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
8 N; }7 ~' ^) m) D- q& |1 s EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);3 k8 @, ~' K/ {9 {
" b* n. E; k# |% f# p
// 事件触发配置
# U- Z, Z- P7 U1 `8 u* w // 每三次事件发生产生中断
9 `! |7 K7 ?! R- m! ]1 J* Z EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
+ z$ e0 d& V; c7 N // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
; G& O" g: }# W/ u* {. ? EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);' v0 V3 c- |2 r- v) a p% f
// 使能中断
! z: S8 E; ?! q) k0 f EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);5 B6 a7 d4 n. K/ v, i: _
9 V. a7 E6 t* s( b! n // 禁用高精度子模块
/ q7 a) g/ f$ ~% Q4 N EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
' l2 g/ V! N5 O& l1 b4 L2 ^" C' c1 I- m$ w) M, s9 U9 L) h
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
: Q6 G# T& ~; P5 R}
6 \+ Z! p( ^. i) N3 V) G4 g0 s. e1 W# y' ]
void ChopperWaveform(void)% k) O0 {/ P: v5 I- M3 y* q
{
" u1 }) K2 d: {* M // 50% 占空比0 D$ s/ @8 {& T' J7 V, q$ o5 @
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
6 K' l1 [9 [' @8 }2 M // 4 分频
6 T8 h& A5 m( n, @ EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
" N% A) M* {6 i5 ]) y# L // 单个脉冲宽度
$ M- A" ?! x/ d F! A8 Q EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);% t$ C+ F% C2 s6 f8 [
// 使能斩波子模块
7 J+ J8 N# q7 r: O0 Y EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);6 o# ~' J0 I2 P- W/ J
}
( Z( y0 }# J: ]6 q+ g: s4 C( ` I2 Y, K9 M
/****************************************************************************/* W- ^6 K. W/ b' Q, X
/* */
n- I1 A& N5 Y, M/* PWM 中断初始化 */! c, a5 n1 l" L$ t! r; Q1 x0 w5 M
/* */" V7 s/ v- P2 `* |, m3 b' h
/****************************************************************************/
Y! d& x) h1 ]5 X' D- @3 hvoid PWMInterruptInit(void). X5 S7 ]9 Q9 x4 j2 Z! w
{0 M7 E" k: j$ P( b! W0 M
// 注册中断服务函数
2 O7 @$ Z$ R( V0 D+ E8 R IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);& @9 H6 q p- S1 A4 ] K4 I8 T
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
& w) x. U+ }6 v* K$ h/ Q5 H, \) s. T4 ]- ~
// 映射中断 [' `- U& L& D' q5 M( D% _
IntChannelSet(SYS_INT_EHRPWM1, 2);1 i9 M& \. |* |9 ]6 i
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);( w3 @) j Q; a$ Z& i, W
1 K% T2 L. ^( `" Z // 使能中断- f( a; L) |3 n+ u
IntSystemEnable(SYS_INT_EHRPWM1);
3 c, g' l3 j1 m! z IntSystemEnable(SYS_INT_EHRPWM1TZ);- B, F }1 D7 B" h
}/ E' b$ }! ]0 P- S8 s2 \2 j
; P2 \- R7 i) g; z/****************************************************************************/
! Z* C+ m, Z/ T( S6 c7 X1 P/ O/* */: R: ~2 k; C/ C: X
/* ARM 中断初始化 */* n( Y) p- F$ E6 I f
/* */
% c' i1 u f3 N+ R$ `2 R& |/****************************************************************************/. q$ Z7 j( q- _9 E# g; X
void InterruptInit(void) g5 H4 f0 }. Q; F7 B
{8 S/ o" N3 S" m# \; C t
// 初始化 ARM 中断控制器
+ R& K) e& F) I. Z9 v& t IntAINTCInit();
; Q* j7 z P$ w3 l! V' r9 d/ M3 @* v2 P. m9 P
// 使能 IRQ(CPSR)" f+ s* x1 J1 P! w; z
IntMasterIRQEnable();
3 T1 r. Q% o8 t
/ g1 U) T6 p# t3 J" [- Y9 a // 使能中断(AINTC GER)8 T& n! ^) {: y- g
IntGlobalEnable();6 w/ z, Q; _ Z) J8 E2 g M
: d* @6 u3 ?) h: _ // 使能中断(AINTC HIER)
+ K) x2 B# h- S' v IntIRQEnable();
$ N! i2 p# q7 d& W2 n1 b4 Y9 M}2 j# `% `' X& A, m. u2 h3 N
) Y3 D; h# u9 N$ |! w% ?; M8 |
|
|