|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/+ B/ g' n8 ~8 y% Z
/* */ l( k {, |! j; x) I# c* s1 C2 ]: k
/* 宏定义 */4 M. ?2 g5 }) h3 H0 B6 I
/* */- `( d5 I2 p! ]/ \' h4 c
/****************************************************************************/# v! n- K# l9 ]3 Q$ J) T" z$ O
// 软件断点
& D6 N& V4 K* \: o7 b* d h7 V% T#define SW_BREAKPOINT asm(" SWBP 0 ");: f3 c/ d i; o" T! o
/ b. v# n5 Q3 J+ [- ^* X
// 时钟分频
) A5 c5 T$ R' M1 K#define CLOCK_DIV_VAL 228: A, @, y9 D. a% [* R) |$ F
# @1 |5 V6 E* p1 c( n/****************************************************************************/2 g) m0 L# N+ t9 V' U: \
/* */
( g* b8 Q2 g. G& z9 l' U, g/* 全局变量 */) K7 Q' n6 O, G4 A
/* */+ D8 z& y/ f8 f+ |, L' G& p
/****************************************************************************/8 b7 R7 K$ m. t
ECAPCONTEXT ECAPResult;2 \2 m# Z6 ]5 g" n: H
! Z+ I4 } M" g
/****************************************************************************/
) Y- s9 d2 u7 ^. ]9 Z/* */
2 z& c' J0 U# ^5 f/* 函数声明 */
, Y5 n; u# S& R2 W/* */( X! u! {+ U# Z; r
/****************************************************************************/! ~* }5 G8 d! K. G
// 外设使能配置9 U! v6 x7 z0 Z# B+ w) p
void PSCInit(void);
3 V: N7 r6 `/ [% q" E, k0 R1 i
9 o0 b, r+ w, _; s% d. u* N// GPIO 管脚复用配置
1 T9 L7 a) R/ _6 U' k9 @, m: bvoid GPIOBankPinMuxSet();
0 q4 A" \6 y" @# O1 r ]
+ {- E& U2 e3 C3 L// 产生波形
% [* b* H! `9 y4 j3 \) @6 A8 fvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
9 K |, R% X9 }9 r- s" {& {; yvoid ChopperWaveform(void);
/ Z- E4 i3 A1 ~" W5 t" D1 b7 S k9 K' }: E, x; H9 @
// ECAP初始化和读函数9 a1 z0 W2 P+ v. [" T( j1 I
void ECAPInit(void);
; v. w4 T, [# v& s' R& @- H. w! Zunsigned int ECAPRead(void);
9 |: P ~1 L! z! E/ L$ H6 X( b
1 V' a' M+ t, O2 {1 H2 b//ARM 中断初始化7 t Y- e9 t0 A, P7 ]/ }
void InterruptInit(void);! j4 s: H" S& ]7 V" v1 `
& u5 h4 s ]. g; }
// PWM 中断初始化( f6 O0 b$ i3 C: p5 q+ w ]# v
void PWMInterruptInit(void);0 u" T% `! I" p* o
// 中断服务函数
" l2 k* |: {( u// PWM 事件( B2 {- Y* ~9 }
void PWMEventIsr(void);6 k2 ]5 b+ g- o+ C3 B8 o7 a
// PWM 错误控制事件0 w, Z; [& F0 `* d* b
void PWMTZIsr(void);( O( @7 ], W7 ]
) U) m$ t6 [( d( r/ U; r/****************************************************************************/
8 R- N* @6 T. s* p1 Y# K/* */ L$ N& q ]# s0 q4 W9 O g. A
/* 主函数 */0 d: g8 g3 Z, c$ B- x1 a
/* */
) K! R: T# U6 `& A; C8 _& q/****************************************************************************/
1 u6 H* A3 d' }" j8 Yint main(void)& c2 P, d1 B& x* S4 A0 u2 q
{
9 `( C4 v4 b2 k7 B9 y. E( Y // 外设使能配置9 [, t2 A; |% F X, E
PSCInit();
" T9 M6 W W9 h7 k" x/ e, k7 |" y/ F
// 初始化串口终端 使用串口2) n8 e7 H- A [% I# g" _7 D
UARTStdioInit();' ^0 z8 C. R/ {. ~1 y% [
p6 u8 Q- e& \
// GPIO 管脚复用配置3 g4 [6 ]' ] [4 B. Q" }" m
GPIOBankPinMuxSet();3 C4 g% \+ t- _4 ?. Q/ K8 a
0 y/ S3 `7 Y" b4 y; u% v // ARM 中断初始化
! P. M7 {2 A; b% X4 @4 d InterruptInit();
" ~3 L* ?4 o% T9 k9 b+ I: B; i, I1 E" d2 q7 ` q. {/ e8 _
// PWM 中断初始化
; j) H# q6 e9 q( f# U PWMInterruptInit();2 g; f! v' d2 t
3 z) {2 N1 D; Z4 k! s unsigned char i;/ ~& N) w0 @2 b: a: w8 \; {2 a
unsigned int j;2 {# Z$ B" {/ r& \, w8 l
3 k8 y- ]& O, z6 p5 E
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
; K5 n* m6 q: E: D7 F* J UARTPuts("------------------------------------------------------------\r\n", -1);
1 d5 ^* l; j. v: r0 U. j- J UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
0 e; ~; Y0 `! E; g // 产生波形
% q" @& [' j8 D7 J1 Q# M) ]3 V PWM1ABasic(25000,50);
; J$ E& U8 O, ?% U8 \, D0 _8 f% G, ^. T/ S
UARTPuts(" C6748 PWM Test Over!\r\n",-1);! N* n L% r+ H$ g1 D/ z4 u
UARTPuts("------------------------------------------------------------\r\n", -1);8 a1 z5 ]( T7 J& c* K$ l
) l# L9 Q5 b* l& p. ~; n0 B. J6 e' @& t/ Z l$ b! w7 W$ ?
8 x" p2 f x4 B
UARTPuts("------------------------------------------------------------\r\n", -1);% `4 S5 G) D ?& g1 I# o* V- [% ^
UARTPuts(" C6748 ECAP Test\r\n", -1);
" g9 ^( m8 [1 y // ECAP 捕获初始化" M( D! S2 h. Z& g: F
ECAPInit();
+ e: M' ^8 i6 b/ J* j UARTPuts("Initialize ECAP.......\r\n",-1);
6 q! D: o- S8 J7 `. f& X% h9 x& z for(i=0;i<5;i++)2 O! h, u3 _7 T& B( B4 W
{6 C/ g- `0 J. A* a C8 z( \" u
for(j=0x00FFFFFF;j>0;j--); // 延时$ R) d2 Y p; _( g
ECAPRead();9 a: h: S7 S7 b0 V
}/ ]0 n3 y! \2 X& I$ S2 A8 _6 j
UARTPuts("\r\n",-1);
, O& A( R: K% j) D UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
# A* Q3 Z" |; r% R: m UARTPuts("------------------------------------------------------------\r\n", -1);
: y' }% n9 C5 V' u) U6 n; H, L, u1 a2 A. y
// 主循环/ ? t+ o4 M- ~2 @# C2 @
for(;;)6 L& g, b {$ H, U, [
{
* M; ~* B; p: ~, {1 y6 ^: o) K) a# b" \8 H! Q
}( L, n) c6 {/ } q/ b
}
1 w0 ]( X3 `/ Q; Z* M
0 @7 W- W; [5 e& C% `" o! G/****************************************************************************/
. ~( n/ f; P2 M7 _( S0 q+ k0 Q/* */+ e s# j# L! y: j5 I
/* PSC 初始化 */! I+ F' p0 R: \/ C8 t' J
/* */
( P: f( \1 T5 F1 T; q. J6 p5 y/****************************************************************************/
3 {* Y! J; ?% [# s* E1 xvoid PSCInit(void)1 r) a; [4 s4 v
{" Y# P+ {0 G' k7 ^
// 使能 EHRPWM 和 ECAP 模块
! b, L4 \1 ~! _5 f e8 j // 对相应外设模块的使能也可以在 BootLoader 中完成
) L* _) p9 e6 A# N3 P( Y PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);9 t: B, J3 J3 h) V2 D
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* [/ \8 _3 B: O}
6 p+ V/ g" u2 p
5 k9 G& O( i3 Y! R/****************************************************************************/
/ z7 S$ X: Z7 _$ e S/* */. X% g9 H8 a' T
/* GPIO 管脚复用配置 */# t2 z) @, @8 i I* P- k3 P
/* */' _6 Q% F0 q3 ~" j: B
/****************************************************************************/
! n! S8 d4 A/ J hvoid GPIOBankPinMuxSet(void)
/ A/ ^- g. \ ~9 I6 F{
5 p) \9 n$ n' H! m* z8 J EHRPWM1PinMuxSetup();' @5 x# m% y/ x, U7 `
8 y# b' W) |3 s o g // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP): M/ C" |' K& Y2 _0 l
// 作为捕获功能时管脚方向为输入
) E1 z" w* t; D2 E // 作为辅助脉宽调制时管脚方向为输出
9 t# c, d% ~. ^/ v // ECAP2 / APWM2
% J) w* j8 d" _3 | ECAPPinMuxSetup(2);
7 V& `) _$ w6 `; U! b4 h
2 g( L* k% ^, U0 e0 [0 Q* d6 s // ECAP2 / APWM2方向设置为输入
4 Q+ I! e% d; T4 p0 @ GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]1 M' U6 u- F8 ^: ` E$ Y5 K* c, ]
}& }: H5 ~9 `) g
: s. a2 W9 H! s- v6 A/ @( g% [0 r4 o/****************************************************************************/
A, D$ O. [# ~8 o/* */5 i, k2 h; R% e) O; i$ [% Y$ X
/* PWM 输出波形 */9 ?! U6 Y4 J |4 x; S
/* */
) O; i5 i- |/ ^5 F/****************************************************************************/. ~+ o9 Z8 q7 V: X2 f6 e
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)- a3 a& ]6 p- R& {
{% \' y: P/ E. R1 O( f$ a' S
// 时间基准配置
5 Y/ T" c& I2 c) [6 r( F // 时钟配置+ z, Z" U. H& |# @. ~5 l
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
1 R- f3 ~/ x% p; L6 }. e$ }9 w1 V/ O6 c0 Z
// 配置周期
5 N7 o5 b5 i+ J: E2 a3 }1 y! e- N EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
. ]5 p2 j7 P) f4 g0 ~' f pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
8 k& T0 i5 O5 t N
7 t5 J3 q1 E' \+ I5 \2 P& Z // 禁用输入同步信号
. Q) ^( T( o& V. g$ ~1 S- c EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);( o) l9 P" b+ z
" N( O" n- u) q1 k% j // 禁用输出同步信号
; N2 K0 C% B# t! o) \2 e& Z EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);6 `# Z0 U* i- c
. j6 V* U) G; Q/ U E6 B1 _; ~) U$ z // 仿真(DEBUG)模式行为配置# `0 A/ z1 w2 v/ N: n
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
9 V1 b9 l/ h5 C
- x9 h$ ~4 _! }5 t1 u" I" d // 配置计数比较器子模块
" n/ S2 p3 [5 Y // 加载比较器 A 值
0 j- ^( E7 b- h; Q2 i) R EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
: p3 y; N* j8 U+ U EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
& C+ ^$ I" y! o# P9 w$ u: P% ^
# V/ n0 X) ?/ U) ]( t // 加载比较器 B 值
; k* X' Y6 a: S2 H3 H8 b$ H) T- c EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,4 V$ {3 }$ |& Y4 `; I
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' j' A4 T+ a( G2 f1 f
0 S' j( Y- Z" q# c' a0 f // 功能限定配置(输出引脚触发方式设定) ] \. y% K: R) t0 e
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出% b2 {) e8 A8 u' p' G
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,. R5 p2 R1 y. N8 F/ \1 g
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
9 V+ B& b+ e$ Y7 m# c) T EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
$ e5 I; C2 }! }$ [" i* f
. j) u; ^, b* d5 H S // 禁用(旁路,信号直接输出到斩波子模块)死区模块
1 f1 q8 ^ }" t, N4 w7 z EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);6 E) H0 X7 ]5 f5 [; U0 O9 ? S
: i" {! ^5 x' N
// 禁用斩波子模块
3 n* g8 B2 |1 A EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);- V9 ?/ Z: M5 I2 E
# a6 X! J4 s# S* c+ j F
// 禁用错误控制事件
3 g1 Y. M: Z: {- S: u; S1 w' A' c7 c EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
# t! d6 Z! l6 a, Y! a0 b7 M EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
! Q0 ]- f- @9 q6 a
/ @& N3 N$ [. }! g* \; P8 W3 _ // 事件触发配置2 z0 b0 _0 K* f" h9 Z; y5 d
// 每三次事件发生产生中断
3 ?( H9 L0 U/ g. u6 n4 d EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
- F9 k7 |$ d. {* u6 N5 M // 时间基准计数等于有效计数比较寄存器 B 值 产生事件! {2 h, N! Y. h# {7 g! B
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
2 ?1 s' c+ a8 V' x: y& | // 使能中断
4 v: }% f9 U- e# d5 m `1 | EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
- i% F% I1 u+ \6 I y2 ?+ ?8 |. D: C( V( f0 _! g4 N: u9 L" j
// 禁用高精度子模块" ?( g9 E3 J* }+ a9 X0 w
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
5 E3 D& @6 P8 W I* @. ^
p/ i5 i+ g6 j) p& m UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
! p( S* c8 a- M+ O7 q}
: [6 W& z1 _. |5 {5 H6 X! h% S1 K- S- @- m
void ChopperWaveform(void)
* U. {# S4 V' [. O, j{ X% ^) Z0 W6 G3 X* `; W+ {
// 50% 占空比8 b4 l( Y o. W) \$ O5 X4 g5 Y9 r
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
, z# ?" ~" b% k" S/ Q; ?! n // 4 分频/ e- F* [- k L0 u9 X
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
+ ^( u, C7 G) `& T3 y! [- D3 \ // 单个脉冲宽度
+ {8 k! g, h1 q3 {( Z EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);; B! w' ~$ Z& ^: Z
// 使能斩波子模块
3 G7 m9 z- ?1 X5 A8 [+ |& C EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
1 f7 L# R+ J. U3 |1 E( f% ~0 w}9 a4 [/ w* r/ N. c; `0 u& N
0 k P9 ? V- y7 l
/****************************************************************************/0 ]+ V* h1 d! {$ u$ `9 m
/* */
0 F8 M) `4 V# W8 _' S6 J5 _/* PWM 中断初始化 */
; l+ F' `: x L9 j2 H4 i) V/* */. Q" U) B5 U0 A4 d& P
/****************************************************************************/
7 I" ^* u; S- cvoid PWMInterruptInit(void)9 q8 T" O8 b( X9 b% o9 V6 M
{
. x. p, L4 }- w) b7 m" y // 注册中断服务函数
7 b8 I- f W/ { IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; g9 @ _; c+ M, O IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% n% }: s3 C' ]/ W/ L# ?4 c! H6 U; h& D- |, I/ A
// 映射中断
; A4 p% z: P* _ IntChannelSet(SYS_INT_EHRPWM1, 2);
, a' g0 W! l3 J/ ~( H! g IntChannelSet(SYS_INT_EHRPWM1TZ, 3);9 T2 J! U) Z/ w; R
4 M: H$ G2 G/ J2 J8 e0 |% h4 C) @ // 使能中断
3 \7 B2 M, a8 ^) h IntSystemEnable(SYS_INT_EHRPWM1);
& D; t9 d2 b8 ~- Z4 Z3 y IntSystemEnable(SYS_INT_EHRPWM1TZ);4 M3 {1 j" z6 A
}5 Y4 T" r" Q4 S- C6 R5 F8 S" E' m
/ w @% m6 s, y
/****************************************************************************/8 `) G: I( d; @1 {1 m* o- F. W
/* */. k0 u* |& o4 _* Y3 j4 V' [ e! Y
/* ARM 中断初始化 */; g- N# L: h' J4 z& y- o# Y5 B
/* */
+ d% g% b- n! S0 W+ S9 ]; M/****************************************************************************/) T$ D* m u6 z( V& p5 E
void InterruptInit(void)# A# B( i1 ]+ Y( d
{
6 [9 ?, Q* c S4 j5 ^1 f // 初始化 ARM 中断控制器
' q; S1 L8 k1 P3 |& m2 ? IntAINTCInit();
' a# p9 N- W7 o+ | A4 ?0 }* p0 H) T4 {- h1 L* W; m: e0 K2 Q
// 使能 IRQ(CPSR)+ R& J( c c: D$ p6 W6 a
IntMasterIRQEnable();
+ H% c+ {9 h+ x. O8 j9 _% L* f
5 O" C: U9 }, ]5 m, z7 p // 使能中断(AINTC GER)
' E0 \, q! V) R0 o3 t( ] IntGlobalEnable();% J: j% }* z- G; I8 g/ L! ?3 G
7 C4 a$ |: Z1 T7 [ // 使能中断(AINTC HIER)
0 t# \/ j: H0 \# I0 w' L IntIRQEnable();! y$ B. k, [; T8 q; v V
}: s1 F4 b1 j! K2 e5 x! P. l& q
. B% e8 o |. H# T
|
|