|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/' Y+ W# \- f' [* H( P+ u3 p
/* */9 P& P4 h) \9 A3 n8 q/ g1 M
/* 宏定义 */- q6 d; S+ X. A! D+ |( Q8 Y: X
/* */; D3 Z6 O7 s+ ]3 `1 z6 k* k
/****************************************************************************/" T8 a, n4 \5 p3 @
// 软件断点' M$ X$ b0 d% _, n& U% V
#define SW_BREAKPOINT asm(" SWBP 0 ");* [ j" G; m7 a5 h
4 U/ c5 }+ J3 y// 时钟分频4 ~9 G0 x& _' {) e7 F
#define CLOCK_DIV_VAL 228& X. r/ [6 c0 D0 H U# r+ x6 v
' q9 b" y1 K2 B6 H7 L0 }. V
/****************************************************************************/7 N' K1 i' e1 i" P$ B- X% V0 b+ B
/* */7 X P6 C9 t) } R7 U2 U6 P
/* 全局变量 */7 j# Q" }* A @2 R* J9 x
/* */- Y5 o. O( V# s
/****************************************************************************/
4 Q; a- r$ y& J9 l IECAPCONTEXT ECAPResult;, Z% ]; S2 A3 E. p0 Z
! Y( \; U$ O0 T5 _" G8 q
/****************************************************************************/! h5 ]& A2 o1 ]# i3 U
/* */" @" @& m2 A( n
/* 函数声明 */& c7 S! J |1 N5 Y) z
/* */+ y: @% H! q1 @- {+ i* y, W/ ^
/****************************************************************************/( J0 B: ^7 r7 q/ i
// 外设使能配置
2 ?0 N: f) q$ K, r9 `2 g& vvoid PSCInit(void);/ n" f e# p$ \0 ~
" r. L3 [+ D! Q// GPIO 管脚复用配置
9 v# }( r1 X* v7 Hvoid GPIOBankPinMuxSet();
/ f1 K% }- B( H, ^" D. ]" D1 e, |1 a3 C2 U0 s$ s
// 产生波形
+ L2 T+ B6 G) R& z. l, B8 {' D1 h# gvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);* k; Y3 t+ F5 z6 a
void ChopperWaveform(void);- _- q/ F6 S0 k4 H( X/ r# B5 I
+ {( p) L1 d E' U" u: ?
// ECAP初始化和读函数
) A1 S9 Y5 ?* hvoid ECAPInit(void);9 A" k+ t! N8 j, u: w
unsigned int ECAPRead(void);
1 M+ ^4 z3 h5 Q8 \* j5 ^
. F2 w7 p1 B- z! V//ARM 中断初始化
$ D s. A7 z( ` t+ Wvoid InterruptInit(void);( T' V& N: c$ F1 P- q0 o+ Z% j
1 E# d" }( m4 J0 F1 a// PWM 中断初始化 n# p' l, e* c/ Z
void PWMInterruptInit(void);
" d$ i# r h0 D) G Q: I W// 中断服务函数) b4 N2 q5 y: y% X m8 C, }! t1 T# {
// PWM 事件
2 \- \' D5 Y3 l6 c0 `1 tvoid PWMEventIsr(void);+ n. o- [9 K2 _$ A7 D2 x7 k
// PWM 错误控制事件! l Q/ z9 T7 e
void PWMTZIsr(void);6 w3 ~4 Z. [% j, J" G5 ]! d7 r
: m, |# Q O( W) F* v3 v9 u- S
/****************************************************************************/+ E F5 b5 z8 S/ N) G
/* */
+ R3 }% T, `1 h9 y/* 主函数 */
* w8 E# f& l& _* G& Z9 l" r3 X! T/* */
( o# Q! r' N+ @, E* V/****************************************************************************/+ O4 a* i s% B6 c) j
int main(void)
% ^ M t: y- g, N" D @2 d{4 T# z1 K+ \$ O5 _' g
// 外设使能配置8 Q# H0 J' H* ?$ e( A4 m: t7 m
PSCInit();
1 E6 }/ J; R& Y, e0 e4 ^5 }6 N' H
// 初始化串口终端 使用串口2
/ V- J9 b1 C$ R1 E' e UARTStdioInit();
8 `$ C7 B3 h6 e! }: r4 F& {
, P, E" T6 c2 t/ j* h // GPIO 管脚复用配置 B4 ?& W4 H I9 Z$ s
GPIOBankPinMuxSet();
$ L: A5 |7 l7 _& |7 H! J
2 a9 w1 D# G# W# j' K0 [ // ARM 中断初始化2 F$ w' [+ t C7 }) \
InterruptInit();4 b7 M9 ^6 V) p
1 u! X. z4 C% c3 \' {) {- y% z
// PWM 中断初始化; F. C2 J: A2 n+ E: G0 z/ o' a0 W
PWMInterruptInit();% R' l% w- j) ?: V
# ^) h( M4 r( v! }/ [5 r6 K
unsigned char i;! f6 [7 Q8 B& {1 y
unsigned int j;. x8 M* w% \* H: R+ l' R3 q) t: y+ j
' R8 w3 b& I9 u5 c$ H! D
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);* h& b- }, E' `3 m
UARTPuts("------------------------------------------------------------\r\n", -1);8 v' @% M) b- R' U! Y t5 T
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
% M5 h3 r8 d; v {- k0 b; }$ ] // 产生波形! n* E# t/ b9 w- G9 {
PWM1ABasic(25000,50);3 ]1 m" \ J9 R
* ~; \: @: J) \* Y8 T% d
UARTPuts(" C6748 PWM Test Over!\r\n",-1);% h4 q+ k: Q3 G5 F, v
UARTPuts("------------------------------------------------------------\r\n", -1);, ] K" u- Y, k/ E* j) b* L2 e5 o
$ d! e& k9 T: ?6 w2 \$ f
# F% F, P# X7 `8 q) f5 @5 E: _/ C' z
UARTPuts("------------------------------------------------------------\r\n", -1);+ N; b) ?8 r9 b* Q9 X2 X
UARTPuts(" C6748 ECAP Test\r\n", -1);
: E* B# a6 R7 }( c+ e7 ? k1 R7 Z // ECAP 捕获初始化# X( G; P9 j2 f6 t( p
ECAPInit();1 N N# N- Y t4 [, A
UARTPuts("Initialize ECAP.......\r\n",-1);. P. ^* g! w0 r. S) G
for(i=0;i<5;i++)" u" g1 h# f' r4 E3 @
{
' k% y3 ?* Z5 B" r: Z for(j=0x00FFFFFF;j>0;j--); // 延时
% m2 g) L# a; l5 p" t$ v7 w ECAPRead();" F/ E; {' d2 c- c
}, s6 |: v* A1 b; _) \; h" n. q' H
UARTPuts("\r\n",-1);
& H+ R9 j) \3 ]3 ~% G/ O UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
$ ^5 R: v! Q8 h) Q- u" U8 [ UARTPuts("------------------------------------------------------------\r\n", -1);
, T" |$ a' v A" X, J
8 G/ H8 Y1 d" F' t // 主循环6 `/ r' G# m% w$ Q
for(;;)
' N. T- j" U+ R! ~; L8 u R$ g {" `3 N. D" Y* R8 B/ M: m& v
) f# ^/ G1 c& M$ a }
& [9 s3 I, b8 i$ ~}
0 S1 s: `, I8 v9 s) [! g# }* b& G% k1 X" K: j8 [0 x5 @
/****************************************************************************/
5 e9 X* Q6 t4 h3 b# [* v/* */
9 f2 J5 Q) E! }1 D! M/* PSC 初始化 */1 _* ?! {& e! A7 _* m$ ], d
/* */7 ?' P# U, X2 ^4 R
/****************************************************************************/( j, @: C; U! A3 z7 F& ~. r
void PSCInit(void) `+ Y5 l; l: W. h9 Q
{
6 Z$ M2 p/ V" J9 R // 使能 EHRPWM 和 ECAP 模块
v7 M) f5 p# a3 i# W2 l // 对相应外设模块的使能也可以在 BootLoader 中完成5 `- O" H' V# N* o6 E, I0 X
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);' ]6 ~) U" Q( s8 Y, G3 Y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
7 k2 n3 b- H! l8 Y, M0 R3 v! {}
% q* U# g Q* O9 u& x
1 g. |2 N+ s# [* h1 x ]' |. F/****************************************************************************/# Z5 Z2 b4 q! ?1 T- y+ ?
/* */
2 V8 a& h4 Z6 z: `8 z7 o* k: N/* GPIO 管脚复用配置 */( p" @( d* O+ W: ?' w0 K4 ^
/* */
% C+ Y2 c3 A, `8 R- J- k/****************************************************************************/
: f2 f' s5 S& q- f( S' Ivoid GPIOBankPinMuxSet(void)8 d6 s( \4 {1 L& U! M1 X
{
+ x$ n/ I+ k' l' j: H9 w6 i EHRPWM1PinMuxSetup();
- N9 m6 d6 K9 }. i) O; F1 }0 W$ L( w% U& o' w- D2 l
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)1 F9 g9 q" H9 ~- u6 e/ D" M
// 作为捕获功能时管脚方向为输入
, ~- A, F! ] s8 C+ H // 作为辅助脉宽调制时管脚方向为输出
3 p$ X% s m0 C // ECAP2 / APWM2
2 f# V, p% X" ] ECAPPinMuxSetup(2);
; \' t! n9 \( ]; r$ ?& ^. m
/ z8 q8 ?( g- u# c/ g // ECAP2 / APWM2方向设置为输入. z& V% Q/ R; L" N4 V$ e1 Y$ J
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
% A1 L9 x2 ]0 ~}/ j5 K# {' V, L1 n w
5 b' k: E, L# f; l. N, Z2 M
/****************************************************************************/
) p9 J& t1 L. {4 [, p7 X/* */
$ f$ k8 ~' x3 ~, p! p6 }6 \/* PWM 输出波形 */" K9 E/ ]* B3 u+ ^& D
/* */" r* P+ @ u% L* ~" r0 H- M
/****************************************************************************/: m" r; @6 Y% m$ ]+ k1 f
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)- _# v: `, r" f3 @ `4 [4 \
{
0 ?5 |; F! Q" l) h: W, T4 I // 时间基准配置4 a% u: C& v' | E/ r/ ?
// 时钟配置" F" z5 U, \8 W
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
4 _5 t5 z8 O h8 V$ `: l
. K; J+ [" ~" \) k6 u y- x // 配置周期3 x# k% U- O g- }0 ]' F
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,0 I' H7 u1 b% K9 \! G3 S( l0 @2 s
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);4 Y a9 i, q' {6 F1 L( @' U
6 k, h% _: k0 H
// 禁用输入同步信号5 D! E8 _* h' M% P$ X
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);, o) K T$ Z; {* @' e
9 y0 Z; j$ S, Y1 \, s
// 禁用输出同步信号
9 n' U3 M% U$ U! Q) {+ \$ O3 m EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);; L0 D( Y$ _* B" Z3 r
- w3 ~; b l; L/ X7 C9 g
// 仿真(DEBUG)模式行为配置
. G/ Q7 S& f- ]& J* U EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
8 o( S# ~; R) D4 V8 ~) U9 b
& k- n: }: g& m& D7 s2 s7 P // 配置计数比较器子模块
9 R6 ?& f# `$ ]0 x5 P! C0 v // 加载比较器 A 值
7 Q' _) f7 v8 v3 o EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
( j- v' T: Q* l1 \ EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);/ `8 X5 s' f8 u9 f0 ?( `1 X5 B
& O W* Y9 L+ I& j9 t" V // 加载比较器 B 值, J' K S/ G F S6 I9 H5 U
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,8 X( h5 `" g! z# S1 G2 I1 ]
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);; r: {4 ^9 `0 Y5 l
3 t; m+ o7 C6 z. f$ D$ J( E // 功能限定配置(输出引脚触发方式设定)
( ~9 T( N/ d; l+ ?+ Z // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
p! c6 H/ }: {" L EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
! _- s5 V y. [ EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
) o& L5 j4 S2 p. q# K7 m EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
7 F8 {' s4 n4 H% W4 X2 h' f! o' G! n0 H
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
! n2 o) M6 ^& o+ g3 H EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
, v: A7 f1 r4 c; y9 Y) K! U
* x( r. W6 }$ E7 E3 [6 Q9 Q5 L // 禁用斩波子模块7 y `; h! B3 n. j3 Z
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);# p' J/ q* H) g
" Z3 y! m7 m( ?. |6 B- h // 禁用错误控制事件5 {8 H7 Q" w; P, D* w
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
% O6 S7 \& x. i- _ EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
1 e$ u6 s* G C3 @% l9 `9 o3 ~! J# r; J
& o( E0 x9 w0 W; F& s' h. |. J // 事件触发配置- a1 Y, ~; h, j1 q# h
// 每三次事件发生产生中断
; Q2 T K' r; S% a) E EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
" P$ `! R7 [2 S# `; q // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
# {: s- U0 w& F w$ K EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
! f# n0 ^! R! g5 _. s3 b // 使能中断: N1 M) \# b8 Q( e5 f
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);9 S! O7 `/ }$ B' G; p
. x6 [) b- l6 H, `; H
// 禁用高精度子模块
2 C6 H1 x2 H7 a( D3 R EHRPWMHRDisable(SOC_EHRPWM_1_REGS);, e4 n: H2 _: c2 z& W7 O& Q% t2 d
- b3 l c; F% N
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
1 h0 N5 E. h& S. k8 w3 h( Y( X}
! O2 B0 B" C, Z) Z1 W3 V8 }; B3 q/ e3 A. O
void ChopperWaveform(void) i: Q5 G) s1 l6 Z
{
% }! \4 S% J* n$ \9 A% j8 ?% { // 50% 占空比$ q, X- l% Q' f9 |
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
" g3 ~5 Z7 t. h // 4 分频. s* _+ c5 y; ^
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);) e. M& D0 l4 O% }
// 单个脉冲宽度
* y) \+ T3 g. l EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);; S7 n. o+ n; i) v+ W
// 使能斩波子模块( W* q9 q: D: E, w
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);) Z8 V# Q, ]) c& a9 e w. s
}
1 O. g o! }2 d: _6 h6 @& J, s( T! z, ?; }7 B2 }
/****************************************************************************/
0 s' u( c) \& E- R8 \1 \/* */2 n3 n0 m" ^6 k: o4 _! Q
/* PWM 中断初始化 */
/ d* s8 I% s! [/* */
1 J( ?, O8 C8 R: I/****************************************************************************/
0 Q- J/ v7 h$ B) Ivoid PWMInterruptInit(void)
* s* }/ J0 g* ^; Z{
g* M6 N3 p8 z1 t" u' W5 W // 注册中断服务函数. p1 E: R2 j: n
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
3 }5 H/ j" _; z6 q/ V) v9 N IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
3 i4 r" b1 [4 q D X% t6 m* l
8 X4 b* K+ r) B8 G // 映射中断
. J4 f/ T: F' A- E8 w x% o IntChannelSet(SYS_INT_EHRPWM1, 2);3 i2 }% u* r& f
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
/ Y* T( \5 Q% K; I
9 y9 A! P& a2 I# U+ ~ // 使能中断; o7 T2 h2 D( |. y$ y5 D. B0 z; n9 |
IntSystemEnable(SYS_INT_EHRPWM1);* |1 J+ n9 l) \
IntSystemEnable(SYS_INT_EHRPWM1TZ);
3 v O' A8 f& i8 x}
! q E4 X( ?3 E+ V4 [
% m* I9 O2 W+ |: P! `/****************************************************************************/
8 ?3 f0 Q( Y8 D/* */& v. h1 F. D: t- h
/* ARM 中断初始化 */
! d) A- o0 G6 T O6 A) R5 s/* */) L9 p* g% W$ P* x4 v! R! t
/****************************************************************************/1 }0 p% E6 J ?' g4 x* K
void InterruptInit(void)
# \) k' y2 x; T9 x" i: h{
; t: l2 O! o7 X: B8 A* z // 初始化 ARM 中断控制器
8 h. U; _4 s# M/ f$ c# {! t- @9 p9 T IntAINTCInit();
, O( B; L7 C t) ^3 Y# D4 Z1 h; d9 ?( [- _8 [2 X& w* K
// 使能 IRQ(CPSR)0 }: P) U: _2 N4 w7 Z- T
IntMasterIRQEnable();
" W( t; F& w2 n' d& w# j) M l
8 v' C& L' \8 w ^* a* Q, H0 N# ~/ ` // 使能中断(AINTC GER)4 Z2 Q- S$ t9 g# M
IntGlobalEnable();
4 t" e! K; y4 a2 h- K
4 ^4 `. L3 t' [& e. i // 使能中断(AINTC HIER)
- w/ q. ?9 ^6 Q: Y6 @) F+ u IntIRQEnable();
2 o! ^" ^& w0 V% t( M4 X& l$ `}5 _) o, V L3 A. Q! `8 B, Q% H- b; L
5 H% D6 c+ I4 p9 B0 ^
|
|