|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/& s' w3 N( y2 |) w; m. Y4 B
/* */! B! s3 |5 C7 z* y7 N
/* 宏定义 */
* \2 n' H2 e4 w3 C) M/* */
* \7 S! h3 G, B. R. e2 x& i: [0 H/****************************************************************************/% g0 W5 q. _: m
// 软件断点& P, x# B6 ?% c; t
#define SW_BREAKPOINT asm(" SWBP 0 ");: @: H4 F) ]7 \1 ~% m
' m1 p9 \0 r$ _% }3 _4 K0 Q// 时钟分频
* O+ Z% k' R' w9 `6 I5 N# w#define CLOCK_DIV_VAL 228) ?2 n. q1 t, y. b
) y f1 ?8 G4 ]( c/ ^( y- O
/****************************************************************************/
# G; ?" O0 |- \/ q6 t/* */
6 C8 |$ ~. }: a7 p% t D/* 全局变量 */! w2 N3 i4 Z% n8 t" D' j$ n* l) n
/* */
: g" Y4 j5 T) F# D; Y/****************************************************************************/
9 T- }8 M3 W& ]) C0 R- KECAPCONTEXT ECAPResult;- [/ u# U7 y9 K g( V
2 {5 {8 H7 i! a7 |/****************************************************************************/" j: l, X& s! h/ \5 w' [4 d5 x
/* */
2 E* d* l( A) V/ F/* 函数声明 */
6 t& k' c. t3 b/* */3 R% b+ r- j1 x4 _' c; b- a
/****************************************************************************/
# y2 A- P! P* B2 @% S' m) f4 s' y// 外设使能配置6 o: A$ M/ K* |4 c
void PSCInit(void); H6 J7 `- H0 f8 Z% w
) F3 N) L! _& L$ D' z+ M9 O
// GPIO 管脚复用配置! H) s" X- }. P3 D- v p
void GPIOBankPinMuxSet();% N8 r6 N J5 }& p7 L" W0 Y" z
( L& Y! V0 @# J8 q% J1 Y$ {9 h// 产生波形$ _, W4 `4 P8 d" r3 Q4 s
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
) @. `$ G6 M! `void ChopperWaveform(void);! U1 y0 R4 Z$ `1 g+ [9 o/ `
* d1 u& [7 |1 z// ECAP初始化和读函数
) u. g' I% Y9 l, ?0 A7 s wvoid ECAPInit(void);
' d) }% d6 I( V7 J* O" Aunsigned int ECAPRead(void);* {8 i4 y9 h; S1 x
]6 }4 U1 ^) m& j& v
//ARM 中断初始化
; e# c J/ e W5 g: r: L5 wvoid InterruptInit(void);+ J' Y9 G- \0 U$ V
; [7 k/ {% `4 P7 b; d// PWM 中断初始化
/ S3 C2 Q C! w6 ~) @void PWMInterruptInit(void);6 t1 n* t$ \0 ?* |
// 中断服务函数8 c* w( R0 Y* W8 @# b
// PWM 事件( o$ d- L. A$ \$ D
void PWMEventIsr(void);
, v" b8 w* e* D# b$ m8 L// PWM 错误控制事件; W9 w* ]# K$ D. ?1 ]! y
void PWMTZIsr(void);' w0 ~2 ^9 l' [% Z! ]# R
1 B0 X, q3 V7 g9 X! W# ~3 D1 y. a! b
/****************************************************************************/5 d! y+ Z+ X1 S; G
/* */
. V4 h o! d- G6 ^7 _" Y4 Q( X% B/* 主函数 */# C- c. L) H3 ~$ K
/* */( c" k% x4 a8 u6 g% ~
/****************************************************************************/+ Z- b2 L; i" t5 K
int main(void)
4 }! O, X. R7 u( ?" a9 }/ U' r. }& Y{; f9 `. y0 F. M0 v: v
// 外设使能配置0 ^+ ]3 h. s3 A+ Z
PSCInit();& {! j" ?/ Z6 w; x: L: E J
8 U' E; q8 |. h5 {* n // 初始化串口终端 使用串口2" Y" D1 \: y+ j; `2 @' n
UARTStdioInit();& ^* a8 ~% H& |% R
: V7 s3 d% S! o* F& x // GPIO 管脚复用配置, p2 I+ k( B5 {
GPIOBankPinMuxSet();
4 F% k7 ?) K$ h9 I2 u" f' d) B" [3 e2 n8 u- l W
// ARM 中断初始化# ?: o i4 ^% `2 y, S; D
InterruptInit();
7 Z$ L" k( s- r# e: n: V% S3 S' m m- W. l" L" m- A0 M
// PWM 中断初始化9 c1 g/ q# N; X
PWMInterruptInit();9 l& p: s5 Y- x( s8 C, H b4 B
' j( `9 c' ]& j/ D unsigned char i;& t. Q4 y& \2 M5 v8 C, W+ G
unsigned int j;0 c3 s, @# s u7 L( ?8 r0 G- |+ S
* T0 }0 w/ ]' W' t
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
" G4 A3 J2 _% @1 H" B UARTPuts("------------------------------------------------------------\r\n", -1);
* d* O% v6 a$ C% i1 d UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
7 G" Z" K. ^$ l7 ?& i // 产生波形
! l9 t. [( v2 L! l6 F PWM1ABasic(25000,50);
3 _6 v g2 V) c5 G/ n+ D8 Y9 ]7 ^6 g$ ?& z: r3 e: U& J
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
3 E1 ] [# y v/ F8 j( r% P UARTPuts("------------------------------------------------------------\r\n", -1);. k6 A& s$ s7 R+ X/ V; N
& ?* p1 w [$ i8 i2 X* Q2 m$ V8 W" t" {3 C+ M' X6 N) j
x/ X9 q: T9 `8 ]2 k, o5 j UARTPuts("------------------------------------------------------------\r\n", -1);2 c: s% T4 c$ {; { O( r8 T5 v0 U
UARTPuts(" C6748 ECAP Test\r\n", -1); i9 ?% F5 z# t% H, Z: K& z
// ECAP 捕获初始化8 {, \ Y+ _' u! R/ ]6 j
ECAPInit();
3 y& l) D% f: A# h+ N# {3 n* I; ^ UARTPuts("Initialize ECAP.......\r\n",-1);3 w/ Y7 C* ?' r1 u& q( \4 Y( n
for(i=0;i<5;i++)* D% }& @4 c! U1 H
{
& f [; g5 J5 H+ u for(j=0x00FFFFFF;j>0;j--); // 延时
0 J, j6 m% i! J' b' k$ w0 d& R ECAPRead();$ ? W# E# |0 ^5 Q% G
}5 [' P9 D+ K6 `& E$ ] O* q! h
UARTPuts("\r\n",-1);$ s! M1 H) q% k5 a6 C# |; P
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
% }* `0 ^$ `7 Z! f2 D- I/ g UARTPuts("------------------------------------------------------------\r\n", -1);
. ~7 @) Y; d9 q2 d) S- D2 R' S- b# M! m
// 主循环* s- R# q' K! Z+ l/ j/ H
for(;;)/ O- _. C/ P2 f, a
{
" I. n( b, U8 o' m2 d% C7 k" r* \: l2 Q# j! T! |8 d
}/ P# [' F/ h" L- r
}. g4 P0 u/ j# D% U! J
) s2 D" _1 r$ o" D$ q/****************************************************************************/. l# f7 l, j* n v- x5 w
/* */. p' Q) t* ^4 M) J+ y( _
/* PSC 初始化 */6 a) B& G' q; |
/* */
- A9 d$ T& z. ~( @# P/****************************************************************************/" W7 w$ P) O8 k- b5 Y' ]
void PSCInit(void)" a: X$ W( n8 m4 Z- x* e
{
& s/ Y. |5 ]) m! G! K( O- y // 使能 EHRPWM 和 ECAP 模块3 S% t/ F2 O( _7 Z3 P
// 对相应外设模块的使能也可以在 BootLoader 中完成
* D5 k i6 V: m+ q3 C! H; E PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);- _# ^% u. P9 V/ j" ^# T* M9 N
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
0 t% b+ X- b* C1 o}9 F- G% N6 S/ ^5 s5 ?( N9 @- f
7 O; P; e; \( ~' [+ A( s+ l
/****************************************************************************/
" a8 `9 c5 }& P5 q/ T/* */8 y0 h- m6 }, a
/* GPIO 管脚复用配置 */
0 x! \' ^2 D' e- Y2 K+ \6 w$ E/* */
2 W0 |2 C0 O. f: h" J/****************************************************************************/+ s" \! r# U' b! X a. K$ s
void GPIOBankPinMuxSet(void)3 X/ b* M& ^2 V6 q2 p( E
{
1 \0 [$ d. C# W: j! X3 z EHRPWM1PinMuxSetup();
. P& x- u% P, ?
4 r: ?; Z1 E% C+ H, v // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)1 S/ \, }$ s7 @2 q, Q# [1 c, L
// 作为捕获功能时管脚方向为输入6 \$ J& H% r) @' t. T
// 作为辅助脉宽调制时管脚方向为输出
5 w, q0 c8 P, d // ECAP2 / APWM2
" `3 Y6 A" T; L2 l+ I3 P( w ECAPPinMuxSetup(2);- L& k1 R, h/ Q
7 u" E3 H. r! W4 V // ECAP2 / APWM2方向设置为输入+ z- i. B) x) {4 W; Q3 N/ \. S
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]/ |; P8 e9 r4 l8 i" [/ U4 a
}
5 W% a$ E" R( W# I) ?& o+ D1 Y1 q8 `8 N. ?
/****************************************************************************/
% i" G. Y7 X5 E8 G9 M d' t6 h/* */
8 m% w) V+ e: t8 l/* PWM 输出波形 */
; Y: U# s% A. _: ]5 V# l/ J/* */, V' B7 J7 U# u0 o3 v! i1 X& y4 ?
/****************************************************************************/
( r; x$ Y- _! @void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
4 H8 N% x H* @% b0 E% W{
9 N7 S; p& Z7 F; o // 时间基准配置7 s- X+ l; q) H _: v) b5 a) C
// 时钟配置" \4 K5 F7 `1 g3 T, G4 T: Y
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
! x9 V0 ^ x2 c1 e+ _8 _' V
, `9 y) h! H9 w* e0 D# o( ~ // 配置周期
# W' [* [" T- H5 R' @; } EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
9 S: N3 _; Z) L' f) O: k% J pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);- K! ?* Y+ y7 ^
$ `$ T, }% O7 T4 J( R1 Q // 禁用输入同步信号4 m; a& Y6 }3 l
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
( U! Y& f9 l( h5 @ h- q0 Q
4 N2 G1 f9 s1 I+ v b) B // 禁用输出同步信号
9 e( ?* v P9 V+ h" \ EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);$ j8 J) b A5 m) l
i9 }* H1 _) [# T9 k* j // 仿真(DEBUG)模式行为配置( q$ e, U. E6 Y7 H
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
& l, @6 P. p4 L- i/ N' N3 a$ H) f: J! K$ G8 L. i
// 配置计数比较器子模块
0 k2 o0 A5 c$ `% W) W // 加载比较器 A 值
& H; \5 M" S6 H1 z EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
; [) R1 k% w$ ^" z; } EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);* q* k2 f1 L9 c/ a) H
. B7 [" F' _ g! H5 `6 R0 v1 m // 加载比较器 B 值. L" v. D' ~( K/ g7 M
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,6 s: G4 S0 w5 l0 b7 ^/ Q
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
" o4 S# S: ]6 }0 S* k! R' {
( j6 k6 [2 l8 G9 m* N/ m+ A // 功能限定配置(输出引脚触发方式设定)" X; h5 L; ^ }/ O% k( w) |
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出4 X. i: @" V. F4 {! x
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING," f. c" i- }* j/ T% P; F
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,4 K5 k( e [8 d& i! i" s/ v
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
/ ]# |7 ~9 X. g, F* Q3 j
0 B: I7 B$ ~ Z5 Y. G // 禁用(旁路,信号直接输出到斩波子模块)死区模块. Q! }. f% U/ T: O5 H
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
( i0 F4 }% {; s1 W: O9 d5 X8 Q
1 }* z/ b4 H' J; ^" w7 O // 禁用斩波子模块- D4 S. @4 b' _6 K5 N. n4 m1 Y
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);3 x v( q# U4 L7 X8 ^
/ ~* T3 L, {# ], } // 禁用错误控制事件
: \2 ?, Z3 _9 F1 b4 Q7 Q J& X EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
6 c, R- J; B2 g7 Y. C3 q% I7 u" I EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
& [' Q* C) x1 O- @
+ l1 s3 {7 o; _) K0 O$ k I // 事件触发配置
' c% p0 w1 v8 B. m // 每三次事件发生产生中断
& ?( M) Y: h7 w1 K' U EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
. K0 t, Y& Z" I" `% X1 j; ` // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
: A* ]2 u5 ?% k/ q6 ~8 U EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);! X5 v k+ w4 z* [: m# O$ c0 A
// 使能中断& D) n% Q/ A$ g9 P! S
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);% t" g5 d& ?5 R
1 d8 D3 e: L! s/ n
// 禁用高精度子模块7 o" g- o U& B4 |0 u
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);0 q2 S. _ `: s n. {! _3 c- I( O
^& d0 o7 T' v% ]1 o( q
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
4 x" q( t, B, i9 |- z% g} }; [ s' j; o! n
0 l& Q! z9 P; B
void ChopperWaveform(void)
9 X1 g5 n* W3 U; _0 Y: t7 h{
% ~6 l- z$ ?3 x8 b" f // 50% 占空比! s" q8 W4 ?8 ^* X. _4 Y+ k" P
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
4 b4 X& N2 X. m; u# h7 _, l // 4 分频
% r) Z$ s, p: d6 i* b- n( ?* k EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
5 W- s5 i0 I) [% d$ W. J // 单个脉冲宽度* E5 h1 |7 T! U3 x. G
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);$ D Q/ l8 }2 S+ D! j4 z, u7 R
// 使能斩波子模块0 o6 j* N; e9 v4 ]5 p+ D/ L- I
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);; l' ?9 F0 ?( P, _) T
}9 d; b# t1 Y- U# ?% ^. S% t
& f5 X: _7 Z4 L; o/ T/****************************************************************************/
2 I" b- E/ i+ B9 K" Q- F6 f5 T/* */
# f! p" E( X* q% K; T/* PWM 中断初始化 */
7 j, m N7 a: U |3 I# D0 o1 s/* */- M% }3 y4 r j1 [# o
/****************************************************************************/
0 g7 S. l6 v/ d, E5 Gvoid PWMInterruptInit(void)
, i6 C7 d, A% M6 R{
% x- z, l6 @: H& {+ n // 注册中断服务函数
0 Y4 b! U' K+ h, e IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);7 r$ L- p, Y/ o ~8 i
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
8 \& P7 k \: @9 N: h `' T+ ]5 M+ c$ r \
// 映射中断3 U: u5 n: F4 S! X' P y) @0 `5 j
IntChannelSet(SYS_INT_EHRPWM1, 2);4 a) D' j4 A9 E" g
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
- L+ {3 F2 ?4 Y* ]* A
4 u. n' `: D0 A8 L; R8 F // 使能中断( ]. \6 p- t k; g6 ^+ J' @. @& s
IntSystemEnable(SYS_INT_EHRPWM1);3 E2 k. c, O' X# c
IntSystemEnable(SYS_INT_EHRPWM1TZ);/ {, a9 o6 A3 k% @
}; w! E4 U8 i# D
+ j, W' q$ o/ V- ~- k- y/****************************************************************************/7 B+ t U+ }9 h0 j- `
/* */9 a$ k5 o2 w, ?/ @
/* ARM 中断初始化 */' L3 s1 S" W( O7 _4 d- P2 F
/* */- l' v& X. l! P# A$ V
/****************************************************************************/+ o2 H& B# ?% z2 `" n0 o) p
void InterruptInit(void)
2 k8 F4 E/ P) G{! C+ G& z" d4 E* ~' e9 n
// 初始化 ARM 中断控制器
5 g2 b8 V# S0 f9 D6 s' y8 i1 T IntAINTCInit();
8 s; c" Z( `; Q7 H9 C, G- d8 A2 T; ~5 q4 W
// 使能 IRQ(CPSR)
( O) `9 Y& l. {: g+ m IntMasterIRQEnable();
: w+ i2 l8 a1 N% @
" C: j5 K+ X/ e // 使能中断(AINTC GER)
( @2 R5 N9 g" K IntGlobalEnable();. h( p0 m* L. L, X( |- M
+ W. Y5 T) [8 z+ r/ @. u8 i6 I1 i! R% @
// 使能中断(AINTC HIER)0 s, S/ [3 C+ w7 H" L0 U
IntIRQEnable();, s8 y1 Q# U* e8 c0 d/ h
}: [7 z) M1 \- G2 ~1 ?) ~
- ?" b- Z h7 {9 r$ M' W
|
|