|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
7 x6 ]. W! @% l% h+ y5 Q/* */7 b# s0 d+ p7 h' }. A- p
/* 宏定义 */
4 c H N6 _3 Y3 q" K/* */
- Q" |3 c+ A3 \* L6 e2 ]/****************************************************************************/+ O6 r. h6 h+ C+ r( `
// 软件断点 a2 K$ p. ~, D2 E p" ]: \6 A
#define SW_BREAKPOINT asm(" SWBP 0 ");, m4 q6 B& M: }' M5 e
) U8 \ s) X; L
// 时钟分频
, ~, s- D$ s2 |5 {, u9 l- H6 x#define CLOCK_DIV_VAL 228
0 v! Z' R+ ~8 S6 \
, p2 X" V# ]7 E; G/****************************************************************************/
+ A! Q* @, t" V1 q: U( V, k/* */
- d# b# `) o! ?0 x/* 全局变量 */9 J2 ~7 ~$ V# F: U$ G$ e
/* */7 P2 P& D: T0 ]: c0 [7 [. r
/****************************************************************************/
$ J& C" C: a( D5 k9 J3 H8 ?ECAPCONTEXT ECAPResult;
/ |) C( ?$ t0 \' T5 h' \4 ]+ Z6 ^4 ^) s3 D) g
/****************************************************************************/$ w1 T" M" i* R2 i$ K
/* */8 n. I+ _" b E8 u! Q: W8 @
/* 函数声明 */ Q0 Q4 c! ~" u. f5 @1 o. g
/* */
2 i; @2 N D' G/****************************************************************************/
0 o- B0 f, a; x( s/ T$ l2 ~) T// 外设使能配置
6 E4 o+ Q6 C% R$ x8 ?+ V% j- ]% K9 Qvoid PSCInit(void);5 ?! v6 a" }" O
. h. A! A( @, R1 i4 W// GPIO 管脚复用配置
1 H7 a4 W. u& G! H( t' l. Svoid GPIOBankPinMuxSet();
) i& U. k, {4 ^# M3 u, N
- S) g* V$ f+ n! B. P6 w0 A' y, _( j// 产生波形8 @. x( H+ B8 U$ y* J: d
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# w, r4 v4 U& D$ ~void ChopperWaveform(void);/ E, z/ m* d6 O, x o! Y
. e5 K+ s) h4 X// ECAP初始化和读函数
k9 j# k% Q. Y0 o# H5 _; F6 a3 nvoid ECAPInit(void);
8 ^. G2 ^3 ^; ]* Kunsigned int ECAPRead(void);
0 |/ b [+ P2 `- Y% m" E9 R( Y+ ?- t+ ?5 G7 a
//ARM 中断初始化
5 ?9 B+ X# d' p2 c& U- f4 wvoid InterruptInit(void);
0 o+ W3 ~0 o7 s7 |- o
2 H9 Y" S) R/ j" J' ~// PWM 中断初始化
6 b. z) l3 @5 ?+ Nvoid PWMInterruptInit(void);
! y" b& s7 c2 A7 z/ D# f// 中断服务函数
8 s9 ]5 J( s1 u) B# r! _0 ]/ w F5 I// PWM 事件( g) J& t2 Q! X* G" e8 W) H
void PWMEventIsr(void);4 q" c% v: }; n; X
// PWM 错误控制事件
5 G* k" }. Q1 W7 ]void PWMTZIsr(void);/ W) O) A$ _, {0 q; u
: O c- m+ Y% _: E' i/****************************************************************************/1 b2 }9 f. l/ K% S/ n& l
/* */, x4 K/ x5 e/ G. u' H& d0 l, P
/* 主函数 */; O- A; l2 x- p3 H6 J4 O7 T5 ~
/* */
3 X, Z0 e3 S+ f4 K0 Q# U6 [/****************************************************************************/
( |# q. ?! b2 m/ L2 _4 j3 sint main(void)- O. n" R+ ~+ ` Q3 M) Q% }. k8 ?
{5 f1 e0 q" z# w+ H. W. d, O+ e! B
// 外设使能配置' l/ l! C6 ^8 u$ Y/ Z0 I
PSCInit();7 a* g4 u# r- J8 P% P) t6 i$ R
3 B' Z, ^8 k* A N
// 初始化串口终端 使用串口2! O9 M. e5 ~# b
UARTStdioInit();
! @) A& t: Z+ _" F' {0 V4 X
7 J9 Z: N \: @( I- L // GPIO 管脚复用配置
9 P& |+ e) r3 j9 K* u; H GPIOBankPinMuxSet();' u) b$ A# k$ S# [* p3 }6 K
/ G! {8 p) X! `0 e* S( m. ^
// ARM 中断初始化
# s8 r( f9 {( | InterruptInit();
# t, l* |) n* q* `: K# P9 j% `
/ E) q" w; }: N2 s+ E // PWM 中断初始化
9 H4 Q6 t/ P6 z- x# C PWMInterruptInit();. f2 l7 s# z3 S K8 g
) l' ~" k4 ?$ o# H unsigned char i;
- M4 U# O" b, a( G* a4 c unsigned int j;
$ F" n- `: M7 M7 U
) `7 S N# f7 Y- b UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
: [9 k' n0 O7 } F- f UARTPuts("------------------------------------------------------------\r\n", -1);
0 f4 u0 g8 u# K# `0 { j UARTPuts(" C6748 PWM Test\r\n\r\n", -1); y, D& W5 g7 ]' R
// 产生波形' W/ U7 R @- u
PWM1ABasic(25000,50);5 J8 L3 n. w, x) y" b2 k
* ~2 C1 u" n: ] UARTPuts(" C6748 PWM Test Over!\r\n",-1);
9 Z0 `" I/ X: U' f0 d3 M8 R5 W- y UARTPuts("------------------------------------------------------------\r\n", -1);
5 L: X2 ]8 O" m/ s5 z1 W8 N1 l! v
: v, I2 M Y; J6 c! S
5 T; x% v* \9 S% ~3 g; y* D" y5 e. ~+ u% i& _) ~8 O, Z3 D
UARTPuts("------------------------------------------------------------\r\n", -1);. i7 D; z! l. N( F9 V& X
UARTPuts(" C6748 ECAP Test\r\n", -1);
& Y/ p/ I v W6 ?4 u' g% `/ J* _2 y // ECAP 捕获初始化3 v8 b5 j2 S0 X3 [9 t" u) D
ECAPInit();9 [' x1 N7 x' \2 G. }2 f$ Q
UARTPuts("Initialize ECAP.......\r\n",-1);" L: V- U( m5 B' z; \# J1 [$ C
for(i=0;i<5;i++)
5 ~& |) o4 g8 i) v; n8 c {
: N; n+ `9 A* v4 f7 ?- y7 l& h for(j=0x00FFFFFF;j>0;j--); // 延时
% ?3 u: N- Z/ ~( m L ECAPRead();$ O: Z7 m0 a2 i& Y+ u/ @# D, \8 p
}
5 \ d2 o2 z( g l, \# i6 ~ UARTPuts("\r\n",-1);
+ [9 ~* j! O$ H+ U1 h8 l UARTPuts(" C6748 ECAP Test Over!\r\n",-1);- r4 q+ ~* O& x% K3 ?3 h
UARTPuts("------------------------------------------------------------\r\n", -1);
$ I, S8 F1 o/ v( f" d# L. Q! G; ?+ d
// 主循环
5 ^; T) o z' g" X for(;;)- J5 |9 R! ?, Z% q1 h6 b6 C
{
N. g: W8 c+ S( |- \, `
& r! n( z1 |5 ^1 h8 Y1 r2 Y$ W! z }! e& ]; A w: D' E: d
}
& W0 W' t( T! v/ e0 `& ~" W9 |# s8 j5 T" Z
/****************************************************************************/
. a5 P) J& \$ D" \# l& j4 j/* */
' Y' C# f% G! N6 v5 m+ r8 V/* PSC 初始化 */
d* x+ e- a9 v2 f: B/* */" C2 }- o0 {' p2 _' k1 x$ v% c g+ V
/****************************************************************************/
" z2 v" e: X' |+ I; B4 A2 Avoid PSCInit(void)
5 v6 C$ M; u9 c$ P* H! C{
3 N: \( l" [ T // 使能 EHRPWM 和 ECAP 模块
: {4 Q" m7 [# D# e8 D8 u // 对相应外设模块的使能也可以在 BootLoader 中完成
8 Q$ r* ?/ \6 Y3 V, A PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
( W5 X1 U0 j& T4 C/ U+ i/ } PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
3 ^7 G7 I9 A0 `& u" e' t( M}+ ?9 y' {9 O0 B$ b; A
4 q0 b2 V6 D) T* n
/****************************************************************************/- C* H* e. @4 [* ~% k) O; S
/* */
* _: r) i1 N. r9 U, K8 b/* GPIO 管脚复用配置 */
$ E- F, v, o \1 R# H0 S1 s5 I/* */ G7 b K3 g0 b4 A1 Z
/****************************************************************************/' C' H$ X( R8 f
void GPIOBankPinMuxSet(void)+ H" v) X$ E3 E# G
{
; P) L: P- x9 s7 T/ W' t EHRPWM1PinMuxSetup();
; A7 J, v6 F/ R2 Q8 [8 T: g/ C
, A+ \7 }# M8 u" ~9 d1 g // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)) M& S/ J$ m) ?. z3 G
// 作为捕获功能时管脚方向为输入! v, h5 I" Y0 f( C2 l+ }" _+ a
// 作为辅助脉宽调制时管脚方向为输出* d9 D9 R, I* ]% y
// ECAP2 / APWM2, t9 Z+ j6 I. B4 H# d. C2 A' t5 ~8 p8 {
ECAPPinMuxSetup(2);' v- T6 U1 Z' p. g5 j
% U. R. `7 @ ~. _. ?
// ECAP2 / APWM2方向设置为输入
8 @- A7 `2 h; O% X GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
1 `% H9 j% M& F* c7 s5 K: S, ^" s}
# V6 o# t2 e- W: l9 z/ Z' D
3 Z1 W' n$ p4 w, N9 l1 E0 W/****************************************************************************/5 G. N9 F3 l1 V/ M0 O
/* */
. q4 r7 i( c" S* P- i/* PWM 输出波形 */
$ ~7 F. V$ U% S: U* y9 L* s( y/* */
1 ^0 N: L: f2 F- C, U9 H/****************************************************************************/
% |& P P3 M' [# L8 \void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
% |9 j/ O: y/ T. r{) d8 K1 w% R" H0 V( {9 i/ N
// 时间基准配置
: g( l' H; I0 d. [4 P // 时钟配置
6 t; [! l& V( ?& e* t8 y EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" k% d: H# l* N' H4 E* T9 z
! ]# [. l# C& N // 配置周期6 Q1 Q4 l: U& n7 `$ f/ f3 _8 G) E$ ]
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
6 R. y. r7 Y( o- ~$ w pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
) j! L! V' O; Z; `0 v) e
. F3 E2 ~* w* ^/ i // 禁用输入同步信号
; l# X* b5 y6 `) t9 j2 M1 A EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);8 O1 @1 M; M y. q
7 w& t: L9 h4 c8 g# y' j& h // 禁用输出同步信号
2 i$ P1 T$ U. X; e l EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);( C% ^3 H& t8 w) s/ j4 V
+ L, Y6 O X* F `+ W7 }0 h // 仿真(DEBUG)模式行为配置2 V5 I( ]6 ^3 m' d' J8 D/ i
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);& N5 T0 F9 m5 _ \
0 H5 _/ H. D9 L* N
// 配置计数比较器子模块' W) T+ w# l7 x
// 加载比较器 A 值( f4 j* Y7 U1 U6 y9 j
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
+ Z5 L- }4 `9 B# n EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. y1 d5 i: e1 t! N3 X$ m T# e
& j: i/ \9 _% k3 v // 加载比较器 B 值
4 _( F$ _$ h0 o3 k% K9 O, p EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,. e' ~1 {4 ` ]% f& h/ i
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);8 G- W" x& c$ b9 Y: s0 |5 K# `* @
+ j3 _' l7 P @9 t8 O- y // 功能限定配置(输出引脚触发方式设定)
) C' F' x/ r# s0 {$ x! a // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
* L J$ X. X- Q; i, x/ G EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
5 x: d$ T5 X3 S N) B EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
: r3 F# d* T8 f) [3 { EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
+ N0 ^+ l6 `+ d4 G. I; Y! W3 {& Z2 o4 ]: t/ E3 W m: W1 ^
// 禁用(旁路,信号直接输出到斩波子模块)死区模块, t9 a+ b& ?( ^8 Z! Z7 r
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
7 @/ W" ~# _% `7 ?' Z' I5 l$ h2 O" J; Y
// 禁用斩波子模块8 ~! ~. Q6 R( n( Y4 S2 A+ {
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);( i1 p2 }% \6 f+ o
" a- u8 |( R! \0 p+ _ // 禁用错误控制事件
- T" v& L- R1 S- O+ P3 t) O EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);- ]1 i# ?3 B3 `, b
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);5 m) F. ~! p6 P. M8 L5 a
1 c; Y+ {( Z3 [8 X) l! j0 K) R // 事件触发配置" p! x: o( A, D k6 {
// 每三次事件发生产生中断9 }3 Y( U1 o3 [1 ?- _
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
1 x2 i4 {6 @$ \& M // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
- o! _) T) E7 I5 \8 {" h: | EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
1 S' G; s( e- h( }( T) N // 使能中断
3 z; ^8 `$ Z" c# a EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
/ K( R/ f9 \" G2 g, m0 Q
! O5 P0 w4 _( H // 禁用高精度子模块. g4 X0 h& r2 |( B
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);! D: j0 C1 @ T' |8 z1 ]
' S' B2 q9 X1 z% b& k
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
& v" i1 z" o' J+ a2 z; k6 {2 [}0 o7 a% v" `" [% W1 u' a# I/ S
1 f0 ]3 d, D' tvoid ChopperWaveform(void)
$ R# F5 z* z% H# k{
7 n& G) V- ?1 R; {' C // 50% 占空比
, i2 o. I! n* w# S EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
! V+ _: o9 c' I6 o/ l // 4 分频- P3 T3 B( O/ ? g% V& R2 r4 m, o* f- o
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
5 Y* F# B8 {& m6 b6 h! w8 z0 g" G // 单个脉冲宽度
5 o( Z- P; S1 x3 i) D7 x EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF); m4 w' |8 T+ l5 r( C0 Q
// 使能斩波子模块
& Q) e9 r7 _5 _! A( L& I EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);, N. `# q% V8 V
}. m/ P, P2 j( `9 K, ]) B2 I
+ M' ~! S4 \+ ]1 e' a. `2 ~& K/****************************************************************************/! J) H# l. G: y, y& N$ a6 ?
/* */
+ _7 e$ H5 @8 V# K/* PWM 中断初始化 */( |/ b1 u. \3 I
/* */5 O0 w2 B6 h& e \8 i. J
/****************************************************************************/3 u5 {2 |- v: B* J3 j, d! N F! |
void PWMInterruptInit(void)/ l$ W1 w1 A/ w7 P( i6 c9 Z
{
$ U) w- T1 K3 X) e // 注册中断服务函数1 q8 D. l. q ~2 {
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
8 x- r9 d' V N' u+ {/ f' u) A2 g IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
. d# p0 b, k8 `2 w# ~9 w* s0 {2 x% @6 k' h9 i
// 映射中断; @$ X8 D$ Z+ v' ~6 v* w
IntChannelSet(SYS_INT_EHRPWM1, 2); j' `+ t4 S8 _3 A1 _. [3 X
IntChannelSet(SYS_INT_EHRPWM1TZ, 3); Q8 u8 |1 o% N. h7 ~8 p1 j" A, w& T' P
% H& q/ @5 j; L' _) S // 使能中断$ f' E5 i# h+ W
IntSystemEnable(SYS_INT_EHRPWM1); R% \- t4 f# ^: l
IntSystemEnable(SYS_INT_EHRPWM1TZ);- t8 G: K9 r4 C
}4 i' k. t) K9 p
$ y0 D, u9 ]9 t& t
/****************************************************************************/( x% h, e- Y3 ~) G" x, e' m
/* */) G" |4 f6 ~+ L
/* ARM 中断初始化 */1 U5 o; s: k( k2 s0 _' L
/* */
- i& `) z) z, X7 n" [5 Q1 R' X/****************************************************************************/
; W3 ^+ b% [0 [) g& M0 O" Uvoid InterruptInit(void)
7 N2 ?: b1 `- V6 v [9 K" \{# L0 j+ P& I& e2 `
// 初始化 ARM 中断控制器) |8 N# S7 F7 }: Q! w
IntAINTCInit();
: B. l1 O7 H! ^/ a- G2 w( S n
4 x. T6 W9 ?% i' v' o' v // 使能 IRQ(CPSR)
/ W G+ x- \% M1 E IntMasterIRQEnable();- c! v6 E8 U% U) t9 |3 D' L4 Y1 S" H
- B& Y2 o- F7 O0 ^& I) h
// 使能中断(AINTC GER)- d+ M' H# c2 ]1 S+ V
IntGlobalEnable();
2 E0 x# J# U! R# {5 J; \$ P$ J* c3 F" @5 v5 V5 @8 n+ k
// 使能中断(AINTC HIER)
9 G, S. N, ?. v3 @- | IntIRQEnable();
$ w- ]( @ a% v) n* M}" }, P& H# {5 p9 ~ J8 C
% D- w% b9 c3 Z7 N |
|