|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
5 b8 v: ]! h$ n$ |5 b0 g4 h+ Y1 O1 @/* */
& J: A; K. b1 j% C/* 宏定义 */! D" k0 c1 H8 A* {; z
/* */
% ]7 S5 C3 n5 _/****************************************************************************/
9 D4 b) u( w5 w! b3 S// 软件断点
) B" i1 B1 _1 r5 G6 K9 d4 P" i7 {#define SW_BREAKPOINT asm(" SWBP 0 ");
8 ~9 Y/ P% p% G' U/ [+ g3 T7 X" K0 K2 g5 G
// 时钟分频+ C* f/ x/ D/ C. G8 ~
#define CLOCK_DIV_VAL 228
8 j+ R2 Q p H. V" L9 L& x! E0 W
. O- e& \2 e" }: s8 P) |/****************************************************************************/
; u, N) f; @8 h1 A6 G4 ~/* */
/ T9 ~* ~# Z+ q/* 全局变量 */! D3 K+ Q' Q& q9 D3 y
/* */+ u$ ^7 G! Q6 d2 v3 S+ ~
/****************************************************************************/4 R% Z. w/ z1 a& m- m# f7 K' _
ECAPCONTEXT ECAPResult;
6 o, f- J9 @/ c# o" Z; f0 u# g( Q& m- u
/****************************************************************************/
( V" O% n* p* H& k- C2 k/* */
8 o/ X3 V. N) C% L( P! Y* l, t/* 函数声明 */
0 {" T/ H6 @3 `% x' V/ \/* */
6 b: T3 b3 P1 c3 o) B# B/****************************************************************************/, k- H3 [5 Z2 s
// 外设使能配置
2 O G& Y2 | J x% X" b# xvoid PSCInit(void);
) x' l* Y3 A; V8 l: l/ S
; ^$ Q& q. G, r* g# h/ i- ?: f// GPIO 管脚复用配置
# [2 P1 P9 w# f* w$ h" _/ {void GPIOBankPinMuxSet();
* P) ]/ F- p y, \6 Y' S% Y
- p/ _3 |% T( P% U* k" | h// 产生波形
! p' Q' n) U1 M- jvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
1 E: h4 N* x6 d6 L N8 tvoid ChopperWaveform(void);
. n! O* `% k# _. m( m! R' O Z5 B
% e. W4 E7 G$ d// ECAP初始化和读函数0 O% O- B6 M! e: P
void ECAPInit(void);1 Q& p. K0 y7 O5 c: L; n3 ?1 n
unsigned int ECAPRead(void);; A/ B2 U; s" I7 l8 I% P4 B
3 ~! N \! N' w. {- |; v8 [
//ARM 中断初始化
' ]5 |' L+ H o+ N# G, }0 w# }void InterruptInit(void);! S0 F8 w/ @# y2 K
2 l+ u4 W2 E' P2 m2 o+ z8 I
// PWM 中断初始化
; O: B" K7 e/ j& Y7 e* mvoid PWMInterruptInit(void);) T. k; b& ?0 l6 V
// 中断服务函数
- t: c. K3 b' z n" N// PWM 事件
1 E2 a. O- y! }& B: I3 e: Nvoid PWMEventIsr(void);2 P( T' z% c7 l! L5 }
// PWM 错误控制事件* L5 h1 x. p. R. F l/ W' h
void PWMTZIsr(void);! f$ m8 j# b+ d0 ~% d' J7 B6 n |
- r. ] @! @8 `( ~! B/****************************************************************************/
M3 a6 l6 t; a& \2 V6 Y' Z/* */4 J% ^/ D/ R: C3 }( I
/* 主函数 */# B* F* m# A/ K* a1 K/ @: C4 h
/* */0 C [/ V- k( b$ L, }
/****************************************************************************/- W( x' e4 y- {
int main(void)
3 f: n p9 [3 @+ r{
0 k: z! v! X. v) A // 外设使能配置: \, }( w+ Z6 u' o. u/ D3 Z
PSCInit();* z: v$ Q+ k- Q5 Z
" E8 ~3 V1 B1 C) c/ Q8 x // 初始化串口终端 使用串口2
+ p Z% j8 ~9 @5 K* f0 C UARTStdioInit();
9 c0 D! Q$ j! N0 ]6 f8 B * j! o5 x8 \4 z1 Z, C& R
// GPIO 管脚复用配置
. [. _$ U: [# Q9 b4 _ GPIOBankPinMuxSet();
. {6 z; G1 r1 T* y* H' h$ |6 F: m
1 D4 ~/ E$ W$ U0 ^, H2 W2 n // ARM 中断初始化2 B6 Y: \& I X/ r* ?% x, M7 @# u" _
InterruptInit();
8 Q! }$ |- s T4 K& Q0 h+ P3 X8 w9 Z# o
// PWM 中断初始化
# d* @$ U; U- ]* H6 U Q) E& } PWMInterruptInit();0 y+ a/ x: x0 f: i% c* q$ O, ~
5 X/ Z/ J2 `: \* Y" ~0 T; F- t unsigned char i;% E1 B( H r4 F3 w! n
unsigned int j;) M1 j+ F6 \; L- b$ Q* g
, o T, F4 Y' j9 ^
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
3 c: f6 } I$ Z& s UARTPuts("------------------------------------------------------------\r\n", -1);; m+ r, x3 a$ J
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);" i8 y9 F* F4 b6 b8 Y3 K# m
// 产生波形, j. C* r% [% D% z
PWM1ABasic(25000,50);) c, |! L# V2 l' n" [! m Q$ B
/ S# a. b# N3 k! a$ ?
UARTPuts(" C6748 PWM Test Over!\r\n",-1);; e* a6 n# s* n
UARTPuts("------------------------------------------------------------\r\n", -1);1 L4 c+ t5 V I! C8 t/ ~% p6 H% m1 x$ [
3 `6 a7 i3 u5 R6 u
3 _; g( R9 h5 X# ~7 G( y0 R6 R4 X# u) d: C
UARTPuts("------------------------------------------------------------\r\n", -1);5 _# F: _5 Y( p. W9 l- R; n) j5 m! m
UARTPuts(" C6748 ECAP Test\r\n", -1);: W, ]* }9 G+ r, v6 N- g; I) j
// ECAP 捕获初始化& \! o$ i3 F1 t1 r4 X
ECAPInit();
- F' \. ]" F5 x& o, x UARTPuts("Initialize ECAP.......\r\n",-1);
! j; o" T) g+ m: e for(i=0;i<5;i++)4 I7 G+ k4 `; l& C# @& N# r/ _8 [
{
! i2 `( s0 c7 e* v; f3 T! N for(j=0x00FFFFFF;j>0;j--); // 延时
1 o) x2 M+ I# B. G5 J ECAPRead();
7 m$ j! _6 r: y0 U8 Q( K+ { }
) Q' r8 Z& _5 K5 f1 d UARTPuts("\r\n",-1);
' ~, i- s" T2 S$ q( a8 d UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
/ P% Q* m) J y4 q+ K4 R UARTPuts("------------------------------------------------------------\r\n", -1);' S u& ~" b+ v* l
* R& S' E, E4 U6 \0 m$ w1 c4 o // 主循环, G. z: {! g) s. E R
for(;;)
+ j& P0 e" v5 y; w! d2 z* C {2 l& `2 a- |9 W
/ a7 F- C4 {4 h9 [
}1 N/ u- v" u; Q( p8 @
}+ w, j/ o& o! B+ b
4 _8 o$ {( N" _# q6 @: R/****************************************************************************/7 D! ] x. ]; U( N
/* */+ B6 r8 Q( P5 V5 w& P
/* PSC 初始化 */
! l1 y& L$ u8 D! V) {/* */
' U" x$ o0 U* N2 J+ Q/****************************************************************************/- u" P7 l }/ V" v, B
void PSCInit(void)
# @2 B6 O. y5 q* L, T3 Y% w4 _{
! k) H+ I" M, g, P' k, } // 使能 EHRPWM 和 ECAP 模块% J( K4 S$ W4 B5 k; Y2 j
// 对相应外设模块的使能也可以在 BootLoader 中完成& f" l" M* I: M" ?4 V
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 m& P, P7 Q3 H2 }5 ]- Q! @ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# {# m# @# r" m1 [
}
, ?; q. E+ G: b, E8 P5 [- ?2 W% W4 D6 S$ V( A, _5 b
/****************************************************************************/7 h5 P- k( i4 P) m, z" L) Z9 s8 e
/* */
: R* N- n3 i. d# {; J/* GPIO 管脚复用配置 */( c; l: V( H4 u) `
/* */
7 v0 G) q& ~( n8 x; z% Z$ M7 d( W6 S/****************************************************************************/' J" t) G+ ]4 Y
void GPIOBankPinMuxSet(void)
6 z0 f% x/ H- s3 z, p- g{
" n0 @( U4 w" T0 C6 C: o( ` EHRPWM1PinMuxSetup();
9 a0 ^. B* k! N# ?; b5 Q W* n& {0 {# T
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
9 r( P Y$ C5 d' l% o" \- ` // 作为捕获功能时管脚方向为输入
4 z8 ^% E) G5 p. d$ @8 f // 作为辅助脉宽调制时管脚方向为输出
2 D- m' c7 m$ Z4 S% G7 \) i" D // ECAP2 / APWM2* P0 z# v/ B9 K" ~# b9 @* N
ECAPPinMuxSetup(2);( I1 @( {( U( \! Q( x) a/ r
% o* ?. l6 {- O( Z% a9 b* U7 A9 r
// ECAP2 / APWM2方向设置为输入4 ]" s1 A/ K" d5 U2 k8 q4 a
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]- n1 e3 ~. Y3 F3 y( ?
}* I$ I4 u! | U" e8 z2 h8 E# I& e
- M- A- `5 h' Q
/****************************************************************************/
! g. x- x& L9 {) b/* */
) x* a6 c7 p4 p+ ?# f/* PWM 输出波形 */( B2 N* b, K* Y7 Z
/* */0 V* ?( Q0 y( e) O/ y0 N3 n$ g
/****************************************************************************/
# m+ z2 E- ~3 X y, X- yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)( f. u; c- `2 @7 B7 t
{
3 o/ x7 t! R# H& r3 c; t // 时间基准配置
4 Z4 l( ?4 @' Z4 X' S // 时钟配置
( r. w+ S! g. T& I4 ~3 J EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
' P/ I; o5 |8 e7 W$ V, m7 G% v4 j( B& n. M2 r3 M& T
// 配置周期/ J5 I, m! u' c. A7 _# G0 l
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,. p) l( @) {$ l
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);& m; A* m/ H/ f( i' a
4 Z% k! Z" [3 z: C3 s( A* ]8 t
// 禁用输入同步信号
* Q, \& f. o1 ?1 [! r EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);& M' E5 l0 X: E' K
& A6 s7 N. ?3 f Q // 禁用输出同步信号8 @6 J0 m# `7 t3 [) v
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);% x0 a; |; b, K: `- q0 m7 O0 Y' ^: D% ~
1 R2 c; u; ~* L
// 仿真(DEBUG)模式行为配置
+ g+ q. J! z6 H; M EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
4 I' r# P. P: p, ? \. _5 |8 k0 i$ N: e. j# H7 ~* N
// 配置计数比较器子模块! D2 x" p. ?7 z8 ~/ G
// 加载比较器 A 值
& n0 ^6 Z/ V, P3 V# V1 n EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,% y& `) l" t! V- N
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) j) d! k Q, O
1 Q0 i4 |- {9 `9 _ // 加载比较器 B 值/ t8 Z5 \3 N' J9 ?
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,* E* }! Y3 _' ?& \ Q0 I
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
6 p/ s+ e- V9 y# b% p3 a5 z, t4 c; e
// 功能限定配置(输出引脚触发方式设定)) ] [# {2 j: ?9 l, @. E. Q
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
' J c+ r& |' {) U$ a4 P" a+ ^ EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
. c# f) ~/ [) p8 N1 s EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,& |% W/ ?4 S4 W1 x$ L6 m% [
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
- m0 ?& k% P% q7 U' [. ^6 [, Z; Q# H' @! o% B) f
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
! p7 ]7 x% D8 Q EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 Q1 }' c7 u: v8 O# G
* q" Q ?% ]# ]6 D5 ~1 S // 禁用斩波子模块0 }$ z* G, O" W5 ?; U; F% c: i1 v' H
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);+ c0 j9 G+ f* p
& h& E3 U; y) I
// 禁用错误控制事件
( a$ B2 J2 B- x9 c EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);0 S# H K+ F" I/ E
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
& D# A' g# ?5 D- I# y/ }
+ t/ C, X' n* G. v8 W5 ^% Z8 \1 Q( P // 事件触发配置; n# S: P* M7 p- ^
// 每三次事件发生产生中断
# P f7 ?5 [1 [; v' |1 g( e EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
2 b* V; M4 A/ b; q t8 b // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
# Z- H5 Y% h8 h" h EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);; u4 w: K( n2 z$ A
// 使能中断& I; V# J" w1 S8 ?0 W
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);: ?+ ~; v8 S/ K% \; Y- U
% t; k& y" d/ f' o ^, u // 禁用高精度子模块
9 ?- T7 O% ^: c6 l" N EHRPWMHRDisable(SOC_EHRPWM_1_REGS);/ u# A4 }0 h( ^, q+ U
6 X8 O) l" ^2 K7 ~: f! j1 [. n( r7 S
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
A' R2 }# @) W% p8 Y1 V" [% ]}8 ?; ~: S7 W) w
1 @/ e1 f" z& w5 D* o8 Wvoid ChopperWaveform(void)* X# x' x# D! y0 R5 w
{
4 f3 j0 i, e6 \ }8 I' ] // 50% 占空比
9 q5 i8 R# I, F EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);6 q& O" P0 s3 R$ z
// 4 分频
! }& p& m& D$ k. z& M EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
I1 V- |# q; c2 E // 单个脉冲宽度
/ P: W. Y$ q5 ?2 H$ _3 _ EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
1 w- S8 H" ` W |, d // 使能斩波子模块 e( T- g [" U6 ]7 T N
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
5 }& A4 w' |- L1 e C% K" x* K}+ s) Z1 z% K0 G* z0 Q4 r1 Q" Q
) s" G' K0 |/ N5 ~- y& u* b4 R/****************************************************************************/
8 y. b* Z( N, t/* */
( g. ~' H5 [* L7 J/* PWM 中断初始化 */2 }0 ?7 r- C9 v& R: C2 k* r, ^
/* */
$ E- `+ h3 S! c. ~* V/ N/****************************************************************************/6 S" L6 L! h# h( {# d
void PWMInterruptInit(void)
2 k4 [$ d' v3 p& J; K( s{; T4 z4 H, `$ R$ A7 L
// 注册中断服务函数, z. X1 L& j" X D; ]: S( M
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);) O7 b2 D Y, B5 r" z7 p( v( K
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);% C t/ s1 F5 l- w- d3 w
0 E* k3 q- ^0 l9 {# G; e // 映射中断$ B8 s1 ~4 L& z& I5 \( m9 j0 w6 B& Y
IntChannelSet(SYS_INT_EHRPWM1, 2);
( A* O. C# F2 j8 z } IntChannelSet(SYS_INT_EHRPWM1TZ, 3);* t# I: X. i& R1 ]
% M8 s. ?$ s; N( T8 ]( y // 使能中断
0 v$ k7 |6 ~" M% o( a% \8 ^ IntSystemEnable(SYS_INT_EHRPWM1);; u9 t8 ?1 U5 H4 @: A
IntSystemEnable(SYS_INT_EHRPWM1TZ);
9 z+ E5 Z! X" ?0 f8 l}
+ p6 ^ _/ i: z! n+ N% t* b/ Y) Q
+ ]1 C3 ? F4 e S/****************************************************************************/
( c7 `4 q4 |, Z: `9 J. {+ e/* */! M. t" A$ s. Q: ]& }( i5 L
/* ARM 中断初始化 */+ r- Q; ^3 p) J( {2 m% g& k }
/* */
( P0 {6 M+ o" x' F ?/****************************************************************************/
+ R% }9 e4 s. J0 @. j# Ivoid InterruptInit(void)
8 O9 ^. e7 ` D+ V. N/ O{, }" M% K0 b4 \$ D; `" [1 p
// 初始化 ARM 中断控制器
: ^3 z/ A$ H( v: m5 {* ` IntAINTCInit();+ ]% N: z/ r# O/ d2 X. H1 g
2 ~2 u0 C1 A; e1 E2 _% u // 使能 IRQ(CPSR)9 h, W7 J- H- D/ ^
IntMasterIRQEnable();
3 c: P! B4 q2 J+ ?/ \8 b7 E# O8 S0 E! p4 h) G0 r: @& ?
// 使能中断(AINTC GER)+ i+ m6 E; u# o# I- V$ q/ u5 ?
IntGlobalEnable();
1 D; ~# H# R: n. X3 A9 B+ d
/ z/ z; O0 V& R- E // 使能中断(AINTC HIER)$ B4 c4 M# _/ N# |( e% f- S
IntIRQEnable();! |5 z- B3 U( J+ n% O4 U0 k9 u
}' w6 H4 }5 ?+ l
' Z/ S1 ?# w9 U# ^; X |
|