|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
1 D3 N- ?& g" O7 W" s( H/* */
* u( l- G$ |8 ^/ Q& _5 {7 i/* 宏定义 */
' H$ p5 y- d: J$ i/* */
' V8 ^! ?- _2 r- z" p* x/****************************************************************************/' f2 T4 |* n t; k& A3 K
// 软件断点
' V0 f( |1 c! p/ f7 N#define SW_BREAKPOINT asm(" SWBP 0 ");2 f- o* N+ g' P. G- N, X
- b& U$ z/ t. g// 时钟分频
. m% @: v3 X* K4 Y1 u0 n#define CLOCK_DIV_VAL 228
4 |2 E2 ~( t; E1 f+ Y
% |6 O2 P7 G, ~7 `* C/****************************************************************************/
( Z. o/ L% I F) P" x/* */# s; U& o+ {' H7 Z9 u1 x: w/ g
/* 全局变量 */
" i1 f( u+ N; k, {) c/* */9 e& d" s5 n/ o8 m( k8 r2 j+ ]; e7 T
/****************************************************************************/. ~8 s9 A0 T; P
ECAPCONTEXT ECAPResult;
4 C) }, G' M( J- S
1 n: r ]# `+ ]/****************************************************************************/" {2 H2 C* ?; o0 v8 a( e
/* *// O! ~3 N, \+ l/ p) c v! W
/* 函数声明 */
- m: g# T1 ?4 e" a! A/* */
1 L1 n4 F) s( o( ^. [2 Y% R5 R! `% d" |/****************************************************************************/3 R$ E ]0 T; R Q3 C- S
// 外设使能配置
$ K, g0 H) t/ e+ b, A4 A }void PSCInit(void);1 z$ `& N8 W3 j# s* Y% E
7 E' e5 o2 e% [1 m2 F' _5 w// GPIO 管脚复用配置- P# O; u0 l1 f1 @" B
void GPIOBankPinMuxSet();" G- K# r+ A3 d) U
/ d- j& ~ I: r# r; X2 j; u6 B1 F1 K) H7 |
// 产生波形0 u2 G* X8 }0 i0 |+ x! G, v A: [
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);# g/ ~7 x" l8 e: u! J. @
void ChopperWaveform(void);
I9 v, v8 l8 I$ I( Y* S
4 u4 d8 |/ o5 `+ A$ l' q1 j: ~// ECAP初始化和读函数
`% C; A$ i4 m' O2 v- K4 hvoid ECAPInit(void);
. {$ H" O; ^7 o2 `7 lunsigned int ECAPRead(void);
9 w( L1 N! e2 a' i! k5 [8 B
9 M& ^% l: N2 v//ARM 中断初始化9 [: n, F$ G: a" r/ O% l3 ^
void InterruptInit(void);- H% ^* \1 g# V4 | P- [
: ~: c! G# X& p9 V) G
// PWM 中断初始化
2 ?7 E7 p& a& V$ p7 Kvoid PWMInterruptInit(void);! a5 J! o2 o8 c) \2 y2 g/ S! T( G
// 中断服务函数9 R0 F$ p0 y6 y* U' Q
// PWM 事件
! Q" o: U' ]% g9 i9 `void PWMEventIsr(void);
. E$ C% V( {7 ^6 `. x3 i// PWM 错误控制事件1 [0 k* m6 f+ z+ |
void PWMTZIsr(void);' {; V3 J1 d$ ]& D* _: f3 h" X
7 m' R! Y8 |# p! @% {) I0 ]
/****************************************************************************/& j h% i- N, a; T/ w( s/ r, ]
/* */* E% L0 ^$ l+ g
/* 主函数 */
. U; b d( T- a# q; I/* */" ^) Y3 Y: D; e; N% D5 t6 {
/****************************************************************************/
8 v5 X% G# @+ J3 B4 jint main(void); Z* T; R8 f! E. u# |* D7 s
{" s. T% Q0 p2 H3 X" T
// 外设使能配置
' T, Z3 M+ _3 e) T PSCInit();
' z& p9 U3 E+ m; C7 x2 X/ M" b+ ~, ^6 _& s8 h1 \" e% y3 I4 k
// 初始化串口终端 使用串口2
$ @" e x7 u p ^: {& B2 L UARTStdioInit();
8 s' M$ h' v. f3 g& ~6 a e/ A) U/ K5 U/ S4 m1 C9 J' f
// GPIO 管脚复用配置
2 j0 Y* I0 o; [, q4 x0 [ GPIOBankPinMuxSet();) }( V. s/ d$ l) S. N7 L8 p t' Q
3 G$ G! k; U: u8 D* y' [5 N2 [ // ARM 中断初始化
$ t5 ^5 m- n P, V8 R& F& l' p InterruptInit();
, o) f! o) N5 n6 k6 Y% Y$ h3 w# z* g' ]; O) P" K: L6 I
// PWM 中断初始化' `% S j4 E$ P# @! F, `
PWMInterruptInit();
, n8 M1 r8 W2 B4 T7 ~ [, J3 A2 H' Z9 x: w( f2 c
unsigned char i;
; R! r! d/ _8 V4 h d e3 W! [ unsigned int j;
; c E* x5 Q2 G" H$ M* |# ?. W- A, X5 g5 T
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);- D3 `& a2 D: }$ }( D
UARTPuts("------------------------------------------------------------\r\n", -1);, g1 z' D' `6 a( \1 D' k( @
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);$ L+ X8 N. f6 |1 C e2 ~9 m
// 产生波形6 X; s# r" v/ e* z8 n1 z( e
PWM1ABasic(25000,50);
. ]& n2 y+ _; \) i9 R
8 l; m' c4 d, X3 d4 a+ |( `* r UARTPuts(" C6748 PWM Test Over!\r\n",-1);
, n9 h) }" R3 n% N1 y( W UARTPuts("------------------------------------------------------------\r\n", -1);
2 H8 `9 P! H2 I5 L: I0 h. O5 ^7 [& ?, \; M% |' R; U
3 h0 [) h3 N. w5 {+ Q
0 A$ n+ X) T8 e8 R, g UARTPuts("------------------------------------------------------------\r\n", -1); }& X" G, g/ k7 }, G
UARTPuts(" C6748 ECAP Test\r\n", -1);
& ?5 b1 U( A; d4 F4 C5 k // ECAP 捕获初始化
6 P0 l( _& _) Q9 U ECAPInit();" p/ f& m8 }* b6 Z: G# j
UARTPuts("Initialize ECAP.......\r\n",-1);$ v$ g9 J% q: e( E
for(i=0;i<5;i++)- i$ T6 o3 F) l+ L4 o' I! I* }, G
{
2 W! {/ p$ Y- i3 d for(j=0x00FFFFFF;j>0;j--); // 延时
6 ~+ `0 z3 n& V! m r ECAPRead();. I9 ?: b* H8 T) P8 e! k2 P
}) q7 r+ K9 ~, S5 e8 g
UARTPuts("\r\n",-1);
9 M2 i9 c' d3 ]$ J& X* j j2 Y9 p UARTPuts(" C6748 ECAP Test Over!\r\n",-1);8 t) q+ |2 ?. G
UARTPuts("------------------------------------------------------------\r\n", -1);% ]$ m4 `8 ?& K) Z( M( |. N
3 \! l. y3 N. P' ]! p
// 主循环
. T& P$ A3 O5 B: Y; U! L for(;;)
- m p+ Y1 C, ]5 S {
# Q9 ~5 M- \. |( j0 F4 ]1 k+ x4 P7 w& u2 U; u
}, ?- o9 M _0 A1 ^/ e/ D; }5 B
}6 H9 K& o' ]$ Z* Y0 x
- n& s8 A! @# J
/****************************************************************************/
3 |$ {" r* L7 x* K% b3 O$ P/* */) E4 R, |& @) h p! C1 ?
/* PSC 初始化 */' T$ [* ^, U% z% G
/* */% ~2 _+ a6 F# [4 O- |* d, @
/****************************************************************************/
0 K! {0 ^' z7 R, q3 y: B7 C) K0 V jvoid PSCInit(void)
# e" P k% k5 T3 h: E7 N) e/ M{
, U% c( ?& {+ N) m/ K, q // 使能 EHRPWM 和 ECAP 模块6 b- D, S' ~. I. z. B, i+ n& a
// 对相应外设模块的使能也可以在 BootLoader 中完成2 R/ t8 \& u4 N& X a
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);3 M4 u: c4 H2 ^1 g Z5 b+ P; |
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
: t& C0 X7 H9 C( ^+ ?}
. X- E* z o6 u3 B( ~
# C1 N& u; S0 n2 Y- v/****************************************************************************/
8 t- x' c" f% `% G1 H/* */
9 g) Y) O' h! q' i3 q/* GPIO 管脚复用配置 */( Z" l. q4 i6 M
/* */
* A5 b7 C: P. |$ H5 }# c/****************************************************************************/
" G4 H" X% b) f% Y/ nvoid GPIOBankPinMuxSet(void)
9 `! j0 B! F& \( D2 S" S{
1 b$ N6 b: O' W8 n5 T! d( V2 A ] EHRPWM1PinMuxSetup();
3 ^1 j% c0 H; ~8 @4 z( l1 d! x
1 F. L, T" Q Y% E // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
* j" d" C9 \, `% }+ a // 作为捕获功能时管脚方向为输入
3 S% k. |6 |( T& Y" u3 D // 作为辅助脉宽调制时管脚方向为输出/ d9 a b1 J; f1 L& {
// ECAP2 / APWM25 B& B! x0 ^, u8 h" u
ECAPPinMuxSetup(2);3 T" b' S8 u" H, q. y6 _
F+ t! O# k; ?2 N // ECAP2 / APWM2方向设置为输入. f3 k6 h) q4 _
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]* S4 I5 Q5 R% n* k( M
}5 p2 \" Q8 N% i1 ~. C0 j6 Z
}" [& T' F! G9 `# G, w3 X3 z. ^& v& _
/****************************************************************************// X% [! P9 _* |7 c
/* */ v) g7 I3 ~( g1 ~- W
/* PWM 输出波形 */7 ?* ^/ b7 \+ v5 b- n
/* */% r$ q* O) _4 }% k. s
/****************************************************************************/- t6 B' u( G- V& f4 L
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)( Y# ]7 b1 B2 o, N# M+ M* O
{* h' t7 C% A$ r6 ]
// 时间基准配置+ Y W4 A+ Z) u
// 时钟配置' \5 c! O0 i! h3 K* L
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);% J- U; K' j$ d! g
; J# |1 |$ [5 X
// 配置周期
1 Q7 k# O; r9 l: |8 _" `1 {! _0 \0 y EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
3 T+ `$ A) b9 k+ N, f" u, u pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);+ l2 J, ]) `# e/ V. J" V, T
: _9 _; V& ^1 m/ { // 禁用输入同步信号
% [& s+ c- q3 G+ e; R, T; g EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);# W! ^4 ]$ A% Q/ u) e
9 L. K7 I. G1 }4 T; x/ z9 g3 x
// 禁用输出同步信号& g4 {/ Y7 R3 W# J% x
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);' L* K# B% ?( `2 ]& Z3 ^* a8 f) G
' F+ l0 v1 R+ h+ X( C4 t // 仿真(DEBUG)模式行为配置- k7 c R$ V; w& p2 c( i1 u
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
4 U: h% `8 |1 ^+ J; |8 x3 M6 |# U/ j9 U) ]/ k- j) A9 }
// 配置计数比较器子模块
9 g7 h8 I, s b" E/ e: B( K; L // 加载比较器 A 值
) O( j! r; E# p. H EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,* I. D$ y5 A/ L8 z: l- {' m4 O
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);% B {" v! R9 k# s0 j. `$ K$ _; J, @
8 i# W% c; K) [- v
// 加载比较器 B 值! r2 e* {, e% P2 Z& y
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE," ?# u" J. u. ~* N8 j- g# b' r
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 ]9 \$ F& A" k2 J# \% C! X" I p& m) p" B M4 [
// 功能限定配置(输出引脚触发方式设定)
% Y" @/ @* \0 d4 W& { // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
9 n1 Z: _: I. p+ m EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,* ?( d0 N- C& s% t5 [1 y X' ?1 Y
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,% f8 o6 M) C5 s' a; E- h' Y3 \' O
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
0 J: m1 `: H) p& e7 A9 g; h0 [! h2 W- H& p+ L
// 禁用(旁路,信号直接输出到斩波子模块)死区模块8 S7 f# e) m, q) z1 w; K9 c6 G
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
( Q9 V1 s2 l9 H
( k; k( V9 g; Y! m& u& t6 P // 禁用斩波子模块5 v5 G r& v) v$ b: [7 I# p
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
/ @2 V6 S0 q1 Z
& h0 C+ Y% {& w+ [# a# W9 v // 禁用错误控制事件
. G9 t/ S- J+ Z/ `+ B' n EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT); A( a) O/ K# ^2 e4 S3 j; v
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);$ x2 V, Z+ t' l+ ^
" c, o& N) x9 h) F* y // 事件触发配置, V' e! K7 j8 z( V3 n& L
// 每三次事件发生产生中断* D2 c' t7 _) E. s' e, ~8 }) C
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
8 ~7 p, |# |& t N // 时间基准计数等于有效计数比较寄存器 B 值 产生事件- ?: ] J4 _9 G& c
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
6 C. u8 N2 s9 ~% S3 v // 使能中断
( n" Z. h8 h' z% ^1 D EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);2 ~0 u" d$ P+ k8 m- B: X7 S: Z
+ v* T! W& O2 B. t! V' M# J // 禁用高精度子模块
6 o9 `5 O7 i. l- t3 P EHRPWMHRDisable(SOC_EHRPWM_1_REGS);* y( t- H) w% A' _. Z1 j
; k; g; K6 t+ o$ ] b; a( l/ Z UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);" Y* x& D! i. y/ V9 N. e7 `
}
* x6 F( {5 E0 `8 T6 A* J5 k8 q& I
void ChopperWaveform(void), n# J% M" A; p/ S# X G& L
{
2 n- `+ G3 E& g! n$ M // 50% 占空比
0 j% L% b8 c3 ^4 e* s6 x EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);# m% W5 s- C" {, D- `
// 4 分频
% [: T& ~) @' y+ z EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);( Z) E) B1 l, C; D, t
// 单个脉冲宽度
1 s" Y! u6 L. A/ `# Q3 T EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);6 r# F; T" H: D0 W- G0 i
// 使能斩波子模块
& u& t+ Z1 M; a6 I! U) A4 P EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);' w9 U) P4 T X5 e: w0 `+ K- u
}
3 C: ]' S9 P: p9 ?
4 X1 E9 k& f5 X; n6 U X# ~/****************************************************************************/
8 o6 ~8 d# [' |2 {) |4 [2 s/* */' Y' W! A5 L0 p q q
/* PWM 中断初始化 */2 Z( n$ c& b2 |* ?: G
/* */- O& V7 s( S# R, i% X4 ]) l$ x
/****************************************************************************/6 Q2 F9 U$ ^6 G3 x+ j( l
void PWMInterruptInit(void)
8 x8 ~/ s! X4 i! ~' O& i9 t{9 i; e, ?! t( h4 i: h; B
// 注册中断服务函数! i U. s' v2 ]+ G+ M7 {) o! e, v
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* y9 _% k2 X# v0 W- {. T IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);$ t* U7 T/ h; a; P
- H( s' a% j- q4 r2 c // 映射中断
# H3 p) F4 ~& s7 Z b1 I IntChannelSet(SYS_INT_EHRPWM1, 2);5 b' |4 w. s, N! @! }' X
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);& D% O7 M! r' t* G) h- W3 X2 G7 v& Z
& O' Y2 p3 O8 M8 }! U: ^* u // 使能中断3 }: m0 g$ f5 i0 C
IntSystemEnable(SYS_INT_EHRPWM1);. F6 O& | i: }7 T! @
IntSystemEnable(SYS_INT_EHRPWM1TZ);
" |: s* b: t1 Q J( Y+ h+ _1 Q}- u$ A$ u- J6 H! e6 }1 z
7 n' ]( Y3 i3 P2 l6 p9 G- O: l
/****************************************************************************/
6 b6 }, }/ l9 a: [4 A- a/* */
( b% I; M9 A3 N0 R5 q+ q" E/* ARM 中断初始化 */
1 n1 y, D0 `& E8 V, N/* */
& y9 G9 ^$ v8 o* N* ^+ q/****************************************************************************/1 v0 v; {: Q4 }5 w, {- ^+ G
void InterruptInit(void)
! K1 o# u0 f" o. Y, V1 M1 V4 M{4 u7 E* f. Y: G. _8 ]# s
// 初始化 ARM 中断控制器
4 b; Y; W; @5 S" l IntAINTCInit();' u% Z) q1 W5 m4 p3 h
" O! K: n m" P% x% K! F
// 使能 IRQ(CPSR)# e4 N5 u6 `# c( ?. D* G7 H
IntMasterIRQEnable();+ H" w* A; n( ?
% h" H1 C: M- q: U- S8 K // 使能中断(AINTC GER)
8 S$ u- Q( b- P9 r% L/ p4 n IntGlobalEnable();$ t. { x6 f. M1 j; _
, C2 k. d: O# p
// 使能中断(AINTC HIER)1 C; c8 g; A% c4 a
IntIRQEnable();
# U: ?, g' \% E! Q% D* [3 s}
! J1 x9 h/ D9 S+ D4 N% x3 A8 Q7 ~! T) x% S+ l
|
|