|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/6 _ u. z! c0 [$ }( v
/* */
a% l3 A$ m7 ^3 N8 ^/ V/* 宏定义 */, n+ v' a8 H y; d
/* */
$ d3 E( Q/ d0 E% |! |4 Y1 T/****************************************************************************/
. l. [$ ^9 k$ p7 ~9 ]# J7 `// 软件断点9 d- t# T2 l/ J/ ?
#define SW_BREAKPOINT asm(" SWBP 0 ");; [. g! m% D I8 b d
/ J2 a- R: N+ \// 时钟分频; ?1 b4 }5 K! u( G) z4 |
#define CLOCK_DIV_VAL 228% L2 \( Z6 T1 U) I8 Y
: ] v8 F# W5 c# A" t! d/ M% l: l
/****************************************************************************/0 X: ~/ i) M+ A4 M
/* */
+ U* Q+ K! y# r; [. z$ G9 q* _/* 全局变量 */
9 d0 t6 ?8 W6 y* ?+ {0 s/* */
W1 k0 S0 l" @! d9 |, X/****************************************************************************/
2 J7 w4 l' r! I9 o+ H4 y3 hECAPCONTEXT ECAPResult;3 ]1 E, @* b7 V
( W0 i/ s& S! p3 Z/ i1 ]4 {! O9 h2 G/****************************************************************************/+ J; j: x( Z% O( O5 s" o" K6 P
/* */; k& K- K+ _ |7 U- u2 C
/* 函数声明 */5 c# D. I0 k! q8 x" D( i
/* */9 y( @. w' i/ B3 U" B& h- A
/****************************************************************************/
+ I4 J( k9 v# t// 外设使能配置# U& I. @. E* J" T
void PSCInit(void);
- O" N% }: C% g+ M+ p: o1 z, o* c' R* b5 W% \& f
// GPIO 管脚复用配置 }* Y9 i/ u! g0 a+ T8 h- v6 f% u
void GPIOBankPinMuxSet();
1 f% N# K% B; @0 V7 c$ l7 h1 u" k
// 产生波形* W# r4 J6 J2 F6 z% o% P
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, J: Y/ a1 K. t0 ]0 W4 d: c% gvoid ChopperWaveform(void);; k& s( p4 D0 z0 Z0 v3 X, U
* s4 ^! T) f8 ?// ECAP初始化和读函数' Z1 ]2 t+ I0 h
void ECAPInit(void); a; ?- h) E7 r; k
unsigned int ECAPRead(void);/ Y3 \2 }# K W/ ?# k
4 C H3 s4 P6 l! [1 R* n
//ARM 中断初始化
$ c7 x. h* b) ~( K. ]: uvoid InterruptInit(void);
% `; ?) o1 A5 I k( U3 r! E% W- u; L T
// PWM 中断初始化4 K" a& l2 ^: O9 a
void PWMInterruptInit(void);$ G" m. b/ w( I
// 中断服务函数
' {8 g. C, N. S; r$ J$ M+ L9 t// PWM 事件' H/ h3 r a7 Y# m/ b1 ~) S1 j
void PWMEventIsr(void);
+ |# P; r+ E# p* L7 l// PWM 错误控制事件
' W* y5 I9 F8 u2 Hvoid PWMTZIsr(void);1 {3 _0 X; S+ ~0 j- a
" }: L7 t- v7 _" A. D0 @- F5 R$ Q$ Y7 @
/****************************************************************************/, c+ |) Z5 v- y6 s5 C9 g
/* */0 F1 }* {, e8 n+ f
/* 主函数 */# B% P3 ?8 l, i! ~. U4 {2 v* k2 k
/* */% I6 Z6 c, N, i+ g1 f1 [
/****************************************************************************/
; T% D: u2 f- x3 n4 uint main(void)
/ b& X3 H! q& C, G( d( h{" v3 i5 G' `7 A7 ?/ k4 D: \+ x% |
// 外设使能配置! H5 Q% T4 ^. c; Q) }$ n
PSCInit();6 J' {) B# I6 c
0 |8 `+ D. N0 N8 s; @) v
// 初始化串口终端 使用串口2
& d1 j8 Z* @4 X0 X0 Q7 o3 e UARTStdioInit();/ v. O* V& t' I+ m( D6 p9 J7 w
+ I: G1 J' z! ?% @9 v/ y/ [2 J8 \ // GPIO 管脚复用配置$ W/ C/ x% W6 }9 q' l( X
GPIOBankPinMuxSet();3 L+ c. u! {7 S0 @
$ u6 T3 U7 L& Y- }1 _ // ARM 中断初始化
* c0 T) f& C$ J8 C InterruptInit();4 ~2 C$ ~: L& J. s# [0 m
c2 V2 e& {9 a: D5 | // PWM 中断初始化
i O: K& v. Y& L4 D1 o$ H PWMInterruptInit();
1 b- R1 K. x/ _8 u$ b( Q* I Y& t. l' i+ o- `! R
unsigned char i;) `1 { x! m# N! D
unsigned int j;. x+ E; I& d. f* O! ?
( R. @7 V- q4 |. r- S4 ~* U UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
5 `1 I$ _- ~# u6 J" h* \ UARTPuts("------------------------------------------------------------\r\n", -1);) m( p! _$ ~8 U2 F- \2 A6 O u0 H
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);- V8 R" N6 ^; O9 ?3 S4 ^
// 产生波形! P d6 R& i3 ]- I2 y- S
PWM1ABasic(25000,50); L3 \5 @$ d% d. s5 Z o
2 N! g- P* j. b y' T
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
" A& J1 A# Q$ _7 b8 X( ] UARTPuts("------------------------------------------------------------\r\n", -1);7 N/ ]& z- r% o: I/ ^8 N! L
+ s0 Y: F5 v8 x( D/ R
& K0 P- |$ h# t3 E0 N% v& K1 L. M; t) p1 F
UARTPuts("------------------------------------------------------------\r\n", -1);
/ t4 m2 h8 k3 D$ o6 d8 }" v2 j0 _; K UARTPuts(" C6748 ECAP Test\r\n", -1);
! ~2 r( c5 U9 Q8 H, G& H // ECAP 捕获初始化
9 }4 y" o: _7 K) n( O7 ~! F ECAPInit();
0 s9 R8 }4 _& t% G UARTPuts("Initialize ECAP.......\r\n",-1);/ p! {9 h+ U; I# p/ @, R
for(i=0;i<5;i++)& L. H- Q. B" s3 Z
{1 D7 u( @8 ~7 M2 ]5 i- B
for(j=0x00FFFFFF;j>0;j--); // 延时2 d7 k" }0 i' K8 R+ ?! t
ECAPRead();3 i9 j* v) W# R! w
}
4 x, ]3 a( S3 N* j+ e UARTPuts("\r\n",-1);
% x. t" A# F* y0 f; {$ N6 B6 Y. }1 ^1 o6 M4 } UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
( @/ m* m& D6 o3 Q& `: e- s/ @: j4 i UARTPuts("------------------------------------------------------------\r\n", -1);
" M7 j" n5 H# @
! n9 j' Q0 b8 z // 主循环
7 V- g9 [. z3 M. y/ z# R, J% s& R for(;;)5 {( }4 M+ P& I/ g1 ?
{
! F! C2 W- ]+ p9 ^# R7 }$ s' g/ o% b$ S" A) T& L$ h
}5 M5 S: q( x7 I8 s+ X
}
+ t9 E( |; p* B" {* d, e
1 R3 z- v% X7 l2 x Q9 H# ^/****************************************************************************/
! I- Y1 }" a& r8 a/* */
) y- A. c0 C8 j2 u/* PSC 初始化 */
2 a2 x2 @3 `* X0 f0 g' {* p/* */6 Q! M$ T. N1 O6 ^
/****************************************************************************/
+ ]: q' B7 d' b6 K$ g9 L) U. Avoid PSCInit(void)
" z) m: f% c. [1 U{* O2 z: f6 ~6 {4 p* K* q$ M
// 使能 EHRPWM 和 ECAP 模块" m V% v, f- Z& e
// 对相应外设模块的使能也可以在 BootLoader 中完成
3 D& E- ?7 F3 P( ]% y- @6 u2 k PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
$ B; B- R6 r2 ?6 w' v5 { PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% w: W# G- W) W$ N! X0 Y+ f}
8 Y5 F$ O% b; k
+ R1 T% [. O% f/****************************************************************************/% B# w% c, q' ]0 i
/* */
1 { g' k/ {0 [) _' |2 Z$ a9 f/* GPIO 管脚复用配置 */
8 s" j+ [3 Z. P( p/ _2 s' ~; }- P) d/* */
7 L0 f) j6 V" u+ L* }7 ^0 ^/****************************************************************************/, @0 Z3 G2 n/ I
void GPIOBankPinMuxSet(void)* @8 a, [ q4 ~5 L/ r& S. B
{
' Z% }9 f+ N" Q EHRPWM1PinMuxSetup();
) I) @1 ]: b; s( W2 R
4 _3 [9 \7 [8 n! U2 X7 q$ ^( U // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
F$ `8 d" K" l3 H) f7 g+ ` // 作为捕获功能时管脚方向为输入
n# ]5 O% @" J9 e // 作为辅助脉宽调制时管脚方向为输出, G) S8 M8 [8 R. f, b- w
// ECAP2 / APWM2
8 Y0 d# R2 F7 g ECAPPinMuxSetup(2);' y" q8 m) ]: l1 U
# W+ {6 N5 ^0 V( j& A // ECAP2 / APWM2方向设置为输入* Q' M- @9 J) O: ~
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]! t- i8 f# o Q
}6 s, R3 C9 ^3 p/ Z- W9 F
* Q, ^* H% Y& |- a$ U- a+ q/****************************************************************************/8 ?& V+ n$ r0 l+ n0 O
/* */8 C o0 r9 Q& V2 H
/* PWM 输出波形 *// r% X: }4 h" Y' V& c$ m, q
/* */
) D: D- ]9 O4 x% A4 N( p, y7 s+ d/****************************************************************************/
1 ?" ~. g2 m( J4 c1 Hvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
9 i+ P* F" y- q' O{
/ b! r& t9 p5 V7 u3 `4 c7 r6 B: o // 时间基准配置2 [6 W! l/ U6 b" E% l
// 时钟配置) n" j! A5 k/ ?' w% E
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" e3 P$ G1 c2 s. A1 z+ t
( z$ V# z* u5 Q) ~7 @3 S R" ]5 s // 配置周期
- {! x" u" |/ E' `1 m0 ^3 ^ EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
$ j: T8 V$ c5 l/ o* H S1 l pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);$ Y, x" o! O) X% a; ?/ q; n- I% M& i" ]
( R4 p% V( \. a- U: H" T // 禁用输入同步信号
5 @2 G- r C+ V EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);/ X: J6 X* P0 W* q% @8 B
/ O+ Y4 {1 E3 G* e/ B s6 }
// 禁用输出同步信号
8 m' F" u1 t9 Z1 _, }' K- |& o EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
4 v1 m( ]" v/ d: U1 m4 y1 j, u& t9 \
# v% k6 {" P- a( g+ s" F // 仿真(DEBUG)模式行为配置0 p" O0 ?: [* q9 L+ A
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);& ?$ V7 e6 M3 v) r
' I( q* a I+ B) I! H
// 配置计数比较器子模块/ Q+ M3 ^) N8 i& S* U9 a3 d4 Y% d
// 加载比较器 A 值9 { Z( j( ]) p# K
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,$ s9 D* \" G; y& Z4 q. D; D
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. q% E) A4 d& B! a
/ P& [- o( T. w& c% e o; U
// 加载比较器 B 值# {4 i! D% c, N$ S t
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,+ T; o9 P8 v! I' ?( r' T1 E
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
$ g) A6 m2 A- l9 K }: I) y- N: T; o
// 功能限定配置(输出引脚触发方式设定)
" I3 r0 V. s. S9 a: D" l: R // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出: E4 o# ^2 p0 E1 M$ t! X& r1 M
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,# E4 Y9 q/ ]1 r- L" Y! _
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
& L' B, P! s9 y) d1 m EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
' \( b- p0 C! ]$ F! e
' Y1 ~. g$ Z& B$ F3 L H // 禁用(旁路,信号直接输出到斩波子模块)死区模块
( j' |) P( O2 `6 @7 ~5 x0 e EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
5 @) C, ~. R2 g" u# @8 e3 I" n9 |2 a; L" q7 J i, \
// 禁用斩波子模块0 q4 V& f6 v$ M( T3 H8 |
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);2 Z! H5 w& |5 V$ ]4 i/ v+ w
7 |* h) W R' D( A v
// 禁用错误控制事件# P* @ r$ g$ ^, o9 W
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);& u# f2 g( j6 h. ?6 x
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);; m' G, W2 P! o2 [
3 J# W; N4 x0 \ // 事件触发配置! K9 Q5 A+ P3 P7 B1 V9 B
// 每三次事件发生产生中断
/ W% w* G/ B; \; G) L3 K6 V8 i EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);: z9 w5 @6 [/ C/ J! R1 J9 \/ y
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件4 b. h! z& o1 h) Y. |! n6 ^
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);7 b" S! V) w. F1 C% t; P7 C
// 使能中断
, h7 `$ [# O) L EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);8 Z/ ?& q8 C, s- ] N
( }5 B3 i; B7 F0 x4 r: J! P' N
// 禁用高精度子模块; d0 T. I/ p; t3 C4 U7 M6 S
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
! R7 e/ i% k2 a1 b1 |) o5 [! k- T
: G: O+ b- k$ l8 D* y UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);7 P9 @. r' h6 b; ]
}: r2 q( D8 k3 @% P9 V$ C7 X, s
9 f* g9 S9 y/ i7 P' p! W& Avoid ChopperWaveform(void)- U6 A% I6 c% F% k, ?3 {
{
) ?$ p+ ~3 y; K! O // 50% 占空比) b: B8 x. ~0 L$ S" @$ l1 v
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" o" T) M' o9 _9 r7 d( y* x. Y // 4 分频
" Q/ @( ]9 `& ^" t4 Y4 j EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);+ G9 O9 n0 U. ~
// 单个脉冲宽度
% q2 p5 q9 R. {) G$ ]3 O8 j EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);+ t0 c5 i* a. C4 u
// 使能斩波子模块
, C0 Q/ x8 ?' C; \3 C EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! ?; o2 c3 y9 S2 f* C1 E}
$ j" ?; p2 P9 }0 P( v2 ^8 }, E# l* }4 A; A
/****************************************************************************/
& l/ {9 J2 v1 U3 y/* */- s9 i+ l3 Y5 E2 \7 G7 |
/* PWM 中断初始化 */
# o, q2 E" p& W) p. B/* */; @! L# q) x' }2 p/ c
/****************************************************************************/( I% U- _% w: c; i& c" f: s% B
void PWMInterruptInit(void)
7 i; B& V) N6 r* i{/ `, C# p# J9 }9 B8 q9 D( _" V0 U1 _6 _
// 注册中断服务函数
( n6 v4 \( M" a# U IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
) q8 @5 Q! v# u! u IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
$ @* ]# z1 s/ L- ?3 T3 v2 a& i
* v/ L0 i! q5 j9 }6 g+ c // 映射中断" M; M: ^. e5 b
IntChannelSet(SYS_INT_EHRPWM1, 2);/ E5 {1 w" p3 o+ `
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);6 W" p) X$ u) ^) T: |- T* ~9 \+ \5 {
" @" ?1 @ q3 y$ E3 U k+ u // 使能中断9 ^1 @# F3 F; z5 z1 h
IntSystemEnable(SYS_INT_EHRPWM1);
P: S* v8 r! k& Q1 v- [/ J IntSystemEnable(SYS_INT_EHRPWM1TZ);' \0 F) D$ K* ?! j! O4 U. E3 b0 G* v1 i
}. [' t1 q9 I$ J* Z& @/ l# H
" o! l# G/ j5 S( {# \$ z/****************************************************************************/
# \, A/ V7 ^& o& G% Q- f% [/* */+ X- k/ f( K6 E% E8 T4 Q/ E
/* ARM 中断初始化 */+ a9 m" V2 R6 O+ y* r! ~: H3 I* z
/* */
: `: m4 B/ R. r8 l- _/****************************************************************************/: k/ [9 | y- w$ l. t1 O1 p
void InterruptInit(void)
6 Z/ }3 ]& S; r; e7 D9 }5 e4 a! y0 \{
- p* q m+ }, D% f4 k // 初始化 ARM 中断控制器
) g0 h: {9 s% }: {: _' J. m IntAINTCInit();
& M6 s$ x* I, s" ~
% {7 P( M! m; W R7 K" V0 e0 T // 使能 IRQ(CPSR)
2 e$ J* U) K) J3 [ IntMasterIRQEnable();7 \/ P) y! m! x: A5 O2 }
; J) a s; K& A5 g
// 使能中断(AINTC GER)' S# e$ k+ x7 z7 F" O/ b
IntGlobalEnable();$ C7 p1 q2 q( d0 ]& Q( E6 U. h* J3 @
) Q3 ]) }7 |% T3 n5 T D3 [2 E! I
// 使能中断(AINTC HIER): Y( p2 o/ H5 `/ N
IntIRQEnable();( d; ~8 \ d% Y: f: X/ p
}
5 l) `+ r* o" ?7 d1 t
) x8 I4 J s8 I1 c" ^ |
|