|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/, a' N4 ~8 P& q* R! f
/* */) r1 A$ K. J6 d
/* 宏定义 */' _ y+ I E& X2 N6 Z# ]
/* */
3 e9 o9 K# r' \ }- c/****************************************************************************/
. Z8 M! L6 O/ J7 X |& S: X// 软件断点
6 J9 n% A1 R3 @0 E: I! ^4 A9 @#define SW_BREAKPOINT asm(" SWBP 0 ");
6 J8 a& H, q( ?8 H
* w) X$ M3 r1 G! S( [) i& t// 时钟分频
9 ^, M7 j& H) T#define CLOCK_DIV_VAL 228
& D( N) f, R" \* X( e* r5 N) D. a2 l5 Z6 s6 z' V5 A, c
/****************************************************************************// m& u4 G" B e- S# E* O% ~5 x
/* */
+ b- S( T W, W- y+ \/* 全局变量 */
: s+ t" ~1 I) U( M3 f/* */
/ L& Y4 u8 A' p l5 l/****************************************************************************/
3 i7 ` _7 g0 F1 H9 d G* a: C, JECAPCONTEXT ECAPResult;
. @! U$ L" R+ }' {- \" B# g# O# m7 ?- z" [) y8 V& b. G
/****************************************************************************/
# N# ]3 n$ t, V/* */
f# v5 @) _% T& U0 x7 R. m/* 函数声明 */& r' [( A0 r1 M" I x
/* */
6 a1 V+ b8 H9 \2 W8 q& B6 y3 \2 h/****************************************************************************/
3 F3 j& R/ M7 Z// 外设使能配置6 O& u; b6 J% u; ]( u; T- ?2 r$ b! B
void PSCInit(void);
. q% c5 I# \( U, `8 J- ^# Y
2 @. R6 j3 r8 h' e; K// GPIO 管脚复用配置
4 U" j$ Y" k5 D- k( q$ m5 Lvoid GPIOBankPinMuxSet();: G% [$ P9 v4 j
4 T$ k8 B8 R" o; h& y1 b// 产生波形
* k5 T6 Q6 X) L. c$ R0 fvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);. \, n! E4 l6 _* v- j2 {, u, x
void ChopperWaveform(void);% R' A: X& G* z, p& F: R# T
4 i0 c2 q8 s: R. V* U" {- J6 Q// ECAP初始化和读函数, F9 u' V( p6 E$ l! A
void ECAPInit(void);
! q) e( D# M4 d5 ?* g8 y. V# xunsigned int ECAPRead(void);4 g& h5 R* i& f) f6 }, P+ X/ Q. ^
% a! U$ d G% U
//ARM 中断初始化2 M$ l* I5 P( r* d; r7 S
void InterruptInit(void); e. q* P; d* m. |) _3 r9 B
" i" {2 p/ O- ]: _1 _9 o( ~! u! U; }
// PWM 中断初始化/ d8 ]) s9 a4 K) T1 @
void PWMInterruptInit(void);# P+ C1 s, S$ H7 k
// 中断服务函数
: |5 Q/ }- v: \: J2 a# R$ A8 f// PWM 事件
8 p# ?9 ?5 H: H) |void PWMEventIsr(void);) C( P* B d" {$ n: ]
// PWM 错误控制事件, `; `$ E# u, H8 \ z2 O
void PWMTZIsr(void);
: O8 R) D0 G: p% N7 O g% ]% N( L" N; N2 r
/****************************************************************************/
6 z8 f3 o# U& v3 J6 M. Y/ V/* */8 E+ _: U2 @& g9 x. l
/* 主函数 */) S, x1 P6 o/ I) f/ ?
/* */- ?2 m$ Q; Y8 G9 }/ [* ]! ?
/****************************************************************************/
2 I5 A" U5 H k& d* Dint main(void)
0 k' I P+ {' Z, Y# }{
( E, @2 D7 o, d% [ // 外设使能配置) b8 Z- j7 M* ?# B
PSCInit();0 b5 L; W- p# m J& D0 F
$ `1 [* ^1 X% ^+ m
// 初始化串口终端 使用串口2% T s, K* Y& q$ t
UARTStdioInit();
8 s# P+ G5 H) C7 o 0 M7 c! }5 X- x& A3 u* r0 x
// GPIO 管脚复用配置- }8 y ~, p4 M. l7 X' c, U6 E
GPIOBankPinMuxSet();
, r5 G$ N4 V4 q# H% K: }: r1 ^: }& @6 F- d4 q+ b
// ARM 中断初始化
# ?6 E" A# X4 w5 ^4 _5 j5 Z" I- ] InterruptInit();( i5 X6 b! W( ?. u
3 a0 K# k8 ]$ b1 J9 }5 q. L* }
// PWM 中断初始化1 _- O. J! O; \* E! q/ {% [0 T6 N
PWMInterruptInit();
% r0 x+ g4 n5 ^6 B
0 t" t+ `( V8 c! y; Q7 }7 x unsigned char i;
! K. [. [) w8 h# J3 L8 I unsigned int j;
7 ?7 E/ V9 H& K6 q2 {( _+ y- @3 c2 G# `
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);7 u4 @! A% ^& }7 W6 H5 H+ G1 J) r
UARTPuts("------------------------------------------------------------\r\n", -1);
! r8 F2 c6 t, G/ L UARTPuts(" C6748 PWM Test\r\n\r\n", -1);: g0 u/ z' k9 O: y
// 产生波形* C# X* d/ Q9 Y# p1 V8 P7 k5 v
PWM1ABasic(25000,50);6 L4 E" f) c5 w4 }1 @4 c# o) C
1 l) R5 ]1 y' p4 T3 D4 V, ~! } UARTPuts(" C6748 PWM Test Over!\r\n",-1);4 A3 G+ e$ D; Z5 X6 o
UARTPuts("------------------------------------------------------------\r\n", -1);
/ `) U1 L& R6 d; q9 [" G; [
) H% X2 r8 T" N0 O" M' E6 O9 s3 m* d2 Y, n$ W: i
9 h( s$ Y i) S* C; C
UARTPuts("------------------------------------------------------------\r\n", -1);- ~) o. G$ L! T Q
UARTPuts(" C6748 ECAP Test\r\n", -1);
* c D! X5 Q7 {, l) B( F: Q8 C // ECAP 捕获初始化6 j1 W, L* t; t
ECAPInit();- O5 f+ H% x9 `' j1 L7 d
UARTPuts("Initialize ECAP.......\r\n",-1);5 |$ E: t- T( h- u" b0 r
for(i=0;i<5;i++)6 s" @' a, K' K. |
{
7 j. S( |6 h P0 a for(j=0x00FFFFFF;j>0;j--); // 延时. r9 Y$ ]7 {# S" D* j
ECAPRead();# J/ [: p4 A+ h+ U+ [7 r
}
[7 ]1 n( l. R- }7 O UARTPuts("\r\n",-1);3 V5 F: N8 @8 X! E( [- `" b/ @
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
' b$ t6 e% A' }# p9 h4 i) ~# o$ `: s UARTPuts("------------------------------------------------------------\r\n", -1);
0 Z9 e8 n; I/ }2 K) K `' T& T, r8 c6 q; X, s( L: ?
// 主循环
- C4 p) @/ w% h: A! \1 _& C$ O for(;;)
; h7 `2 t* i2 |3 v# \ {
6 S/ P# P t4 K& _; n B0 C5 ?4 l# P4 C8 p
}7 E K" w! L* }6 n& F( u/ M
}
# v$ Y5 p, `1 F$ L; @. P/ p* G0 p0 ^9 J! ^
/****************************************************************************/* X% P6 R8 L( O0 ?8 ?' n0 w
/* */
}4 H( }7 v J, z% A# `/* PSC 初始化 */
8 B, U( p D0 |/* */& P2 x V. `% z" g% K) m
/****************************************************************************/
$ |6 `) `# l7 p! i4 d7 Ovoid PSCInit(void)5 i! o& ~1 i5 m7 E. w
{
1 q) [5 b4 v9 T2 K. V6 U7 t9 B // 使能 EHRPWM 和 ECAP 模块* ]; W, O4 j& L
// 对相应外设模块的使能也可以在 BootLoader 中完成4 T0 N! k6 U, j% l1 j- P: O
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);& Y6 _( o0 D0 l5 M% L& S* b
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
8 w0 [1 X# s# Y+ C; V}
/ Z: y/ G7 Z' a; r2 |+ V
( f2 {5 W, P0 [9 W c/****************************************************************************/7 F# A. T2 C8 @1 {, ]
/* */' [2 S& D& V$ q0 [' R- @, V
/* GPIO 管脚复用配置 */
5 d7 N% y3 |( X. r% K: [! J/ \/* */
( P" Z/ p$ ?- [8 I4 W* g/****************************************************************************/1 |! g9 x( _7 P, k, J% a- l8 T
void GPIOBankPinMuxSet(void)8 h+ }2 E; o2 u. ~
{
9 }4 z1 G5 o; |4 ?' o EHRPWM1PinMuxSetup();
0 H* j3 X: E+ Z1 l
3 b0 K' H( F" d% T7 j! ^7 } // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
* N1 Q& K$ c% H0 ^/ d0 L! K // 作为捕获功能时管脚方向为输入
. ^3 \& H K- b4 J ?' }. b // 作为辅助脉宽调制时管脚方向为输出
& J# Y" L; i0 m // ECAP2 / APWM2
' q; `# F+ w/ q( j5 ?, G6 o) {& d& P ECAPPinMuxSetup(2);
) @5 E' D- I/ O2 }$ o5 M1 ~1 n6 E8 Q9 N6 K4 R, J
// ECAP2 / APWM2方向设置为输入# `# l$ D/ @- }1 l/ ^
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
! L! F- }' \' T7 z' U}, O9 O, P3 m4 A8 {' f0 F# I* A$ b
Q3 k) C/ [! V5 ? ]" `8 ?/****************************************************************************/2 f, X0 v2 U' U) N, j' C
/* */1 Z( w! l2 [0 |- ~! J/ i$ ^
/* PWM 输出波形 */
. r& u- d/ P9 H" B/* */
2 s# S: A/ q0 _& n' D, ]& f/****************************************************************************/
% E: I) T2 c6 S( ^' F% z2 z3 J, Svoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)7 |+ ]) v! G# {& M( |0 N
{
' l4 s5 E2 D4 | g/ P // 时间基准配置
7 R' z# M* s* g' } // 时钟配置* `2 \6 O! Z$ x
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);. R, s* t+ `. d/ a0 P' x
( A* @( l9 `8 j" L/ M. V! y // 配置周期0 a2 B; n6 l& X- F8 [
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
: ~# d/ ^. P, {3 X pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
+ \( N; h. w7 q5 g2 A/ V6 { v
% I* _- t" A$ {, G // 禁用输入同步信号
/ i' B" A. I0 Q, G* c EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
. U2 R5 c8 I6 G4 p. e* o2 i* @. V. R* C( f5 e1 {7 ]3 H; G) u5 t
// 禁用输出同步信号
' T5 Q5 M# N% r2 Z EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
! w( K+ a/ j1 _& w4 {) c1 y
( {% L/ I( s2 [7 _+ U) e, ^9 a // 仿真(DEBUG)模式行为配置
" N# s& T: c) W$ V! \ EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
; W: v9 O+ L) m& U$ M
4 H/ S& M* I: g0 f // 配置计数比较器子模块
* u7 B. ~4 j7 A" }0 T // 加载比较器 A 值; `* x/ `4 s- P$ ]6 e, Z5 k# T _3 P3 a" _
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
E# `7 f) O- M, n+ d' j e1 D9 W" g6 S& N EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' R. Q. K% R% o- Q' E# N9 E l- ]# ^# n) z3 i6 z7 |
// 加载比较器 B 值
" T9 h. m1 E+ T* r) L; | m EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,' m! ?7 {' I1 z
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
0 q X4 R2 t. u. _) f. k$ }
; u% ^3 a% e6 c0 @ z9 r7 q/ L // 功能限定配置(输出引脚触发方式设定)! v' s: a7 ]5 `3 H% j
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
* P0 w$ W! Z. R- E EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,- A: J; ?5 ?$ S" B+ f; l
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
5 x4 p, }+ @4 p7 K+ ~$ B y EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);: ?. P* e6 v2 D* E8 O# e0 i
0 p+ E$ i! o/ o6 C) R4 p8 [" G( c // 禁用(旁路,信号直接输出到斩波子模块)死区模块
2 b; V8 W9 L4 z EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
# Q9 K9 P8 t9 A! s$ l& R1 u3 h- d: }1 E! ~; O- g
// 禁用斩波子模块1 n' y! Q2 S" T7 f% r& h3 Y' y
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS); t! T5 r3 |) P: j* B- G/ {
! C0 K; n. b* b$ K4 M2 B# e3 U; G
// 禁用错误控制事件5 u* _# O; ~( {* ?) @3 E! u. n
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);1 N# L7 ?! |, N7 _& A
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
) D! F) O7 I- p7 s3 k3 |3 c, a
// 事件触发配置
: R; n2 [0 ?0 w0 F" }: {* h4 E // 每三次事件发生产生中断
& U- `. Y# Z. G- y7 t EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);# A/ Q" a8 W. c7 e- J* X& l
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件' m+ U }# Y; E( W# D7 q! Z; I
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);; }2 o4 |4 v3 {) G7 m
// 使能中断6 z4 Y- r2 r4 }3 H Y0 c% |
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);$ Y4 N. A& T$ b5 Z
, F3 ]; L9 _1 u s; c
// 禁用高精度子模块
4 T# \8 W. m8 r! t2 g% x2 l8 Q EHRPWMHRDisable(SOC_EHRPWM_1_REGS);2 C/ i( T8 M7 I+ A$ x9 B
/ Q g ~/ {4 J6 A! X; T
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);, g& ^$ |0 F' r- @8 H# R
} _' a" [; P1 H1 s! `8 B
' B" Z, Y' @2 S2 w5 \7 U: p
void ChopperWaveform(void)
8 b6 X( I0 e1 `$ M4 D' s{
; r% ?0 u* E8 P* W4 m0 w // 50% 占空比& V3 c4 }$ r% {9 B! ^0 U
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);% j1 w: G( s/ R: p a& P2 [
// 4 分频
) F+ W7 Y$ \7 z/ B" y8 L6 u" Z EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
/ B1 \6 e2 `) K) `. L // 单个脉冲宽度4 o& \0 E2 ~+ r3 p% p
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);9 Z! W Z8 y* J! p" f5 n1 J
// 使能斩波子模块5 u; J# S7 {: X. f0 C
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
; O* a+ j2 q1 y% h8 v6 [}
X5 x" z+ y4 w; _
$ b8 M0 p n" _5 P' i/****************************************************************************/
. G( i3 Y. M8 [ H' ]& ~! k/* */2 R8 _* u7 t! j; g7 h2 L/ P
/* PWM 中断初始化 */% l1 M- S/ v" e# u2 ]! K
/* */
, L$ m3 C/ c- g! @+ c/****************************************************************************/+ h7 `& F0 {( C- W7 C! H/ \
void PWMInterruptInit(void)& o8 I0 Q. t! f* d3 z$ S
{3 n3 m4 t. \* \$ m0 d2 B' B5 X
// 注册中断服务函数+ Z9 ^& z" _' o8 i' N, q
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
4 U; X Z7 Y6 T( I2 { IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);; [/ t" |. S) E8 y/ h" P7 O
3 E/ d1 [% P6 w9 l
// 映射中断
4 M- h+ L$ w! y4 a* Q IntChannelSet(SYS_INT_EHRPWM1, 2);% H( C7 B3 ], M( Q z/ |
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
% w. E- j5 C8 Z+ t6 V8 }5 T V& h
* d) @# N8 {9 t, }/ S) k // 使能中断
! [& B. L5 r. N9 X/ c, R IntSystemEnable(SYS_INT_EHRPWM1);( L- V0 E/ Z) h, J) L
IntSystemEnable(SYS_INT_EHRPWM1TZ);
# e' J+ C' ?1 i. N4 c( w: a, n}
) C# S& E$ K9 w+ A2 e$ q, I6 `3 v6 i* f- N0 K1 t
/****************************************************************************/
4 I0 n2 _# a8 X3 j- q) o7 b/* */
$ a: d, f8 Y7 l2 u* m8 X, F/* ARM 中断初始化 */
& u$ Q$ V7 s% m- v9 p. L) C0 K! p/* */# z9 w/ b1 W" n' b; D
/****************************************************************************/# }, U8 N- J+ I& k/ k3 x# w: P$ l$ j
void InterruptInit(void)
3 H) X% u7 N0 f( K{7 x" F6 T+ h# e% C0 j$ _
// 初始化 ARM 中断控制器
. G, M2 L0 @1 w" J% k IntAINTCInit();
. i u$ q0 g% F2 ^& T% \7 t$ J& Y6 t w2 L. ]# b' ] d
// 使能 IRQ(CPSR)
+ g' Q" N( Q% Y7 l _3 k# X IntMasterIRQEnable();
0 N$ g4 n! g* s$ p
% K4 ^; O+ G" L2 r // 使能中断(AINTC GER)
" N: d9 F" u! }6 p IntGlobalEnable();
0 t# u; W7 Q2 C
% b) i' M, U/ V3 f // 使能中断(AINTC HIER)
- I' q0 d! {, P2 _7 D$ {; d7 o IntIRQEnable();0 ?- W9 t* a9 w. S
}
; ?. X# ]7 N+ r# F
" |' [: b% a0 @ |
|