|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
: [9 X( p9 G3 e' U5 \! X- Q2 B/* */. R( G4 k8 {9 m% _* E' j
/* 宏定义 */
+ B' \$ g; O8 j! {+ }, ]3 U$ }- d/ G n y/* */2 ]/ @9 Z5 x" Q* T2 L4 N; I/ f* _
/****************************************************************************/: u6 ^# h8 q& s: n
// 软件断点
+ l) Q; z* h+ k- ^2 p9 d* ]3 g#define SW_BREAKPOINT asm(" SWBP 0 ");
8 o& j) \9 E& o" E' m4 l6 T) Y7 W4 k* h% u G9 z
// 时钟分频
9 n6 h: o, d; {( u' V6 D#define CLOCK_DIV_VAL 228
/ h2 i( v% O4 F% k9 P K- H0 c
6 w: t6 S2 [1 i3 |4 X1 V; T! y7 U/****************************************************************************/9 o+ i" x, @* r2 _
/* */
4 i2 D. l; J7 F/* 全局变量 */
( M. L9 H& M$ P* M/* */ S3 y* f% }* y) O$ H! K; G' I
/****************************************************************************/
& `6 w; J$ s1 z, t! @9 s7 YECAPCONTEXT ECAPResult;' @' R! D4 R) D+ z+ L& w& S* u
5 |2 R3 b) Z9 `& y/****************************************************************************/
6 J; {/ i) K2 P- C/* */) I6 \- O4 M3 P) y) S2 m4 H
/* 函数声明 */
' G: c- }. U+ Q. O/* */8 C7 C) w5 O6 y9 L! {$ r
/****************************************************************************/1 P0 O H5 a+ ]3 |3 A
// 外设使能配置9 E0 r9 A$ k* S3 I; z+ w. J0 L
void PSCInit(void);
' Y" n3 u8 q% l" S2 r; X! e* w$ W
// GPIO 管脚复用配置
`, U+ W4 s; u" J' Pvoid GPIOBankPinMuxSet();2 O+ w8 W: i" h3 [( y9 N' H5 j# j
' O, z n3 k! ^! i& z5 X, _// 产生波形7 q7 e p# \6 Y$ b; _
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);- D [/ U: f: J/ `2 u% D9 o2 e8 a
void ChopperWaveform(void);" ?+ I% d# h+ O
1 e3 y3 D6 i' P2 w- N8 Y- Y- c// ECAP初始化和读函数- n. M0 x a, Q4 @. h; f
void ECAPInit(void); M8 c( u1 d3 _
unsigned int ECAPRead(void);
) b* L0 C1 G" S1 R" I: h1 q+ U, X, l! o1 y2 c
//ARM 中断初始化
% [& c8 V/ L l/ @' o' T q+ Bvoid InterruptInit(void);0 U% T9 {7 F( ]
+ l" A0 K0 v# t. ~
// PWM 中断初始化
4 R7 c. @/ t5 g; d2 x# h6 N rvoid PWMInterruptInit(void);
8 B3 K$ r. V+ o2 }7 v// 中断服务函数! O* G' }2 H# e
// PWM 事件
, z* }8 r. S: O4 O' v2 Z8 jvoid PWMEventIsr(void);" \' k: o# ?6 i& S5 `; o. h$ c
// PWM 错误控制事件$ P* a1 g6 O. o @4 S0 @4 d5 X
void PWMTZIsr(void);
; d2 ?3 I: I! k4 A
! v8 T( a$ W; ?/ R4 S% [ g( b/****************************************************************************/4 U E& f0 K+ N: ?9 c4 y
/* */
3 j$ p: W5 q' m2 l0 c1 |; d- C% B/* 主函数 */; o% J8 Y/ \/ I" B( T7 A
/* */
9 P' j4 ~9 R- t/****************************************************************************/
: x Q u$ @/ H# l, \int main(void)
2 l L7 s* w; ? C. _{7 o: F3 w8 H) M5 ^
// 外设使能配置
/ {! H$ r7 O5 i# W& Q% c/ k) n PSCInit();- A3 s1 c, Y3 x( u
( r( d0 T3 `7 H- C
// 初始化串口终端 使用串口2' P$ b, J ^) R8 x: p$ L N
UARTStdioInit();
2 C( m% j2 I l! B3 I4 T
7 `& R. i# n4 u' ~" R" ], E! S // GPIO 管脚复用配置2 u- ?% C, R( L, A6 t, C
GPIOBankPinMuxSet();& b" Q# { s J
3 Y. ~$ g' W2 t: d9 r; X' x // ARM 中断初始化
5 R+ ]# b/ A k& Q i5 z InterruptInit();
7 q0 ?3 y2 f9 G( T) W/ Z* {$ r! F3 |9 Y2 e
// PWM 中断初始化! R3 J( p( O7 p
PWMInterruptInit();9 m& i+ P3 N0 u% x, k& I3 f
: n t' \) q. `8 R- g# I
unsigned char i;: k7 {* P! G% a! y
unsigned int j;: @' S' x5 G/ m- g
1 C t W4 H, ^: d) ]: r5 A1 b
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
& R& V7 W# `" N+ @ UARTPuts("------------------------------------------------------------\r\n", -1);
$ F+ r1 A, Q! q- Z) W UARTPuts(" C6748 PWM Test\r\n\r\n", -1);7 q$ w+ e; ^ W1 }
// 产生波形
( g! J) W. X7 P6 u PWM1ABasic(25000,50);" ]1 l _; l+ R: G7 b
0 s1 U! J, R0 R1 i/ F6 f! g" Z
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
& t$ D9 T: h0 u }8 B- `' T1 V* c UARTPuts("------------------------------------------------------------\r\n", -1);
9 k. @, j/ u" e" H# |6 k4 p z5 n+ q3 R' m; j3 I. M
/ I" D) G$ E) I9 k
7 R7 f# v. _( y7 ]& ]; f
UARTPuts("------------------------------------------------------------\r\n", -1);8 w) x& G! V8 N: H8 [2 g+ g2 M' t
UARTPuts(" C6748 ECAP Test\r\n", -1);
& T. u4 n6 s, x" Q // ECAP 捕获初始化, D) Z- W4 a) X, j/ o
ECAPInit();
) d1 E q* A+ F8 C( ~5 `4 E UARTPuts("Initialize ECAP.......\r\n",-1);" ^7 y. u( D( R; ]) K2 B- X5 | G
for(i=0;i<5;i++)
) d) L$ Y y3 ~+ K9 ~7 t {! E, T. r! N6 `4 W3 ?2 @
for(j=0x00FFFFFF;j>0;j--); // 延时) h7 @. I2 r6 y
ECAPRead();2 B2 G' ], Y) v9 P. F( n+ u( _
}
1 K/ ~/ Y L. M3 k UARTPuts("\r\n",-1);
' m' \' k( u# m) o% e UARTPuts(" C6748 ECAP Test Over!\r\n",-1);( E8 R9 J& z% H$ o4 P! S) ?$ o
UARTPuts("------------------------------------------------------------\r\n", -1);
* y- h8 J! Y/ m% U7 m9 D4 E- w
) L# ?9 N9 K6 |% |5 U( N3 n6 e // 主循环
& N( \, N6 l# f, ? for(;;)" S: S* O. m9 l# |$ q
{
, V. Y" O7 N! z9 ^2 d5 L5 A/ e: B: Q4 t9 Y
}5 |, t, E S! l. g: @+ _$ R
}/ ~/ U& I, R( W& J
7 T7 s) V3 j; E k' o2 N/ B( M
/****************************************************************************/0 J! [/ g b+ v: |2 t8 U
/* */
9 ]- W7 h- u5 C! L# G$ A/* PSC 初始化 */
7 v8 w* f6 x& I. s0 n( Z; Q/* */9 i" Z1 Y0 |- \9 J4 ]
/****************************************************************************/2 }) w% Q! n/ E) ~. a
void PSCInit(void) _( h, Y9 l0 d# }. Q `: s- a
{: S/ t7 `8 n7 ?; C4 u
// 使能 EHRPWM 和 ECAP 模块
0 C4 Z+ u* r. P$ U# g% @& ~/ y8 ?: D5 ? // 对相应外设模块的使能也可以在 BootLoader 中完成7 U( K ?+ r' F4 i
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# ^1 N7 N& ~1 n' c7 G
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
" H9 F- C; p2 c* _. z: e} u( ^5 V4 ^* B2 Z; ?- Q# ~( I
, P u; P |' P: ^ V7 L/****************************************************************************/
: d1 |! W; f S8 o6 B3 @/* */3 h! c- W' U; `- H4 Z
/* GPIO 管脚复用配置 */& ^- Y# _) Z2 S/ |1 @8 }& F
/* */
. h/ y/ Y' ^$ V0 Z* H) y/****************************************************************************/4 B( G$ o" t* X/ a- G! U" _
void GPIOBankPinMuxSet(void)
, ?: z: X$ l# X; T0 r e6 ?' R6 Z{
2 G9 Y: p8 }; T3 [/ f5 O EHRPWM1PinMuxSetup();
& U4 J! Q. r1 v9 g/ l7 A
" E" E# v1 @2 Z7 | B* b& B // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
# K$ ?, q9 A6 q! F // 作为捕获功能时管脚方向为输入& [ k6 x9 t: Q* w1 @
// 作为辅助脉宽调制时管脚方向为输出( v, m% T& R2 n
// ECAP2 / APWM2
: S8 X! A k4 H7 S' o3 ~: V ECAPPinMuxSetup(2);
7 v, A2 M- E2 d! H8 C) q7 o# Y8 ], J( v0 |) Q
// ECAP2 / APWM2方向设置为输入0 U" y2 T* y6 I! _
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
1 X* K7 x( J& ^/ R. o. ~}7 c; N* ?' |; B0 w
, \/ U1 O$ q9 g
/****************************************************************************/
; K: M, B# o$ r2 V" ?' u2 [7 J1 t/* */( n! G& S& E% a6 R1 n9 h2 |
/* PWM 输出波形 */
& Y. I, ]; K, V, L. G/* */8 I- Q! J# J8 q/ u" p
/****************************************************************************/+ E- G* F2 y* w5 O' Z# z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)$ h+ W1 Y% y" i; s6 \" F& w
{
6 A. ~5 _( V+ ~. r& v. q& ^ // 时间基准配置( k1 j( x6 g$ I1 k5 g. z1 }7 T
// 时钟配置
4 g: z! J! @2 ^0 _8 H EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);$ e8 X3 M: ~4 D
$ Z; M# \, h3 w5 h& _
// 配置周期
1 P# m' V6 U7 x7 m EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,2 ?3 u7 H! X( q- Q; q+ Q1 P( `
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: z9 P, U7 @( `! y
) H, U: Y+ o. `9 j# \ // 禁用输入同步信号
" O; q% Q6 C3 K, c1 Z EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);! G( g$ M% S0 m4 M6 `+ g
( k5 d4 f# D$ V& o // 禁用输出同步信号) ^) z |; g" K5 M7 Y' e. O# V
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);$ x, A; g6 X) H7 s
5 k k- p! ? l1 K7 n; F
// 仿真(DEBUG)模式行为配置/ S; N, b" a1 _4 F( T
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
4 d2 L4 ?- l3 h$ I6 z) m, _ A& N. k) G/ p% }2 p. C0 k% O9 m
// 配置计数比较器子模块3 G* ]- B6 {6 c7 S9 k# k7 c
// 加载比较器 A 值
7 a1 T, R7 I; f3 U EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
. \! T' R( N' k) j* ^ EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. h- W f! L* S* _4 g" s+ W
: b- b; b/ f: e. ^( ^7 h/ J
// 加载比较器 B 值& ~; x% [* D( }
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,/ D0 e( P1 \, ] n0 ?* h1 O
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
! }; O7 A" a# k3 l1 u& N8 l0 M" w# @/ [; L" ], R& B9 T
// 功能限定配置(输出引脚触发方式设定)- k6 D, }; u$ b# v$ N* @
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出! _+ k% r, t, J) O9 |6 ^: n0 r! t1 f
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
) Z8 g: Q4 w+ N3 z- M# ` EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,7 F1 V: a1 {( n
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);4 A8 m/ i1 Z. A: r
+ s; D/ d) O) R1 C' Y, I // 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 C, X0 J- K; l0 f7 F EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
; Y9 W9 x x; E8 @6 X& c1 w
8 u; n# f# d* O; p* R) K // 禁用斩波子模块
" l# W+ f/ `8 e& W5 z0 m) m EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
9 c Y, `2 J5 S3 P
0 u- j) S% [9 ?" x4 m' P // 禁用错误控制事件, ?! ]0 j$ f; h0 T+ ]
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);( X5 n4 t& R0 [0 c/ A
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
1 n. U+ e4 [, A
4 y! M+ _: q4 b0 U3 | // 事件触发配置
( h9 P! b9 P9 J0 o2 [, O // 每三次事件发生产生中断5 _5 V1 c o( k3 {* e- J
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);' n5 M/ O# e% J& @0 X# m0 C
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
- B8 e+ L" P' ]8 i9 |; n EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);$ I* _/ ^ l; o/ L- v8 O% B8 {
// 使能中断
- B/ ]; L% M$ g7 X EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);+ g! e2 Y( I; |* o
3 U" R( j" {: q4 i( n, Q // 禁用高精度子模块
4 m5 ^: y. U. k+ U6 d EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
' \; f# n1 i3 y. M m
% C; E* e6 U2 x- U UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);/ r6 X8 A# N9 j ?5 _3 A* ]) A
}
) \# s8 Q* z2 s/ n% p2 V' w$ A0 ~3 {2 K4 @
void ChopperWaveform(void)
; T7 h, V. q& S& V{& G; M" ?6 v& f5 e3 c. \! Z
// 50% 占空比
' R5 f2 d" o% g9 z& U4 T5 L EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
) t$ G5 R% |4 H" }( w! D0 f // 4 分频7 c( r/ H0 r" Q5 A, z+ _
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4); w& H* q3 W8 [# J) p {; j' k
// 单个脉冲宽度# O7 q; {1 j7 b" H b" Q
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);* B8 @+ a7 V( O5 u
// 使能斩波子模块
5 N: K3 U0 R o k. K5 l2 l EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);- G5 B F$ L( E: ^) _" R0 v5 |
}0 u1 v! D: f; `" }
) F4 {6 J S0 w4 e! P5 T& ~/****************************************************************************/
0 O) I, T5 q+ h6 {0 X$ q" g+ p/* */$ }/ ?1 F0 k$ N6 }4 j7 @% _) _
/* PWM 中断初始化 */
& L1 U- I+ z, @7 [8 @/* */- v" V! B# z; u0 }9 p
/****************************************************************************/# R$ ^' }, G0 \
void PWMInterruptInit(void)6 T7 e0 D/ z- L3 L# g/ H
{
6 {# L. M* N5 |6 P# Q1 f( x // 注册中断服务函数
: I$ R: K5 U( ~3 T$ J2 @ IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);; q# u% m8 a+ b' ]' \& B ?
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
: [+ d; z( ^) L5 d! u* d
, u* u, c" H8 ]9 o) B; q4 w // 映射中断( {. r9 B( Q2 {, w' W
IntChannelSet(SYS_INT_EHRPWM1, 2);
2 j2 y2 l! H* @. {" Z% I3 u: y4 ?) V% v IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
) I5 I3 Y M4 d4 i, r0 c9 j- z6 @
0 Z9 a8 O G2 M$ d$ X0 _& \ // 使能中断3 C. ]& g& C) p* B7 w: b
IntSystemEnable(SYS_INT_EHRPWM1);
# L; X9 L4 r0 j, Z9 V+ Q5 G4 j; | IntSystemEnable(SYS_INT_EHRPWM1TZ);: [ ?- |1 ^& L7 v
}0 D P# a+ L# l
1 {9 ~9 e) Y$ X& l1 Z
/****************************************************************************/
s: q1 H. t! S: @+ m/* */: k( f" E8 G6 I, J
/* ARM 中断初始化 */5 D& x- }% f5 C2 ^- D* `
/* */
8 M( R0 S4 |1 {$ |* W1 n/****************************************************************************/# L m* r9 s2 g% \9 m+ ~
void InterruptInit(void)$ k' X8 @6 r1 W& o
{
* I( ]! m* H8 R" f- r, c) E! C // 初始化 ARM 中断控制器
# v# \. j( I: l& L- c2 K# t5 R IntAINTCInit();& c# H2 Z% z9 Z# Z0 s$ X& Z7 |0 X
0 Z3 E1 V" m% Y9 v( ?- {
// 使能 IRQ(CPSR)
3 F% _8 D3 w" i! C IntMasterIRQEnable();, O* E1 i9 I# x1 I
3 X, z) g; i, J // 使能中断(AINTC GER)
) C& R# d6 g- A" U$ {& y( L3 t IntGlobalEnable();
* ]; M3 n7 T. m0 Y2 ?' Y
; ?' P) ?) ^& c- B/ Q) X // 使能中断(AINTC HIER)
+ k8 K: P' v$ _- ^! ]) d8 ^3 a IntIRQEnable();
& m8 e6 j1 V3 z9 J. v# g! \}7 x6 M4 Q; s: n. s0 x( s( P
1 Z. M$ i0 X$ I4 e7 K$ b% W; [2 c
|
|