|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************// U0 f3 Q5 z- ], [
/* */
1 ^& E, U( A% Z/ Q. r9 A, p/* 宏定义 */
0 T/ ?0 Z4 L7 ]* C5 _. [; m9 _8 E1 k/* */( ^- _ f4 W9 c7 z% |. C
/****************************************************************************/
M% a# F7 Y8 u$ ]% a0 s// 软件断点
* W4 w$ w; }# u7 N+ t#define SW_BREAKPOINT asm(" SWBP 0 ");& X. o7 |* `5 F) e; f; M
* h$ h# m. B, j+ s. r* z6 p. X- [
// 时钟分频
3 _$ C# u+ R9 z' ]. X4 |6 T#define CLOCK_DIV_VAL 2288 k! g; ~" P4 y0 H1 J2 |. Y" f3 ?
8 }$ {2 I1 Z9 x/****************************************************************************/
+ d1 z% H0 }& M) s7 z% K/* */
) n1 y/ x, o5 `9 |9 B& S/* 全局变量 */
: X, B. k+ D6 R' P; y& M& _9 K* L# x/* */
7 V8 L7 h! \$ Z. a5 J, E3 T/****************************************************************************/$ S! P5 A- ~6 d' n: k- ?
ECAPCONTEXT ECAPResult;8 ]! V; g. k$ x, X# e8 [; t. f" J
& j' ?/ @5 o) u4 z/****************************************************************************/
7 Y: f- F# I4 V' z# _& w/* */7 ^9 ]0 d0 {$ e% M
/* 函数声明 */
: s8 ~$ Y- S$ r( m5 S+ l: g/* */
* `2 g" q1 I% y+ I" `% O/ K+ T/****************************************************************************/, r% N+ a0 S1 b2 g
// 外设使能配置; ^, z( B5 ?4 n" ]# j' s* J5 ]& [$ O
void PSCInit(void);
8 y, z. K9 @5 \" A# L9 ~% z
' J2 `: j+ N/ A$ w2 H// GPIO 管脚复用配置
; H' n+ t6 W# g- b: R, @8 Jvoid GPIOBankPinMuxSet();( Q# j7 _9 |/ k& w
- `" j' Z; D7 N// 产生波形3 o T/ V9 p, m( t; p, k1 D o
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);6 T/ L) [- E" s" O! {! O m) D4 F
void ChopperWaveform(void);
* e$ T9 Q# t" u" \; b3 O# D; D
- Z% A% y' b2 `9 G3 E( k# j// ECAP初始化和读函数1 X) I& j! k% }; S& M* J$ c
void ECAPInit(void);
1 D- k I: {# R4 q& y M: {unsigned int ECAPRead(void);
, L1 I+ [- @$ J/ }+ ^
* k+ r) t5 Q/ V- V# X2 D//ARM 中断初始化% o# c) P" P3 G' |6 n
void InterruptInit(void);" C; }$ {. x- k0 v9 x! M3 H: |) r
' M/ ? _; y1 ^0 D// PWM 中断初始化. r- T- [4 ]" K4 E7 u
void PWMInterruptInit(void);
3 q. g# m. ]* M z// 中断服务函数
1 v0 |9 X, ~5 }0 q- e0 ~// PWM 事件. B4 S% a( N: b% _% t' \
void PWMEventIsr(void);, d. `* t7 e1 u% {
// PWM 错误控制事件
) z9 t0 n( U7 K/ ~6 Dvoid PWMTZIsr(void);" _* z# T6 S! S( K$ ^, I* K
6 d& j1 V g3 ]* f2 L" a/ Y/****************************************************************************/
3 h- v D C) x/* */, L& u2 g5 ?$ r+ h$ x$ ]8 n# `$ P
/* 主函数 */
. t: K$ R# Z* x& `/* */
, E* e9 R- u3 `) q. Q/****************************************************************************/
& M8 ~, U5 y: |int main(void)
C0 V, [6 B) ?{
. e8 m' w5 `5 V3 `2 q" I // 外设使能配置! h' ^/ s( _/ A
PSCInit();
2 k( s8 k( n9 J1 E
( `3 o$ \1 L7 {+ n6 \ // 初始化串口终端 使用串口2
, t( A7 O8 u- y4 }' i3 G UARTStdioInit();
- I% I) x' x' G' R 4 F$ @ E0 R% z [% B7 h( y# e; a! g
// GPIO 管脚复用配置0 _/ B' H. Q( g% P+ Z& S, P
GPIOBankPinMuxSet();1 p* ^$ D9 y7 d( `5 W0 S/ L! m* d
; o! L+ K& h# g, p
// ARM 中断初始化% i% K- s5 {8 R' n
InterruptInit();, d: y# D; ]$ Q
( }# [2 s k1 r; Q) T# S // PWM 中断初始化
+ l. D6 h% @# ` PWMInterruptInit();; A% q9 `9 x/ S$ l
- ~0 p& ^- ?2 a6 I
unsigned char i;3 I6 C2 C3 G) J3 v
unsigned int j;# y: R' _5 q1 ] T1 z1 h
6 d5 O# u* ~0 ~: R7 @ UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 H+ i, F" ^& y0 A UARTPuts("------------------------------------------------------------\r\n", -1);
" _2 K! s. b8 }/ Q4 u% x1 ` UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
& p2 V+ V h! G3 O' f" h // 产生波形
0 E/ V! U8 h, R$ i1 h1 H PWM1ABasic(25000,50);7 M6 d: M7 f5 X+ n) ?0 N4 B9 c
/ C2 R$ K4 `; K% `( H( x UARTPuts(" C6748 PWM Test Over!\r\n",-1);: h5 k. o. ^0 D" g& l
UARTPuts("------------------------------------------------------------\r\n", -1);
0 X1 `2 Z1 q; p u: ]" N& C% U$ m" A
, Y; T8 B/ \' T! z
W5 r) J4 V: w
UARTPuts("------------------------------------------------------------\r\n", -1);
: R+ Y$ c: P. Y% k UARTPuts(" C6748 ECAP Test\r\n", -1);
9 ?$ G! w0 a4 S- o' d/ W) A // ECAP 捕获初始化
' U, f9 @0 a, y7 s% i: L ECAPInit();9 s, n" \: l) p$ v
UARTPuts("Initialize ECAP.......\r\n",-1);
; t* R: U; l$ j" n! k- p! \ for(i=0;i<5;i++)4 r1 w- s7 M2 ?2 W7 s3 G' D
{6 g& y/ L; p6 p7 n8 i% T
for(j=0x00FFFFFF;j>0;j--); // 延时
& I1 x: \6 z4 a; M5 d; t# v ECAPRead();
' K4 C9 B* D- d& t }! [! t8 ]/ C8 b( K5 Y! c/ M
UARTPuts("\r\n",-1);- U; d7 ~/ b$ W
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
' b! I+ W3 \; x1 F UARTPuts("------------------------------------------------------------\r\n", -1);
# e. `9 {' e! u" c m8 ^1 r: C3 Z/ h! d) _) t
// 主循环1 _/ J) t" J$ k: Z
for(;;)6 |, l9 _. Y5 O$ C9 }; _+ ~
{
8 u, o/ F# w1 A8 T" t. }( a
6 O& E1 P4 a% f5 Q }* @6 {! U0 f8 D9 k
}# N* O0 _0 T5 N l+ D( q/ {
' D3 n! {! Y" i; k3 a7 T
/****************************************************************************/
3 B% k" ?; X. q" A- F+ i! m/* */
2 ~! b, _0 ^+ Z/* PSC 初始化 */ k9 C) @' z8 P
/* */0 I3 r4 b6 H1 `
/****************************************************************************/& |$ ~- T. l% M, B2 [
void PSCInit(void)
7 i& C }' k1 y8 P{
) i3 Y: R V- c0 M }+ c% ^ // 使能 EHRPWM 和 ECAP 模块9 I& y# h0 p$ h+ ~! L1 b# |; B0 E
// 对相应外设模块的使能也可以在 BootLoader 中完成
5 V& P' ` Q- v4 A; Z PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
; O E* }8 h s PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# o1 F* n7 m; {- E, `7 I- ]) p
} h& H7 m+ F+ G1 \" c6 u' ~
' {0 s3 n) h$ G* x' L% `( Q/****************************************************************************/
m+ \5 j/ c( K3 D' ^5 X8 x/* */* V5 \. R. b4 H2 a7 I8 e
/* GPIO 管脚复用配置 */( @/ s7 E* B& k9 S/ g9 h& L
/* */
% Y) t4 f. F5 a# o/****************************************************************************/% F2 ^# C1 s5 y8 h
void GPIOBankPinMuxSet(void)
5 C% p) a& z( E( G/ C{
' _9 O+ @" R" e+ I6 D8 x, | EHRPWM1PinMuxSetup();
& _2 N% E/ t( I/ a# {0 z$ r% j/ A" ?# k0 e
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)+ d# L7 q/ k+ A- E! U
// 作为捕获功能时管脚方向为输入" \7 \# U5 d1 z5 {# C
// 作为辅助脉宽调制时管脚方向为输出
8 \+ n g6 W4 U% t7 z# }+ O // ECAP2 / APWM24 N+ R0 W1 e- ?
ECAPPinMuxSetup(2);# J {% S8 ?; {
" b6 f- _5 U4 v$ M4 }' Q
// ECAP2 / APWM2方向设置为输入5 \0 D6 X! J2 k: k6 _4 A/ e
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]# r$ x# N7 e% n$ d
}
6 G8 e% s+ t, y8 ?$ n- c1 [; X1 k9 S' ?# \9 v0 _* Q: k
/****************************************************************************/7 z2 ~) j q- T( @. \
/* */
" M+ q9 l1 ` A" i; E% i/* PWM 输出波形 */
# e# m% N5 j Z* N a/* */. W( y" o& N' ?" y- [5 d
/****************************************************************************/5 @& k& M' @! a$ a& ^
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)7 X0 h( j" k {9 b- S' Y
{
: s2 n7 Q. L8 G( n/ F+ r9 A( @, K3 d // 时间基准配置
E, c) _7 P$ D // 时钟配置
$ X7 {+ e& s& o EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
2 K+ L. H* \4 _; N v
4 }* F# r2 v! J$ s/ T) x // 配置周期8 u" U& G" M* P- E+ ?
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,0 T+ w; o7 E: g7 z4 {+ H, S
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
' G/ h6 m0 e) h2 [# E$ L9 n7 h5 f
; q! [- C; ^( N& _& Y$ Z& B // 禁用输入同步信号 i6 i- [) R" a Y8 [; q
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
9 R! Y- j; W [% J$ {5 y8 A6 H7 P9 @; m+ f; ]0 D0 B4 F
// 禁用输出同步信号 @8 ]/ l. @# m% y: T) \
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);" ?" |8 H( N$ J6 x
- v( b" x6 n% M- p- T1 Z9 ^. h // 仿真(DEBUG)模式行为配置
% z% q" C H [+ | EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
5 f( ^0 c% K# H/ H# p- B9 \$ N! ?! u
// 配置计数比较器子模块" [. V0 U0 w+ D9 E6 d! H
// 加载比较器 A 值0 H4 ~; H. Q Y
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,4 t; |6 P# z- R/ ~2 E& p
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);( r( C$ A( }- @4 |8 J$ p1 Z1 J
( D6 h5 C% w9 B4 u' s9 | P) x0 C // 加载比较器 B 值
" c* k7 b4 n, Q# U$ f0 J EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,2 [3 k3 Z* `: B/ Q: W U& s
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
. w* G" u5 M; ?/ q7 n
/ ]0 ]+ \1 V, I2 a. v1 K // 功能限定配置(输出引脚触发方式设定)8 Q: N: I% [6 @$ w) n
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
9 O! X P4 W ~) V EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
- q, c7 N6 R$ f6 e EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,/ y Q1 Z& N1 |" \( w0 i! j
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);8 R. C5 o+ [. y9 }$ V9 q9 q* x' x
4 J3 X- C0 K( W+ ?8 ^( E // 禁用(旁路,信号直接输出到斩波子模块)死区模块
8 L2 D7 @' n- N9 o R EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);- w* o" }/ v! f' I
% I' Z( Z) a4 J6 w9 w( h `' s // 禁用斩波子模块
2 Y6 f1 X. e n& J EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);! f6 n* p+ i! j% O! d. h' E5 u
( F$ U4 [/ B( t& l3 R, ? // 禁用错误控制事件0 E+ S1 ^' a1 B; I) }' Y
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 t/ D8 I5 F! ?) k$ ~. v) g* X
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
/ [4 ]( I$ T5 d9 M. |
) V5 M0 ?9 W" Q$ x" ?* E // 事件触发配置- {* M1 A! x# u
// 每三次事件发生产生中断# I" x2 D: O- b+ b. o' n, W: l7 ]
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
4 ]- V% i Z2 h- F // 时间基准计数等于有效计数比较寄存器 B 值 产生事件0 e3 I0 N, m& X% u! R# s4 c
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);) l' b, p6 _% w e& A( D" @
// 使能中断
' `6 w# _& D, { B! S7 T4 X EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
4 a9 a$ ], e6 ^1 A! f8 c( y& B2 L5 F2 o: ?# g
// 禁用高精度子模块
6 |, `9 X: n$ G2 Y. ^ EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- G6 N1 j3 k( P& J1 f9 G; s* R4 p u6 e1 f6 x
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
: S/ ?( m& {! Z Y9 b}0 a% W B; T: G. C
/ q( x9 G9 @# W$ u8 S
void ChopperWaveform(void)
- r* y& F. w% w# z" {! T8 d{
$ U9 W/ `1 U" Q, h7 e# u // 50% 占空比8 M3 d* {8 g7 B$ ]* V# G
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);& |0 x/ @4 |; G$ b) Y/ M7 r2 M
// 4 分频
: l+ ?$ N8 \/ W EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);+ f9 O$ T; T" E c/ f3 c
// 单个脉冲宽度
. e& j* k l- S EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);: Y7 Y: a- S w, s9 J4 I6 ~4 C/ h
// 使能斩波子模块
0 q1 l i- P% {, w8 o EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
& f7 {6 a' ?, N4 d1 |0 m}8 Y1 F* A# p$ }9 d- Q
: H- W( ^7 Y6 r" f/****************************************************************************/& L# ^0 z6 F7 Y9 }1 A
/* */
! N9 a8 r) A3 x1 v Y/* PWM 中断初始化 *// c( o c8 Q. x; y5 O
/* */
* J, Y7 s- \7 B9 n( u) z4 l/****************************************************************************/5 Y! a1 t: S! c. N& l$ f
void PWMInterruptInit(void)
& r, J/ P; J. H! M# L5 j4 d{
) X4 ^$ X: H& B& p0 n // 注册中断服务函数
" ^7 x( P! _8 v ^, h IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);2 u H. t+ U; ?$ p9 k
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
* P( N% F6 S6 P% M) w4 l1 s) A
# ?& [8 {4 j9 k4 S8 z // 映射中断
$ E2 `6 k* S x' r IntChannelSet(SYS_INT_EHRPWM1, 2);
9 s1 @- P: H+ c3 b' }0 V h IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 W( N, @( `) P w9 K1 p, m8 O2 I, v$ k7 J* S9 @
// 使能中断/ _4 l, Z* R0 E. m# Q+ Q
IntSystemEnable(SYS_INT_EHRPWM1);
% r, U, Z, `8 d' @ IntSystemEnable(SYS_INT_EHRPWM1TZ);
$ L' h/ K/ `/ H}, `% g. _/ k- }& s1 j
6 Z( D, v8 V# q$ V) M
/****************************************************************************/
8 `+ N: k* E. ~; R, z/* */
5 Y; f1 P* {# e4 i+ N* y/* ARM 中断初始化 */
$ M' b; t- ]1 H0 g3 W/* */) ^8 b" ?$ m1 ?& E2 ~
/****************************************************************************/
7 @! t. ]& k8 r$ l; @2 k" Wvoid InterruptInit(void)
6 O! n+ W# V6 [* J+ a2 l8 u{
+ z- f8 {6 D; `8 F4 u // 初始化 ARM 中断控制器* T; Q7 B# K( f4 i
IntAINTCInit();! G, U) M5 Z- K6 r# c' h0 y9 y2 I
}2 u* Y6 ?4 o5 @
// 使能 IRQ(CPSR)
6 `, _( R- Q: t V1 k. t9 ]8 U' q IntMasterIRQEnable();
) E; G6 x3 C2 ]4 @% I0 |6 R0 x8 |) E5 c( N& ?9 |3 t
// 使能中断(AINTC GER)
5 e4 h! u/ L. X IntGlobalEnable();1 V9 a& I: e' M% w7 o- M; a6 @
% z2 F. P% V+ }3 `0 @5 `
// 使能中断(AINTC HIER)
! t4 ~) k0 K$ J: d5 b: m8 C IntIRQEnable();
; K* c' K3 P# T+ ]. V}% `" l C5 _, r
: {, u, J/ o' S1 I/ a w% q7 y1 r |
|