|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
4 d* q( S7 F+ c: M5 h; Z% F, E, L/* */
4 q% G7 t! N0 j! E9 C# n( V/* 宏定义 *// Y/ {/ r! r/ }1 M
/* */
5 ~% C" h' h! w9 J- m/ s/****************************************************************************/' D) F7 q9 B. r" v1 u6 t
// 软件断点
' ~6 q1 E$ \7 n+ j, m" B1 G- D#define SW_BREAKPOINT asm(" SWBP 0 ");
; r7 v% s6 J" t7 E$ l3 T; X; ~" P
// 时钟分频
7 d. R3 y3 Q+ k#define CLOCK_DIV_VAL 2283 j/ ^) M8 e; U1 `/ j: R+ H
- w4 z# D3 ?9 K; A# z
/****************************************************************************/
( _! H: X$ a9 I2 g. ]2 W6 Z, l/* */
; s4 ~* Y$ s/ w1 \/* 全局变量 */+ @3 K! Y' \% X1 G' \ F
/* */; M2 @4 H4 q8 d5 x5 u
/****************************************************************************/+ a- y' q1 F6 l0 d, I5 j9 Y
ECAPCONTEXT ECAPResult;
; S) w0 T+ x3 `0 d6 r& Z1 K' m+ l9 N7 R
0 V. f: p8 F+ D; f3 J( T5 c/****************************************************************************/, L- K2 x1 e' z4 Y4 j1 A
/* */9 a6 A8 I! r3 M
/* 函数声明 */
! _2 ]8 ]% o* a) x6 {/* */
% F7 m8 V, M; e- T/****************************************************************************/& @2 ?9 c8 P, q K. n& V
// 外设使能配置; Z( t; H3 f7 B3 f1 o
void PSCInit(void);4 R. T. `5 q' a- p
6 j2 _+ T; a& E) H5 Y% j
// GPIO 管脚复用配置# x6 l+ P* j7 ^
void GPIOBankPinMuxSet();
9 p. Z6 D- V7 J( W8 ] `8 t: ~: A7 j! f1 ]+ ?' A3 o
// 产生波形7 d6 f0 J1 U* C
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
. j% R: y Q& O9 t7 [9 l8 }void ChopperWaveform(void);
; `1 B* B4 t! X: S) M# s6 |4 h+ r4 b; P( A' B4 G, g. Q4 H
// ECAP初始化和读函数
' e- M) f3 g, H+ c2 l/ w0 qvoid ECAPInit(void);5 y2 G. O, Y) n [. Y
unsigned int ECAPRead(void);- T( H" S, G4 n8 n; D
& W) N& R* ~# G5 ~" A//ARM 中断初始化% f. R# w1 b9 @+ c, o
void InterruptInit(void);
/ d: J( n$ |' t [5 y; P6 w' @/ C- \) N, |& G+ R2 H, b) y* b) y
// PWM 中断初始化8 ]3 I0 r2 n9 V/ O: \2 W/ T
void PWMInterruptInit(void);( a% X" G9 r8 ^! `9 t0 m
// 中断服务函数
" I. T) { P7 v3 [: Z// PWM 事件
, |- m! k0 c7 w% d! ]void PWMEventIsr(void);
2 b/ Y2 [5 H7 x// PWM 错误控制事件- B+ h% {5 O( o
void PWMTZIsr(void);
; [9 l; O6 T$ H: w( p! u. q! c0 X5 d- I
/****************************************************************************/2 |0 z( A4 U& W
/* */: m/ O: Z9 u1 k1 p* |$ p" ]
/* 主函数 */) C4 b9 U1 `9 w! b( f* ?
/* */
, n5 o' G6 s- N5 b) k9 u/****************************************************************************/% @7 K& @0 ~3 ]6 O' Y4 t; R
int main(void)3 C- T( P" m' U7 b) m) M, }, Y
{
( P% H7 O* h& U // 外设使能配置/ ]' Q. Q! C+ L O. b! {4 o2 G
PSCInit();7 k* H& q$ S+ O' V/ X6 b U
2 N5 L- ]5 z( L& M& r& _ // 初始化串口终端 使用串口2. O* r! J( k1 [9 K
UARTStdioInit();
. b" `" @8 ]+ O4 Z7 t
7 T0 w% J2 h+ W4 ~ // GPIO 管脚复用配置
: s6 P9 E K5 a0 Y GPIOBankPinMuxSet();8 o9 k2 D& J. e/ o( e3 I3 J5 w
3 ?/ |5 l& [. S8 f# v // ARM 中断初始化( e4 S, v( `: A7 S6 X1 C
InterruptInit();9 T, x& ^9 }2 n& X4 p
+ p; `* `$ }6 _. s; |4 Z8 p3 g // PWM 中断初始化2 _6 p3 ?# C( h0 s y5 k/ _
PWMInterruptInit();6 `4 b' J6 j) y! Q
7 v5 @+ a! w! X5 |% E; \3 y* k$ n unsigned char i;7 u: |' z4 h9 l% ] j9 C
unsigned int j;
* i$ X) e R8 F# D! P: l) x$ m$ z, d
. R# I! L8 Q2 [7 ~ UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
0 [$ O* N' y. p& D+ H: } UARTPuts("------------------------------------------------------------\r\n", -1);
& O" {9 p6 @# z; d5 n UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
0 L1 x% S% ]1 ^; f // 产生波形( e& c" L6 ]! d" Q
PWM1ABasic(25000,50);
) B" P8 o9 n/ U: I5 m: S0 f \. @0 x( f5 A8 F2 U
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
2 E, k2 R& @" {( C k3 ~ UARTPuts("------------------------------------------------------------\r\n", -1);1 z: C8 Z3 a; Y9 A% {9 h" K1 C# H
5 |+ }: v/ h" s* H4 {$ v' G( Y, k( ~- A- z9 ` ]) O6 G5 U/ T- h- d
% D" R# b: a$ H* a( b% Y7 ?
UARTPuts("------------------------------------------------------------\r\n", -1);
9 l' `: g" o# m1 h0 |% N1 M( I UARTPuts(" C6748 ECAP Test\r\n", -1);- Y; ~0 K/ M7 C$ _# T( |9 m8 L6 d
// ECAP 捕获初始化; S) m7 Z5 b* D$ \) O
ECAPInit();9 V7 `3 U. d) U: V
UARTPuts("Initialize ECAP.......\r\n",-1);$ y8 z/ P& i# j/ N( w2 |! C0 l
for(i=0;i<5;i++)
1 i P$ o) c0 _+ l {
# e M) O* U5 m% q& O for(j=0x00FFFFFF;j>0;j--); // 延时
, ?# c0 |% e8 H0 Q ECAPRead();
+ K- v X, [4 K; b3 w. t }3 }; R8 H$ n6 K, @8 F
UARTPuts("\r\n",-1);/ n( T3 y6 K9 q0 p
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);: I, i7 v" R8 f# I: J* a q
UARTPuts("------------------------------------------------------------\r\n", -1);
3 M& Q4 z7 b E2 b. D
9 I6 r1 W5 i q* @6 x- q! g9 n: ~! r // 主循环. x n* v5 b+ P6 }. X
for(;;)
" ` u6 a4 W; |. I3 q4 T' v* I6 Y { Q2 y9 }$ L! O8 S b- Z
) P& n, k% }+ @* q }
4 v4 F3 M. Z1 B& A}+ J" R$ K; p# z4 p4 [: x: w" j( z
* a% _3 A; H4 Z
/****************************************************************************/2 s8 ]5 j8 S9 H( ?0 B
/* */
. J4 M7 W( Z) P/* PSC 初始化 */
* X% O) [+ N( @: x+ A2 F- |/* */
: E5 L0 Q7 F0 V1 b% B, L/****************************************************************************/
3 Y: u; s& X7 F* P2 M& E T8 avoid PSCInit(void)
+ O6 t$ x& m [2 p; }% V* J{! w8 H& e) ^4 R1 v- [; E; @
// 使能 EHRPWM 和 ECAP 模块
3 U; Q5 l: ?: _ // 对相应外设模块的使能也可以在 BootLoader 中完成
# a" h* Y2 v' Z! B PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);% A) g( H+ \" ]$ z7 ~' O* w
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);1 y9 D# i1 e3 c o ` g
}- Q s9 C! {8 |3 S
& o, D t/ k p6 _9 h" q
/****************************************************************************/4 |8 o( w3 Z& }% K' z+ y
/* */
9 z5 z! ~2 ?) y, f( |/* GPIO 管脚复用配置 */
* l) I9 }8 W, F6 Q4 _# C/* */
) z- v- E2 \" @7 S" ]/ Y: O# |+ I, S/****************************************************************************/! ?: G3 N( Y* Z' M/ O" d
void GPIOBankPinMuxSet(void): `" Z' z) }# h, K% }* a* h. c; F1 x
{
; F9 U; V. l) g' G4 q5 z EHRPWM1PinMuxSetup();0 w5 Z/ p% j' A' c5 Y
~( f) q8 s" T2 Q p" S* q
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)' a1 o% {3 Z, i+ M
// 作为捕获功能时管脚方向为输入8 E9 F. q- [- ?6 S1 [6 P3 ~) x/ ?
// 作为辅助脉宽调制时管脚方向为输出9 |5 M" L' p, P) w: N8 Y1 R4 z
// ECAP2 / APWM2
% O9 D3 {2 F, O' m5 Y ECAPPinMuxSetup(2); d) r! x2 r% T# x/ p* m S
3 ?) z' `' l x8 M% j0 X2 [
// ECAP2 / APWM2方向设置为输入
# q: K6 ]2 _* k X' S" e6 ~ GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]% \: p$ C! |+ W: i6 G8 B
}
% I2 k( L& N {- c
$ t/ A2 K( Z) G$ L0 P. ]. G( R) U; V4 t/****************************************************************************/
, c. ^' r2 V! g: u! t/* */
. U5 t1 h# K2 M5 x$ G/* PWM 输出波形 */
! |9 h4 m' p- C2 m# R/* */
9 I& G* P$ Z5 a: h2 m/****************************************************************************/
' E( r, m, ]* E0 B8 l5 tvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
7 Q3 D& E% i2 f$ p{
2 b! ^5 _; V+ F2 O+ Z7 | // 时间基准配置
8 k: I- _3 d- Q. D- g // 时钟配置
4 L7 }# n% ?4 ~! C$ S& U/ _+ J EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);3 \+ _8 P6 ^! a3 G
4 v+ R1 {# K& a4 c# q& W' w // 配置周期$ ]) o6 M6 K& |( }: o. ]* \
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
5 C0 w. X" F2 k0 _: F pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);5 P) B' \& g( A
3 ^) ?+ M0 V3 c; b; a7 ` // 禁用输入同步信号4 ^! M# e4 b9 X$ h' g
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);( n/ E" J+ K2 b4 H$ R. {* g
/ |; g+ q8 ]. q. L$ h
// 禁用输出同步信号
( [; m8 K* {) i: t6 y6 g2 i9 J7 f- c EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
4 R8 X+ W, A- }4 c6 k
! K. P+ l3 n3 e2 p // 仿真(DEBUG)模式行为配置# k) r4 Z6 z( u6 L' h C
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);+ c r: u4 I A. L3 r0 [
' m8 V% j1 f& {7 m- F
// 配置计数比较器子模块
" a& s* h% M$ B8 r! v3 W9 Z& [ // 加载比较器 A 值 {* v9 m: K r, M- y
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,/ Q0 z- W( ?5 u( ]3 L8 R$ a. f
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);: B# w* ?* L; Y. m
: } _) m ?+ |% Q4 j! ~* S$ T! P
// 加载比较器 B 值. d" ^5 m) V/ g
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,3 } q. U& M1 ]# b( l k# c
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
3 }* t8 q, p/ l% @) ]) F
a7 |& F8 e6 Y+ N8 g // 功能限定配置(输出引脚触发方式设定). A( o7 c8 t5 q' m9 q' i
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出0 Y: Y$ ?# T# o; `
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
, x1 a% S- F; H8 K% e9 s6 R+ s EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
* ]2 U2 X. t5 f4 T EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);$ J# z; A- P2 s
G0 V& _+ F! L6 V( o1 F" u) R
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
! _+ ^8 r, L0 U4 W: X# O! h: O EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS); c) c: |% V {) k- J
/ Y) T! u% P/ X/ y R" H. E
// 禁用斩波子模块: Q, a) @% `8 Z9 f. f. z
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);1 v2 F; @. R: g9 i. p" @* @! Z
0 m* `' l0 P- H; S
// 禁用错误控制事件
( ~7 L2 \' ?6 j2 W$ A' v EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);: \0 W8 ~2 Y* @* M) k
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);9 I Z' Z& f) a3 }, }
/ W+ M( T# h( a0 H0 S
// 事件触发配置
. J& R/ J* N; }3 ? // 每三次事件发生产生中断
7 c) z5 X6 t/ {9 P1 b" C) } EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
7 T4 C! W6 J& ^) Z I // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
]) k* \4 V# i/ @ EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);6 \+ a& [: e+ `4 g w5 [. i
// 使能中断; ~* x) C8 N3 Z
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
# ~. b2 s& C- c. ~8 F5 Y: X/ c
2 }, y; y- {- j* }* h) p // 禁用高精度子模块
- ~0 i5 O5 o& _9 ] EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
1 i: |* f/ E( u; q, X/ Q3 u- I: R* |0 Z8 w$ V7 I- L2 M7 E
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
- q; r( U8 W: y# b3 F5 h/ }}3 u% j. _7 O; c. e1 a1 M
{# S) J, n( z! m1 {. b$ T7 A; R. `
void ChopperWaveform(void)4 x1 @ `5 X( H
{
- H( }; f( B& W2 v5 O+ p/ d7 D // 50% 占空比6 x1 e9 n9 @* ~& o' p) K
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);5 u+ i# K4 l0 u2 h: A
// 4 分频; f' m/ a; j; u. X
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);0 m+ A( G* |8 Q: u/ J) ]
// 单个脉冲宽度
! n* `1 f/ B* v E8 G" U3 M EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);1 \6 l+ F; _- ?' O$ H5 H( g: N
// 使能斩波子模块
$ Q) ~5 y& d0 k! c EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
. Q. y X; O. ?}& V/ |% a6 o$ z0 j
7 W. Q! e4 ]$ y: ~/****************************************************************************/4 \0 M; E: S5 H; x$ q0 F, H
/* */
6 i3 l+ d6 \3 ~ K* s& `/* PWM 中断初始化 */
9 O% v: \% Y/ D- ~9 v S( b/* */
( c+ ?, K8 g h% p4 p' G4 y: z: ~1 @/****************************************************************************/5 r. ?) b: p0 V2 }& c9 F
void PWMInterruptInit(void)
2 p2 a+ X/ F$ R/ [$ `; z. U( m{
3 ^) L$ j j' X ]! L6 Q2 I // 注册中断服务函数
; }) Y) k7 K2 m O IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);* d& s5 A, H! s v/ h$ @' u
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
6 J7 ^: r1 L$ H' C: ?+ f% n" b; R% t7 c4 J. l" Q
// 映射中断
; V( c8 n* X1 C8 K& H, A( ~ IntChannelSet(SYS_INT_EHRPWM1, 2);
( m% p: o" L a& u' c IntChannelSet(SYS_INT_EHRPWM1TZ, 3);" ~2 `) f# Q7 h$ Q
, H" m6 }, V2 b i) M' b // 使能中断% @. R) h& M) y, E* n- O
IntSystemEnable(SYS_INT_EHRPWM1);
( ~5 ?. W) Z( G% p R! g IntSystemEnable(SYS_INT_EHRPWM1TZ);# } ^1 q) L0 G, m5 |9 t
}
! L" e6 k* p, B. v! {- k4 F3 A! |8 |8 q% F2 k
/****************************************************************************/! D2 r2 I, M- O5 @% V. y; i. g& c( Y- p
/* */6 A( Z1 Y5 B' ?1 X
/* ARM 中断初始化 */
4 Q3 s' g/ `/ e( `9 W* e t) b/ b/* */
4 U) Y( ^; Z/ n8 U/****************************************************************************/
+ Y4 i7 D# m/ B! |5 k1 ~void InterruptInit(void)+ V0 U, C: G" x0 U3 Z
{
1 f8 z' ]6 @$ I // 初始化 ARM 中断控制器, p/ r3 N8 U9 f# \/ s m& X" Y
IntAINTCInit();0 ]4 E2 Y, ~; {7 ]3 K6 o
M# ?( Q' x+ V3 P( c% t* f // 使能 IRQ(CPSR)2 H) n/ t/ E: \" w( L( U/ C
IntMasterIRQEnable();
+ Q1 o2 c0 l3 J+ P
% [; h9 c0 i1 ~# e7 y' b- e2 ] // 使能中断(AINTC GER)- q& a1 H% Q" V- Y- n$ A; n. o* j; n
IntGlobalEnable();
6 {* d4 Y" z2 H" K2 i. g/ |4 m* D7 v! G
// 使能中断(AINTC HIER)" T( I- o9 A) h& r
IntIRQEnable();7 d( j+ q5 ]/ z
}1 ~* M6 W" i9 v( @! F% f& c
6 D* N1 [% n1 F/ I
|
|