|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
' \" d2 C0 V K2 v: S9 k/* */% R' C9 r# u& y$ z# f+ v2 f) F' W
/* 宏定义 */1 {1 L5 x" R) `! v* A
/* */9 S( ^ S ^ z% c, U# E/ Y5 s
/****************************************************************************/
3 X; _: T3 W$ ]/ A; S" Q// 软件断点
, H5 ~; m |6 ^% g0 j1 _& B* ]#define SW_BREAKPOINT asm(" SWBP 0 ");
* y/ q' a* C9 L9 I0 c7 |& x0 }. b% f
// 时钟分频
3 x: H! x! Y: W8 ]' @" R7 T5 I: {#define CLOCK_DIV_VAL 228
7 Y. h J9 B) D# F1 n& X" W6 o! \0 x
/****************************************************************************/
, i# ]4 w0 t4 I$ x- e/ k/* */
8 a$ e! O! n" `1 C/* 全局变量 */
$ G6 Q# S% I+ d* H/* */4 \: j8 \ D+ i8 Z( o
/****************************************************************************/
; M# F% U2 K5 u6 [& _5 cECAPCONTEXT ECAPResult;
6 E& h" H; r0 L3 |$ G. R( X! u8 X6 y
/****************************************************************************/
; r: Q6 d% v, k/ x' y$ p/* */" F, `( s* J7 ~7 \
/* 函数声明 */+ |. }: P |. _# I$ [
/* */
1 t9 e5 }* v/ Y/****************************************************************************/) w. v: k0 d! E, p" S
// 外设使能配置
8 X% R8 i. P" t( Y: K5 a/ Gvoid PSCInit(void);' x" E8 ?' _% l: }) ^3 s
* u9 o) L2 j" G: q6 m+ ~+ [! b# b z8 D
// GPIO 管脚复用配置
. n' i$ u, m$ D. b2 U4 ?void GPIOBankPinMuxSet();
+ ]" Q5 `) m( v2 \1 ?8 G
9 E( D f' I0 [+ {// 产生波形
, t/ T5 `# Q* g, Fvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);# q. z2 E$ q$ y! }. b. o
void ChopperWaveform(void);9 Q1 l3 ~' ]8 U; |
, J; U5 V8 Q/ n// ECAP初始化和读函数; O6 h; E' d8 G' ~- ~3 {( }5 a
void ECAPInit(void);/ v0 u& [. q5 h' b
unsigned int ECAPRead(void);6 N2 Q t& G, [4 h% R
% O! ?% E4 g7 {& w
//ARM 中断初始化0 ^" \! O# |3 e: j- ^# u
void InterruptInit(void);
( W2 w0 @, `. J5 o* K, e' N1 d/ I1 e5 n! s! x
// PWM 中断初始化
. ^8 w9 ?9 j, M& w9 M* fvoid PWMInterruptInit(void); U% }, u7 b2 K- y) I {
// 中断服务函数, o0 G" ]9 z4 M/ l
// PWM 事件
$ \1 r# O! z4 Nvoid PWMEventIsr(void);. T Z0 x/ y0 c& Y) u
// PWM 错误控制事件
/ u2 N! V! s, j( s' |void PWMTZIsr(void);
, T4 |7 B! k0 a9 y* b9 G+ U# o9 l+ |3 y. r _; V
/****************************************************************************/, k( F9 [) C+ P& X/ Y4 n7 A9 M5 m4 S. B
/* */9 j% c# n1 D/ b, Z, W
/* 主函数 */$ H9 T7 w+ n. m( W7 X. t# ]
/* */
0 e. F3 x0 H% z/ n* R0 C' B7 O2 w/****************************************************************************/8 z& k8 k. N$ d
int main(void)
, C- Y0 F/ M, d' G! S w. L{
8 T9 {, ]( F& y2 M // 外设使能配置
5 ^. K) m+ b9 f1 ~ PSCInit();7 O3 L: r2 B) t# \' g
8 p2 k0 Z9 l" S
// 初始化串口终端 使用串口2$ U2 d9 n% t6 n( i% F2 y- H* E
UARTStdioInit();
7 B, e* c7 {/ g( ~* W: r$ S0 K 7 n) ~8 G: x0 n
// GPIO 管脚复用配置
0 u1 R0 F. ~+ i GPIOBankPinMuxSet();- H9 I- V& f% K% [8 f
I5 u# _! j4 j/ J8 K" z3 \ // ARM 中断初始化
+ H) [$ s& A i InterruptInit();
9 B: ?8 _" p' q' A* ^, _. R- F* x% y+ O" p( ?! F ?6 N
// PWM 中断初始化
9 I- L8 N) a: H! n6 H ^# K: u; n PWMInterruptInit();4 A# @/ Y( }6 X2 L1 n$ g% i0 M
2 k7 Q5 o5 |5 ~# Z1 m+ A. S unsigned char i;' W5 `9 B' t$ L
unsigned int j;/ e+ R4 I/ Y2 x1 q- Z
8 N+ H) ]1 I# W; x: h4 f) m: ~8 k UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);1 R: X* }: ^ f- x% U
UARTPuts("------------------------------------------------------------\r\n", -1);
8 v. Y' n. `5 l9 r; \ UARTPuts(" C6748 PWM Test\r\n\r\n", -1);8 @" g( K0 k# d( v
// 产生波形- r$ t' d3 @! L2 d) p. ^
PWM1ABasic(25000,50);* T( j u) V! y
9 C" E1 m3 z4 v$ s( r
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
h/ V6 X- r8 l UARTPuts("------------------------------------------------------------\r\n", -1);6 d/ q- J+ o9 C1 J, m5 j
7 T7 p6 |7 h4 @7 G) E
2 W- A2 c q, [8 k! m! _ ~
( y( n% E( v" y" n* |) I UARTPuts("------------------------------------------------------------\r\n", -1);! A7 ^# R w6 @$ {; r
UARTPuts(" C6748 ECAP Test\r\n", -1);
+ Z3 \, r6 j3 P9 f // ECAP 捕获初始化# Z3 H1 I3 C3 M$ d2 @
ECAPInit();
& x8 Z' H W1 i" h1 U: ` UARTPuts("Initialize ECAP.......\r\n",-1);! v- x6 D( U A+ Z: }
for(i=0;i<5;i++)
+ ^: _5 W/ p0 }' h {
% h) I1 x; v' _2 Z- G5 z for(j=0x00FFFFFF;j>0;j--); // 延时" A' {% f3 K' b: p
ECAPRead();
- T$ g. E( K q1 h& q. g$ h1 t, J }
- k& U) E0 O7 }/ d# i UARTPuts("\r\n",-1);
( J9 A @3 w9 \% B* |$ L: U) G8 h* q UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
1 ~8 {" a8 v8 R& [( C+ N( L) c UARTPuts("------------------------------------------------------------\r\n", -1);
$ c3 e2 }8 j& v; F8 ?; U
& [# P) Z; ]4 o% K // 主循环) C* K: p9 K+ R! O7 ?6 ]
for(;;)
- W/ ^. M" t3 I( r {5 S' W1 L2 K' I' |; _
$ O- U: B7 z: F; `5 ]) U* } }
/ U. s2 W2 U2 G5 x# f}
) Z/ Y$ z1 |4 }1 ^$ G; d. ]" g1 n
9 x! I& f5 y% N: U/****************************************************************************/3 x6 W7 ? m" g3 ?' E
/* */ @% l5 Y+ }7 }) c `3 S( S
/* PSC 初始化 */
4 x: g) _" W- V9 D5 j% u/* */
* }/ E( \% q* g5 J' r# q+ B* W3 g/****************************************************************************/
8 {1 f' b1 n9 X5 y" X$ x; f, ~void PSCInit(void)
" P" \9 T/ N3 E( u2 u3 |9 }$ g{
6 m) h; K' T: p3 u // 使能 EHRPWM 和 ECAP 模块
( \; _# {2 S0 ~: ?# c- y // 对相应外设模块的使能也可以在 BootLoader 中完成 b+ v1 \% G) ^) x0 N* w/ g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- F( l+ [; b7 y( ]4 x5 L PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);# ^& u9 Q2 C* W: R
}/ B: q, z; \ {
0 B2 M7 _$ W: f- h! T% [
/****************************************************************************/( [6 S9 e1 n' R8 ~
/* */
) E6 j3 G0 D4 \' ?6 a/* GPIO 管脚复用配置 */
, H: L2 A" |8 [& M) n5 B K6 @) C/* */, x( z' Z- ?1 p+ x0 T* _( Z
/****************************************************************************/
# [6 a0 ?- _" w U% X$ O& J; Dvoid GPIOBankPinMuxSet(void)
5 ~' m! i( f9 ^; b0 z{
9 D6 I" V4 w8 {2 Z I EHRPWM1PinMuxSetup();
7 _( L8 m5 h4 e0 T) r
( r2 e+ S* J) i3 f // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 [8 h, D! g0 Y5 ^( W# o( [ // 作为捕获功能时管脚方向为输入
6 l5 ?, C4 L2 \8 V# K5 y! W2 c // 作为辅助脉宽调制时管脚方向为输出( y1 \3 J5 U1 Q, x
// ECAP2 / APWM2
" }+ e+ p4 r9 P8 g/ d ECAPPinMuxSetup(2);
+ Y7 v% Q7 o5 U- q5 M: k7 U# K0 U& z) b) f* ?! _2 G2 a
// ECAP2 / APWM2方向设置为输入: N. h- e7 q, g7 F9 n' U0 }* f
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
& \( U4 M6 t! @}+ h; h, @% o+ Y& v a. n
3 R, \0 n- h1 l' d" q+ b. D; t/****************************************************************************/
4 s4 k0 `+ o* H# o/* */: e( U4 `# C6 F! X5 W3 k: t
/* PWM 输出波形 */
5 w2 N5 A. _1 h; M8 c" m/* */
1 O2 G. W% g1 |! ~" c/****************************************************************************/
" [8 c+ F4 ]. `) a; k9 [void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
0 K/ C+ j) O' H{
: C4 d; D6 s' s( K1 b5 J( K // 时间基准配置
/ Q( L! O7 C6 g // 时钟配置
0 b/ P5 ^3 m& r0 W# M( W% D; V EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);% v& i! ]. C$ p# x; j
6 [ N% u/ d$ N% F: Y( w
// 配置周期* a3 z) t6 @ ^$ P. W4 _/ g
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
+ o1 d0 w) }2 \. f! d' N! o$ f' s pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);2 u7 D, {* I/ d! `
% |7 d. K. V$ [" |, d" q6 _ // 禁用输入同步信号
$ V2 Q- j; F [+ n EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
7 |1 x% C1 k7 w6 M: ^
* S& L# n2 {9 o6 ]3 ^ // 禁用输出同步信号
' O1 |, B$ J. h# a& h EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);* q; y4 h1 {% `
2 {" s t4 n" P) i6 A
// 仿真(DEBUG)模式行为配置
, |# w' T' s; F( i# ^) i3 t EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);* a0 Z5 P P q/ C
: l! |8 q' n( [. T2 o$ y7 O% k
// 配置计数比较器子模块# F: h& \/ c! B3 U, o4 a D: u
// 加载比较器 A 值
/ A& q# `* @6 V# w6 W: x EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
% k* N& d3 v9 {& `& d7 C EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- i b1 f2 r) I$ y- V1 T
' ]3 F2 W! c3 J // 加载比较器 B 值
- l$ W* x, i; @- A' i EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
4 s1 c( d" s9 q4 r; ? EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
8 f6 q" \. U! S/ g
% E% r/ s8 E# y6 a+ C" [7 u& Z4 N // 功能限定配置(输出引脚触发方式设定)
' Y/ P2 R5 x4 m/ Y, Y8 k // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
/ S9 e+ q# }$ n- c6 @' c) D EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
4 a2 W% M: e. J2 v EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
0 K; c3 o1 _% h9 R% l EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
$ _. L3 Y+ G6 P* D0 S: O, R/ m5 S! [# c x0 J
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
: H& f1 y, Q- T. ] EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
8 I6 e# I% N: a
2 ~, H; z* ?$ l/ u- X3 U7 V% F // 禁用斩波子模块
( b) T8 Z: y8 ]+ z! k: z EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);' d2 I: B' h; q" I
, V. x& q- W' F* q \ // 禁用错误控制事件
" v" \; o: M8 R6 } EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);) f& y, k u% Q3 z. }* r1 R
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
8 y' X; g1 {3 \! g, V
3 n4 G& A9 @9 m, k1 ` // 事件触发配置
7 G" H) Y6 J9 `: E; T // 每三次事件发生产生中断
- @$ R( r5 m1 v4 f EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);% R, A2 }# M( f1 _# k
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件4 h8 T6 U8 V n- l- L# `
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);% H, j7 A2 {/ A( J2 ~
// 使能中断- q7 H" z2 C; z
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
9 E4 G( B% A5 j. J3 j, a
. u7 n1 N2 s: e5 v // 禁用高精度子模块
2 a3 ^4 y5 V4 i EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
% }: W- g' h1 B5 [6 u- q; h% Y" |6 ]& n5 e3 ?+ N8 a
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);, P& m! p: K/ s9 _; s. V+ ~- N; o. ~
}
# j5 A+ x4 t) D9 L* D; {
1 G/ Y7 Y# x- T1 E# m4 E( |void ChopperWaveform(void)
/ t6 {* h" R* T B, X! L{! l: j0 s' A6 u: `. f( H: Q
// 50% 占空比
2 C# I4 V1 f J EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
' M7 |+ i$ N0 w! C* K6 V4 i // 4 分频& c: k, H E" S _
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);( C9 h% \# P- y& x
// 单个脉冲宽度* | I2 e: R9 R
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);2 J* D: m; ^3 F
// 使能斩波子模块
& n+ H5 V+ e4 F1 h EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! }" ^4 g' l% U6 }% M B}
9 a0 B! d5 G( [( S8 x! C: @: p* P& k5 y2 W! N6 H
/****************************************************************************/4 s3 A- X$ `7 Z: f) G1 Z( b) ^! J
/* */
( y) X, b; }! k9 @" v5 H/* PWM 中断初始化 */
- H0 [( w+ y* x3 N& A' C; @1 S/* */4 Q) K4 `1 ^) X6 H, Z6 ]5 f! N+ D
/****************************************************************************/5 u! ?" I! c6 _; f; d% ~+ G
void PWMInterruptInit(void)- a% M5 f% b% A; F% ]
{
& s% K; z7 s) e" T) T# X# c // 注册中断服务函数- O& X- o1 D _: w) @( P8 {
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);5 c. P. H+ m, x6 A" J" D
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
8 a5 N; V2 W. M+ i$ T2 R/ C6 ~* \' x. S+ _$ |) G# @
// 映射中断 Q2 ?5 F5 M/ x' w
IntChannelSet(SYS_INT_EHRPWM1, 2);) U. T- _3 z/ o: f0 S( Q
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);/ J5 ^: N( x2 x1 O- t& [( G
7 L4 e! V& `' a; n$ `" ^; `
// 使能中断
8 W1 m; A8 q, Y- h) {7 z8 |# |8 J8 ? IntSystemEnable(SYS_INT_EHRPWM1);1 c8 A% t* l9 r* ~6 U- @* u3 m2 Z
IntSystemEnable(SYS_INT_EHRPWM1TZ);: v* j& G& o) M
}
; G# s8 Y: j" [4 f7 Z1 w
5 w# {; p+ e" s6 e/****************************************************************************/! V7 ?' O, O7 M% f
/* */
$ c" n/ _$ q9 Q, ]/* ARM 中断初始化 */
( _4 u! x @0 K2 n2 ~& i4 ]7 A6 g/* */
: q5 u! Z. d$ q' A; c/****************************************************************************/) @- T9 ?* C( D, F" ^2 k3 d
void InterruptInit(void)% Z( R# _/ h+ h) N0 ]5 P& r& S: I$ P
{
4 n& ?; b$ o' f. l" `. ^. n3 [ // 初始化 ARM 中断控制器3 u3 o+ i; i6 v/ N
IntAINTCInit();
9 C3 S4 j: [" t3 d4 Q8 J. S% ?! t* `' X3 X: u4 \' Q0 {
// 使能 IRQ(CPSR)+ _. b7 @+ m7 `) G; E$ E7 M
IntMasterIRQEnable();
6 [) I! Q( O3 @- c% h; I
- h* b& k% e2 a ~ // 使能中断(AINTC GER). l9 M' Q) u) F- i$ w. V
IntGlobalEnable();
1 Z# {* R& k$ D) \ K8 w" h0 z q8 K
, M$ F4 G% ~7 V( [9 H1 r- \% X // 使能中断(AINTC HIER)
0 i' |0 k, O% K' Z h IntIRQEnable();9 T/ l* z- E2 O' }! c% K
}7 Y5 w" x" a+ ^2 V. H2 Z1 F
* _5 V4 G0 \# i0 T1 j7 q' Y3 S. P
|
|