|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
* W9 i) D/ ? _* k/* *// i) R4 |0 f# G$ l+ u" @- d
/* 宏定义 */$ y6 U' W, Y7 h. H# g' d
/* */: y* p) g) W% R; T- |$ C' `" z( R
/****************************************************************************/
5 i7 Z9 ?' F& c4 Z" K A7 o( n [// 软件断点
6 M0 ?* n% q- \" z#define SW_BREAKPOINT asm(" SWBP 0 ");
2 X& |( T+ g! R9 J4 B) J3 n- g& D# Q; ]% N! j4 z ?
// 时钟分频
! k3 [. ]6 e0 |) f#define CLOCK_DIV_VAL 228
' a+ a7 \( F2 E+ t* P- U6 a' t3 Q" I6 r7 q P6 [) I: Y( [
/****************************************************************************/4 y# l( R% _8 W- z" p
/* */& m C6 W% G4 \3 t0 E
/* 全局变量 */
0 i) p1 |- U/ N; c/* */% m0 w/ ~& i* r8 ? J1 j/ _
/****************************************************************************/
( q) s% v" n' j2 |, U( \6 }& bECAPCONTEXT ECAPResult;9 _& x8 K3 d( @+ i$ d. d3 z
2 T' i m& i) K3 f. z/****************************************************************************/$ r4 j7 @' v- e- z2 i
/* */# O) H; \. f9 e; P
/* 函数声明 */0 \4 I" g \; E* t: z9 v' G% S
/* */
5 @0 R$ n/ f" w w0 \8 t. x2 R/****************************************************************************/
) Y' l1 X$ Z2 f0 F l- l// 外设使能配置
5 c1 Y! K& A; `5 tvoid PSCInit(void);
* A! X8 Q6 m. B1 n$ ^) q& t) w u! c! Q
// GPIO 管脚复用配置
& j/ ~0 X/ l$ {* h" gvoid GPIOBankPinMuxSet();
5 w$ q8 ~5 d' Q3 c3 M+ W0 q* u4 j( ~3 R/ n% d
// 产生波形
& N/ B4 S7 I5 |9 s& T% Dvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
8 l5 S+ _9 f# G7 [' tvoid ChopperWaveform(void);
& h" t# y3 e% x, C+ N8 ]5 z- p2 S/ _8 _, z3 I }4 k
// ECAP初始化和读函数
. w) g( W) E- D0 K) C% ovoid ECAPInit(void);; W0 n, ]6 v/ h/ ~* b+ t/ f
unsigned int ECAPRead(void);, s7 v# O- A2 b. b. a, s
) S$ i; [+ B* X; z0 {
//ARM 中断初始化
8 I- _7 e, I `) ~ G- Ivoid InterruptInit(void);
/ _+ g: Z- C9 Y5 P, u7 i
& p g% ~& F: r5 n// PWM 中断初始化9 G, i& X4 @2 X
void PWMInterruptInit(void);5 e) V& Z- v: T: y2 @
// 中断服务函数
' ^7 s% l! c4 @+ D) E1 m2 Q+ b// PWM 事件
8 n1 ~' a: J+ D1 g; G9 rvoid PWMEventIsr(void);
6 p2 Q) e, f0 t// PWM 错误控制事件
1 R% X+ l+ v* S! W2 z! A2 Svoid PWMTZIsr(void);
U k5 ~) h8 P1 ?! A5 p0 @& m3 E5 G4 z
& ]" W& q. @3 u8 y0 {1 Z2 I/****************************************************************************/( g) ]+ s, f+ ] c0 ^( I
/* */
' X' P |- v$ v0 s, z/* 主函数 */
: K1 q4 s G9 O, V% a% T/* */& t* H M, D8 d. H# T4 Y
/****************************************************************************/) d3 o- e+ ?, n. M7 ^7 s
int main(void)
* @. w7 u; C. R" J{
$ m9 S$ h7 ?/ [1 r! f1 K ?9 k // 外设使能配置
. a* Q7 p$ Z; r6 N- `! S PSCInit();
. L" `% T' b8 H+ k Z. M1 C8 D% {* f: }( i" `
// 初始化串口终端 使用串口2" ?: K6 E B4 Z- H! r7 Q
UARTStdioInit();$ z2 a! N2 m$ [4 f0 \) x9 a; K
5 [- L7 Z Q, h# V) f // GPIO 管脚复用配置2 U1 T5 g1 {" D! e# D5 g+ R
GPIOBankPinMuxSet();
0 P, F. h! D0 P* G, H& _
0 p6 C' j; Q5 O/ } // ARM 中断初始化* d. u4 \- t% d+ ?
InterruptInit();" J: l( w5 K; T. M. R: n$ \% v
0 L* R" }( }! y! }; J) h. l9 E
// PWM 中断初始化
( {2 i! d: z. c/ C# Y2 R PWMInterruptInit();
! T' ?$ Z/ R% g2 w" w9 r
# S; v) d: Q2 O9 }. ^ unsigned char i;
) N) b$ p$ ]. u, k unsigned int j;
1 ?7 R4 R4 y# ^7 N0 V5 J- p, t/ T+ G1 _6 T2 H5 c7 ^' ]
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
. f2 X9 V6 v$ {$ I- X( E- X* b UARTPuts("------------------------------------------------------------\r\n", -1);
- N1 z8 V9 F( d8 n4 c5 P9 S UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
. Z7 \' K+ X; l# n4 F( I // 产生波形0 r8 B8 z$ i' [* G+ I9 R. ]
PWM1ABasic(25000,50);
! y# f0 B5 H0 j+ U) @8 T
! r! x n$ [: H7 J6 I, w* w1 A UARTPuts(" C6748 PWM Test Over!\r\n",-1);1 |: I0 H9 `' e7 [- d& s
UARTPuts("------------------------------------------------------------\r\n", -1);: [8 a# V3 R# s0 b7 O
' D" Q* G- e, J2 H
- b4 B+ P( _3 ]) g8 \) {' U0 f( W+ Z$ V3 X
UARTPuts("------------------------------------------------------------\r\n", -1);! Q" {9 T7 p! C& ]% a3 e3 x* w
UARTPuts(" C6748 ECAP Test\r\n", -1);) [7 i6 `/ H* F# e, L4 d
// ECAP 捕获初始化+ k6 |5 N5 b. D+ b, \
ECAPInit();
& e6 D: y, p# F9 X UARTPuts("Initialize ECAP.......\r\n",-1);
[# {1 e7 Y3 c* g for(i=0;i<5;i++)
0 \0 a$ z6 }5 \5 ] {
1 ^+ ~+ a/ g. K% ] for(j=0x00FFFFFF;j>0;j--); // 延时% Y# e) Y! f# B
ECAPRead();
) a% Q* I3 }( O/ d; ] }
; |# u0 O3 }, ?! V UARTPuts("\r\n",-1);
. }9 _! ]4 X" O! @8 F! U# v t. H; E UARTPuts(" C6748 ECAP Test Over!\r\n",-1);% G5 I# B/ i+ v7 ^
UARTPuts("------------------------------------------------------------\r\n", -1);5 z" h" c* J; |. d
6 b9 f6 a) t3 i // 主循环- c* x9 `5 n- C0 r3 V) L
for(;;)
M3 {; J+ Z1 e+ i8 U' t- v8 [ {
' C( I( Z9 }, M( X# p$ ^. y% C0 u
' C" R6 d! i+ v, v/ k- d( O' ^4 I }
1 o$ b( `" q! J ]}
/ ?; X0 f& v/ I4 j6 `" ]2 o- N1 C8 C! D9 E2 Y8 k8 o
/****************************************************************************/
3 L+ m& |; O- E* F1 o, x/* */6 T# t) w- X" x# ~9 z
/* PSC 初始化 */
: _) S9 p+ r0 z. i& A$ _' w/* */2 @5 i9 `5 N7 |
/****************************************************************************/. }9 g$ Z$ s* V0 z* p+ i* _6 [9 [- S
void PSCInit(void)9 \ H1 q5 Z. z, g+ U! ^. i
{) L8 U: o b5 O. e
// 使能 EHRPWM 和 ECAP 模块) f9 y7 l* q/ z8 i; @
// 对相应外设模块的使能也可以在 BootLoader 中完成5 p+ s% a8 g8 q. }
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 B- M' v! G! f& r9 P PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);( q9 z v- ~4 @% f/ V! y, G+ }' M
}) f) n; X+ o. b% w" ]
8 d9 k' v e$ o# n9 s) O( z5 _
/****************************************************************************/
( X% y" h* f6 u3 i# t% ^3 S/* */& O- Q5 I/ W) r% k) o" L% ?
/* GPIO 管脚复用配置 */
; k8 h: `7 u; \' Y/* */
0 h( z6 D2 _, F3 F' v/****************************************************************************/
$ T: t, k* c0 S* wvoid GPIOBankPinMuxSet(void) c1 t6 S5 h; Q
{
2 U5 E7 K5 I' g# m- |9 W EHRPWM1PinMuxSetup();. H6 d# p, M* }3 ]6 m$ J% y
, ]. [, C8 r. m# S+ T // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
. x1 Q0 z) \0 o( _* o // 作为捕获功能时管脚方向为输入& L+ e0 e8 Z# [6 @. ]6 X# P! Z! P
// 作为辅助脉宽调制时管脚方向为输出
0 c& s- u! O5 b8 p a0 ` // ECAP2 / APWM2; d& V3 m0 [$ ?8 q. y
ECAPPinMuxSetup(2);( v# o) D5 J, D1 Y1 B& e: u
" `& U5 F4 h: h& T' E( Q
// ECAP2 / APWM2方向设置为输入5 s4 q; H ^$ B
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7] `6 f8 }" _* g' B K! s
}
( @2 V( x' v1 ~; w( @
5 R6 l7 E* t* F i/****************************************************************************/
" W1 @4 }' |( J: c8 z; Z/* */# p: ~8 ?6 @& H* t& l
/* PWM 输出波形 */
# f4 e( b2 x% h& v9 Z* o/* */
% C- g4 _4 ]8 g# N# `0 L/****************************************************************************// Q- p% q* v: b6 D
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
~; c, `8 u- U- v' M{9 H4 M3 h, ^) U7 P# d3 `1 S
// 时间基准配置% y6 P( d0 s7 m( d! \1 Q2 e' ?! t$ A! ?
// 时钟配置4 r2 t: @" j8 Z
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
6 C: ?% C" Q; C2 g+ r' |4 J7 O7 |/ f4 R, Z9 Z* x
// 配置周期6 @% R6 \/ ]5 K1 Y0 V4 g+ U( a# H
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
- T! X. s" X% N; ^) ~ pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);7 A% A/ H' ~% @* ~+ H$ T! N
7 H, Z! o+ t8 o/ ~! O
// 禁用输入同步信号; i+ @6 J6 x3 |$ b& I' }
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
6 s$ k' |1 U0 ]! ~$ d8 q( |
: S& I6 _1 j G4 | // 禁用输出同步信号+ ?8 T ]! P9 R, z/ S1 J0 R! X1 [9 T
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);! e# g$ z6 @6 `# V& _
7 O8 U) S% B5 s% n [7 J. L // 仿真(DEBUG)模式行为配置8 D! K Z9 T3 i7 S
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
1 V" I h/ z$ [6 X P3 G$ c9 X$ U: P- w& X- h; a# c
// 配置计数比较器子模块
R* G! r( `+ X // 加载比较器 A 值
' c$ k f1 v. t' T3 x$ ~ EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,/ Y( U3 z& r' Z1 U$ R: q% e# |: w! y
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);9 z/ F# e! u- v* m! c+ d: |: E
- F4 h5 _8 R1 m% m$ G
// 加载比较器 B 值7 _3 Q( O' m$ r, N* X$ S' Q
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,6 f: I% ?" e8 D. D6 H
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 m7 |& D1 F! b7 v( ^( `: l* r( T3 q8 A" g* t7 o
// 功能限定配置(输出引脚触发方式设定)8 @( o4 u' c; A1 p+ v
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
' o' T+ }% x+ R% R" v EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
$ ?. f! L0 w, w2 k EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,* k! J C% n4 e4 @! D
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
) w' B2 X7 N6 N
& F, W) ?8 G. l3 G0 { // 禁用(旁路,信号直接输出到斩波子模块)死区模块- h, E8 ~5 |8 V! f5 I
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);! Z: p# w, ?3 ~$ m
% x7 T% g) J9 {% I% N // 禁用斩波子模块
- f& r, n% k$ s: z0 N# r x6 z EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);5 G1 }, R4 ^3 N* }" S) r6 k
$ r0 L3 y' c$ M2 V% t$ L N5 v; x // 禁用错误控制事件7 w) z1 _ ^3 Q. l1 b5 | @% d1 `
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
% D% S6 s. b$ T' W% t4 E- f EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);! c! [' ~ k& x/ v2 t9 z
* G" w) |: J0 j# | // 事件触发配置
3 z G9 z$ f; v0 j0 L // 每三次事件发生产生中断
/ D( K% O+ O2 F: m EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);! t- \! n i# q8 o# q8 v
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
2 J1 H, a6 ~* C$ `) Q: z2 _2 x# ? EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);7 p/ e, s- p; L4 n9 ~% E: }# b8 r
// 使能中断
; C$ _' v& f( E: X9 W [6 Y EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);. Z2 d4 b6 \9 l
# M* J# w* i3 N* D: I0 N+ O
// 禁用高精度子模块/ K% g5 V: @0 z( l. x! g! S5 L
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);! y; i o7 T0 s
: ^/ }7 c) t* s8 o9 A& s6 H4 l6 R* f
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
g+ J/ B! I: p- j6 I1 i! H8 x; d4 h}
; v3 F! p. R. u6 O0 U6 P7 `( T& b0 m
P3 k7 u; S$ k _: ]: nvoid ChopperWaveform(void)
8 q2 T. H* ~# H" N8 q3 |2 a, w{
( q- \9 L$ Y8 W+ z3 S, J' ] // 50% 占空比
, u& e- j3 i1 o% C: {# R. h* B7 m/ } EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);. F6 k- z5 w0 W7 L+ ? E2 D* q
// 4 分频
& {% m9 [$ T( S# s4 |% l EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
" v: H6 J6 e; s/ y( p) ^$ S, O# F% { // 单个脉冲宽度
7 w2 A) V: X3 ?8 W4 A. s8 t. u EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);0 Q4 ~8 F5 P5 e, r' l% K
// 使能斩波子模块
! c4 E; c2 e# ]: \2 w/ H& R EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);& V7 G( _. @+ ~6 n; Q: k( ~
}- k, [0 E5 q& t$ ^% |
2 _# i" Y. \6 k+ p! ?1 M/****************************************************************************/
! d" F7 V+ b& Q6 A/* */
A! _* V& ~6 C/* PWM 中断初始化 */0 U: o' {& C$ F6 ^" m
/* */
1 B8 I$ _& I8 s: _9 z+ M" S; h/****************************************************************************/0 X6 F# E9 s$ N* C
void PWMInterruptInit(void)
" e& Z* m; O7 R2 p1 k2 C" n$ g3 E- b" e{, V1 L. G- L$ a. Z6 A
// 注册中断服务函数
R f0 S* R2 Q' V9 L IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);, I6 c7 r! r/ X. J# Q
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);: o+ c6 |, J' g+ K% X& [4 U5 q
; u. S( x. s9 z' R9 ?
// 映射中断
( t* K8 s7 ]. Q+ T; k4 O! X, o IntChannelSet(SYS_INT_EHRPWM1, 2);+ ]" z- p. {( e5 W" S) D- G
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);; T! A* C) |( h5 u
+ S& D7 w. Q W" l
// 使能中断
- v% y4 k4 E5 t( `- d; y IntSystemEnable(SYS_INT_EHRPWM1);2 c/ e4 @- f- e5 @
IntSystemEnable(SYS_INT_EHRPWM1TZ);
9 ?9 y e* {9 O4 s, f7 |}
( G) f9 n2 \0 G8 A, c/ y) b5 ?/ Q1 p, @3 Q4 K1 p0 X
/****************************************************************************/) f5 w7 b0 N& N. y# l: Y4 J! b
/* */, e' K" T' ^% ?3 U0 a: d% X
/* ARM 中断初始化 */
3 K- q; p8 @2 U7 d3 d/* */
4 x9 {4 G6 o% ]; a' U/ U# O9 d/****************************************************************************/0 A1 Y. P- S9 G6 H, p
void InterruptInit(void)
$ ~% \+ o* g! X- t{' G5 G3 z$ p4 T: H7 q2 | P
// 初始化 ARM 中断控制器
# I1 S+ p1 h) N- d" y0 o/ r IntAINTCInit();
- U: N, _, U) Z; z' v8 @6 z" q
( J8 y5 o" t9 p // 使能 IRQ(CPSR)5 q& c I$ b* ~6 ~
IntMasterIRQEnable();/ J9 A l9 g! [6 g8 W' K b5 d
; K3 Y& p$ K9 _, L2 i0 t, W // 使能中断(AINTC GER)
* X/ P* O% e1 s5 c* z1 g3 w IntGlobalEnable();3 t! k) P, L5 [1 K s. z
1 D& G: t9 |+ G" y4 k. p( s5 O // 使能中断(AINTC HIER)
6 k! p8 w1 Q( k3 g" Y' H IntIRQEnable();9 |# H: r _) L7 V: ~, \
}
" A k7 p7 D; p- D; O; f+ s
1 _3 J$ q( v/ W |
|