|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
$ \/ A& c' @0 q/ e5 g# C& W/* */
& A6 N+ z8 E) g* v. l4 y/* 宏定义 */
/ S6 E6 U3 ^ V! f/ n( Z/* */
6 r8 O: Q( h0 }- t/****************************************************************************/
/ ~" o3 Y% H2 B4 V2 N// 软件断点
2 W+ }) w2 |. Z5 b4 f#define SW_BREAKPOINT asm(" SWBP 0 ");
+ ?/ g1 _2 o7 {; s
5 k4 o+ D3 ? C3 l# M// 时钟分频
: s& z% {- ~8 j5 |4 k8 q+ e9 z#define CLOCK_DIV_VAL 228 A I, O; T s; I1 S% h3 z/ @1 a
4 B. R# r7 _+ u0 H) t2 Y
/****************************************************************************/ `2 a+ D) O- k3 L. x
/* */
4 `; [3 k6 x/ V! \/ h k/* 全局变量 */8 ^; d. |3 I/ _; N
/* */+ n3 n$ A# G9 d' ^# E8 V
/****************************************************************************/
& ?7 p( ]& Z* }" Y$ ], WECAPCONTEXT ECAPResult;
6 \; X+ y- V2 c8 b+ S+ s) @9 O2 L# m& F, g& I; b$ X0 C8 A
/****************************************************************************/ b& V; {1 z8 h$ \$ H
/* */
g$ v1 | c4 X( |/* 函数声明 */- H. f, q4 i- A7 T9 n$ }
/* */, R% V" u6 j4 C+ Q( y5 n: w
/****************************************************************************/
1 d$ b! y* `& K. f$ I+ J# N// 外设使能配置
5 A1 c! j& D: @+ u/ tvoid PSCInit(void);1 }( h) ?& m, _/ R5 w
! z+ K2 m1 Y u* j0 Q
// GPIO 管脚复用配置
$ N+ y. x" ?2 G v' C, k. Zvoid GPIOBankPinMuxSet();
1 I/ i( b @. V. s4 i" v+ I( m
// 产生波形
. x3 r- U/ O1 `2 G4 o. Cvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);. H F' B& j+ U2 z7 n' c
void ChopperWaveform(void);
2 u6 D# U4 j- O l! Q
$ R" }% @$ I, ]) T+ Y! A// ECAP初始化和读函数
u8 n8 V e$ b" k3 W, jvoid ECAPInit(void);
7 ^( G$ h( z5 R% junsigned int ECAPRead(void);* c* F. M5 |# o" }" B/ [+ B5 [# B
% P9 P4 K/ g6 h. M* X5 I
//ARM 中断初始化
# b; u7 V- g/ {# F! b3 fvoid InterruptInit(void);
$ ]. P0 o$ a& h7 `' s; ?3 I2 Q- s. d& y5 t( r$ P: R
// PWM 中断初始化
' Y: H6 V& T3 |void PWMInterruptInit(void);6 H& c( w7 ^5 [. D0 K. o! A
// 中断服务函数, S# n6 O3 c$ X8 A! S
// PWM 事件
# G! h( ]" c( L$ R# pvoid PWMEventIsr(void);
# |$ A3 n0 O- t$ }, _$ |( d// PWM 错误控制事件
" `: |6 q* s6 u" L) e3 e9 G+ gvoid PWMTZIsr(void);
9 [) ^$ q3 C7 K% P5 e
7 z" @1 N' A* u/ f/****************************************************************************/
2 R1 p2 H, d- P! y x: q1 p/* */
6 q! T$ l7 \* |1 U. i$ J/* 主函数 */4 b- s. ]* r! g; J" i% Q
/* */
- J9 T& h& V3 k$ a" Y6 D9 n5 e/****************************************************************************/
* i, g" a0 [7 T, V9 Qint main(void)
- Q2 V# G4 k- |- h7 H{
4 O: Z0 T8 v B! e // 外设使能配置
/ g; V+ N7 O D/ C# y4 \ PSCInit();* w0 {; o: `0 K% X6 q
4 ~ U2 _9 b+ N) l/ w
// 初始化串口终端 使用串口2
+ A9 b( E) U- F, G f f( V UARTStdioInit();
$ s/ S$ ]( I/ R& H- y7 G/ h: V
$ F; D% h8 x$ n // GPIO 管脚复用配置3 j; Z* q9 |2 e( o/ G
GPIOBankPinMuxSet();2 _7 }+ E* Z r" w0 O
$ ^' C; X: t! g, |. Y( r' D" Y // ARM 中断初始化) s5 Y. c/ V3 V! @8 C" Y, M) b
InterruptInit();& b( l- Z B: s# B3 t& r9 i
9 n I1 E& _( L( V1 j
// PWM 中断初始化) Z6 h/ x" I# C2 o4 W$ T3 ^. c
PWMInterruptInit();0 T* Z( C, |# i; m
' y6 `8 v! n+ `' o$ I unsigned char i;2 t8 J# S; P3 N2 I8 s/ i2 H( E) x, H
unsigned int j;
5 W3 ?8 b3 j+ b0 C& Y4 l* n" ?
( S& v; S3 N* c6 G* c O3 `/ ? UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);2 K/ ^; Q" j* ^: p
UARTPuts("------------------------------------------------------------\r\n", -1);% L6 q* T7 p, x
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);' m- q. X( k" S0 h. f8 l1 T
// 产生波形1 Y5 P# s5 U! P! {) j; @
PWM1ABasic(25000,50);9 p! R7 A- k/ G+ G
6 ^7 F% Q: E- B0 y
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
+ S( ?3 H9 ]. n' } UARTPuts("------------------------------------------------------------\r\n", -1);
0 _8 v: G v- S5 S4 d
3 S5 x& m8 i2 Z! V! M& I" d! J) @9 F. Y8 X* a: r$ m
7 o( y. j. w) T' t: R# Z/ r
UARTPuts("------------------------------------------------------------\r\n", -1);
! S/ ~9 {! {6 V# t' Y9 y- F UARTPuts(" C6748 ECAP Test\r\n", -1);
$ p* h! m) e1 l1 h8 t9 W // ECAP 捕获初始化
6 U) `6 q% N+ u0 A ECAPInit();
" ~/ v% ~* P5 G; ^" z UARTPuts("Initialize ECAP.......\r\n",-1);
! u+ T8 D* J5 x5 X for(i=0;i<5;i++)( E% R- y N9 T1 d
{$ r2 z4 r" [/ M* [, J7 Y/ k
for(j=0x00FFFFFF;j>0;j--); // 延时( L& ~$ O1 ]- g
ECAPRead();
6 J1 M8 z: y% r' j, d9 ]' O* d }9 {+ l3 \" `. B$ H
UARTPuts("\r\n",-1);
* }8 J' c# c; {% {( F) q UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
8 D1 m0 v! V; A% H1 J( Z3 _ UARTPuts("------------------------------------------------------------\r\n", -1);
: Q, E! f6 |9 o; o' Z/ K) q4 o; O, ^% |4 t. [6 n" c5 G. q! X% Y
// 主循环/ u. t9 V% Q6 I) J7 x# M0 a
for(;;)
: @1 [, ~9 ~* T9 c# z( K, b6 d {
4 G4 @/ _1 n9 Z& G$ S! w( M8 x( }
- q! {4 }& B2 p a. b+ o }% S& y" S1 a# j( m4 _4 h
}
: c' w8 x5 T) A! M" c% c$ u, m% k) T! Q" T# O: T/ C1 K4 q
/****************************************************************************/
4 w0 T& R6 a) k3 D. e7 J, G" q/* */
1 Y: D5 J: o6 Y7 N$ u8 O/* PSC 初始化 */
% i( g0 @7 A% M1 Y N% ?- `/* */) b6 n3 Y o& F% m0 Y; x
/****************************************************************************/
( L. H% R3 r' `& Evoid PSCInit(void)
5 Q2 e7 v; ?& s& P8 p{
8 Z+ r( w+ N0 x( V // 使能 EHRPWM 和 ECAP 模块
% z- Y* m/ G& @- x" ^2 ^$ W // 对相应外设模块的使能也可以在 BootLoader 中完成
1 f* Q/ G* U) v& ^ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
9 {" o2 D! N' f6 f: R7 q$ c# [ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ }, ]) K$ H, k1 O
}
+ o8 d" c3 J2 Y- E" [* b }. z# j Y" \5 P/ S
/****************************************************************************/
, I# t, E, {- I3 o$ M/* */6 J* @ h( _: ~5 Z3 n
/* GPIO 管脚复用配置 */
# |4 |4 O) P4 R: x" M/* */
$ {5 C! `) N8 z1 S! n- V/****************************************************************************/ b# ` K) Z4 f% P
void GPIOBankPinMuxSet(void)
* Q' \( I* }# n1 X; `9 k ]9 o- Q{, C% S/ G7 R) \
EHRPWM1PinMuxSetup();5 Q4 x, v& b9 _8 D
$ e) f# x+ [* V+ f4 s // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
c. |% P: k$ B, I. v o: n // 作为捕获功能时管脚方向为输入
3 s, ?3 f* D. j p0 T0 f+ f/ p5 s // 作为辅助脉宽调制时管脚方向为输出
( @, q" y+ }/ r+ @7 V // ECAP2 / APWM2
2 u: [ e- ]7 R, F5 w ECAPPinMuxSetup(2);# t! y; m t) T) a
2 }" w4 r' C$ T1 S! f5 I
// ECAP2 / APWM2方向设置为输入4 q6 @% m7 N* p
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7] ?: D) ^- d+ ]2 e. W0 Z, {) i5 p
} k# [6 F0 w/ } G: K
! F) U/ k+ l' |, Y$ S3 D
/****************************************************************************/$ K( X& Q! Q: b2 X8 w1 c1 ]
/* */
- I$ p; D% _) ?- [/* PWM 输出波形 */
! U- X+ z1 ^7 G$ O1 `3 \! @/* */! _, ]# b) p' ^# [' C
/****************************************************************************/) I, f, W, n% ~. N2 V/ N
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
' B k0 b* L- u! p2 D{# Y2 \' i' {, \6 ?& P
// 时间基准配置$ y# X' Q e2 L- ?5 g/ r# e% }
// 时钟配置
' c4 d4 O2 @9 N' d' S4 I EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);0 \; F0 y" N2 C6 v& g. U3 y
! E, ]4 |2 Z, n* M' d( R# h // 配置周期
! S* O" H$ D% Q" j EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
% f' {0 n! C" K8 ~7 R) R pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
s0 P3 b& b- Z; k3 U: w
7 O$ S- {* f1 C( | // 禁用输入同步信号. X+ l/ K0 v' @ R/ e$ T! }- F1 x
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);( F; A" g( Q9 D: m0 D; [
3 }* K( I; w) W6 w% d9 N9 i4 d // 禁用输出同步信号3 `. H+ r: |1 P# t0 i7 D/ k0 T
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);% n4 y) a. s& l# O
' y& c' b0 y0 ?& m7 _
// 仿真(DEBUG)模式行为配置
5 t7 |' L6 t- l$ T* m EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
3 F3 N$ c4 A6 S7 P7 ~2 U+ f5 g) m! m [8 ]2 i' ]( ]+ i' A* y
// 配置计数比较器子模块( x4 k8 X5 k, m8 L( `
// 加载比较器 A 值# E, Y q/ O) O$ `
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
: y8 r+ t+ N+ F. k$ t' \# e EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);2 [0 ^6 {4 U9 A8 S9 l: m9 t
7 ^. ^+ d5 j, v! z // 加载比较器 B 值7 M% L; n7 ~- e4 S
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
1 b. c4 j9 Y. V' ^ EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);* v- g+ K' m* Z- \
( [' R+ {8 l3 z. y" i, Q2 s // 功能限定配置(输出引脚触发方式设定)
0 {: ?- p3 G p // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出0 d% u; g% j9 G# ]/ s, l
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
- b8 z$ K" e9 H& R( Q EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
# z. a( e: [- L$ ~' t EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
0 m! G \& M3 K2 r
! I b- o0 }+ I! K7 _( k, s // 禁用(旁路,信号直接输出到斩波子模块)死区模块
* J, U- A4 J( J y0 }* x) i EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
H# y* s, v1 P( K
2 k! [ V, h# f/ Q1 F; K // 禁用斩波子模块$ ]" h" b9 ~* v7 V/ {$ L- K
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);: @" y- ~/ [% \* C- V$ t
: y1 o* `# x8 l! z( v // 禁用错误控制事件- e4 ~$ P' _( r2 K& E2 f E v1 I
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);! O6 X5 ?# i. o8 s5 i" X
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);, y0 j) Z' q* ]8 a$ [
' r/ d, S5 C W1 \% M) a
// 事件触发配置- {4 O; B D' ?
// 每三次事件发生产生中断
. ^6 l# h7 r' G/ g EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
# j E C3 E' \0 ]; F0 N // 时间基准计数等于有效计数比较寄存器 B 值 产生事件/ F( l& J0 |% I* e: x, S
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
# I) N2 B6 D& U2 f i // 使能中断
( A/ w& [$ |9 r9 R9 q EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
7 U, M3 e* }1 e" _( n0 g" U2 J) {8 w1 e; d( p/ Y
// 禁用高精度子模块. ?5 X) W9 [% Z: k! c" Q
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);* n" q( _2 l, L1 k' T
( C' A- ?( F. m6 v UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);0 J5 w" H8 v$ q/ b. @2 ~* j4 L
}- G$ O/ }7 c$ h
6 \9 [, ~2 {4 ?void ChopperWaveform(void)* _1 s( V1 ~4 }8 w# k
{1 ~* Q) d* e& G
// 50% 占空比
7 h) f) s2 S, L EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);2 ?. S0 ~3 \" I2 Y- c
// 4 分频) U8 n& P* `1 X2 R
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);1 z4 m: {' V5 R C5 q
// 单个脉冲宽度
9 ]8 i7 ^$ e- ^0 g- q3 Z- t EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);9 a E6 O& v7 s1 ^' }# a0 u7 E
// 使能斩波子模块2 d$ S! o3 e; S6 @
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
, [' L3 _9 z- J0 f}
. h- [4 E1 }$ H! T( X7 t4 D0 m& I/ L* G. j0 d& W- d
/****************************************************************************/
2 c+ \' C0 _; P/* */
! [& }) H+ |- _1 r; R/* PWM 中断初始化 */1 n' i4 Z) r0 ?- I5 j3 D& c6 D
/* */7 R6 Z( Y% ~( v
/****************************************************************************/& Y6 M& M# z7 p/ y0 G$ q
void PWMInterruptInit(void)4 o) y X8 r$ S& x+ A( `" ~; b
{+ d8 s; o& G e1 s Q. O
// 注册中断服务函数' O. A" z2 W6 f! K; q5 X: ^% V
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);# l3 H; `% x; i- F: e) F
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
T7 a7 f% q6 ^! g& @$ M6 e, y$ s$ M
) ^1 n0 u, i- Z6 e // 映射中断
7 D1 w; [% _ p9 c# d2 H+ K IntChannelSet(SYS_INT_EHRPWM1, 2);4 X% O* f2 t9 s8 H! f9 W
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
8 T- m2 U, N! ]: y& Q4 U) s2 _) z$ p
// 使能中断
$ ? p7 x" r4 c9 d IntSystemEnable(SYS_INT_EHRPWM1);
* R8 M) h/ r: K3 P1 @3 g IntSystemEnable(SYS_INT_EHRPWM1TZ);- A0 x! W8 Y1 m
}
: h" z% F1 @5 u
( X+ M4 @' Q. ?/ i6 G/****************************************************************************/* j7 S2 ?6 s$ |& Z, j; X8 E$ s; V
/* */ j& `! I: y3 f/ f( H
/* ARM 中断初始化 */# y2 k/ n; ^3 O
/* */( M5 Z$ r; @4 r
/****************************************************************************/1 X( U4 |9 p) w3 G7 ]% d
void InterruptInit(void)1 ~- p! u; B& \& w3 h) {- x& v
{
$ q. v. h$ I, X0 J' O6 d: | // 初始化 ARM 中断控制器
8 Y+ F5 x ?8 v& d% @( ]( G IntAINTCInit();
: l% a4 I. n+ p; `5 v9 p$ D3 v2 V
! }) w5 P1 u% ~3 g$ C4 { // 使能 IRQ(CPSR)
3 r a9 r& D* v# u IntMasterIRQEnable();; Z. S4 D1 f9 ?0 b4 h
; F6 n7 v. `8 C9 F
// 使能中断(AINTC GER)9 n' }- O1 P( R: Z! r6 W/ V$ ]6 r
IntGlobalEnable();
% S. H4 P+ W7 {9 _8 t* ]1 A( S$ `3 a2 E
// 使能中断(AINTC HIER). T6 _! H, M; i, L+ A9 U) X+ S! T( H
IntIRQEnable();
" I! e8 o/ D0 B! h: W% u; F}
4 }, C# e7 R; l9 e% m- @: P9 k/ G+ v9 s8 r
|
|