|
|
沙发

楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/: E8 j- M0 H# |3 R# o8 X
/* */6 Q/ v. ^2 n& I( \
/* 宏定义 */$ V+ H- b ?! Z" Y! M$ a; t
/* */8 }. x- r7 B8 @. A9 {) f' t
/****************************************************************************/4 s, h. m5 h5 _/ B" C4 a
// 软件断点
5 F. d* j# g: ^/ q9 o#define SW_BREAKPOINT asm(" SWBP 0 ");
+ p% g' }7 f" j/ |8 b
/ y, Q3 s" h. e0 i4 n: S( Q8 Y// 时钟分频
; q+ {0 Q. j, D2 T8 }#define CLOCK_DIV_VAL 228
" r* E* c( }) P8 P8 U
# ]- y' [) L( `8 w. ?% F' @/****************************************************************************/$ a! _. S+ C2 O% S+ }$ e5 X2 V+ L
/* */% O/ u1 F5 H/ s
/* 全局变量 */
; b1 W& W, J% x$ j# D8 |$ ?/* */
" n) a' l& v, F8 v: G/****************************************************************************// p2 s$ M J4 z/ m+ o
ECAPCONTEXT ECAPResult;2 O$ Z$ H7 Q u# A# l$ q
9 z8 t( g# F1 ^0 P, J% A- F
/****************************************************************************/
5 [- ^' c3 R2 y* R/* */
! s$ K% o& V9 z+ y/* 函数声明 */
8 f" o# A) n4 m3 u/* */
' D3 i. t) T' u3 A" N9 x/****************************************************************************/
6 _5 I, Z g5 e6 t// 外设使能配置 |6 J/ N8 P# }5 c
void PSCInit(void);" _- l/ N8 d7 x5 M# O) z
& K7 q* u* ^ A, `2 r, P1 X// GPIO 管脚复用配置
0 }$ E) g6 N+ [( F/ d5 n" C; I t4 Dvoid GPIOBankPinMuxSet();, k# ~. U. y8 K9 V, z
6 {; L) s E! m$ w2 {& u, E// 产生波形
* T: c4 t6 ?, T1 B+ N0 u$ Tvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);5 _2 F1 n# h7 o# p! j
void ChopperWaveform(void);
# i- E i4 G, Y* J& ^ i0 K1 a! S+ G5 U5 G8 E4 \
// ECAP初始化和读函数
5 p4 W$ Z+ ~: K: E6 ~void ECAPInit(void);
1 X) f! W2 ^+ g7 T$ V8 \( D$ ]unsigned int ECAPRead(void);7 L" ?6 L* @. P+ K$ a/ x
- Q# ]8 }, y8 P! ~$ o
//ARM 中断初始化% Y8 ^3 w* x9 f2 K& ?3 N
void InterruptInit(void);6 n, S( t! s# Y8 P& ?
. \1 [, U! O( F8 L5 ]' V$ X
// PWM 中断初始化
9 L- L. X2 o' s- nvoid PWMInterruptInit(void);2 M1 J8 `* C7 J" N' G2 {5 i# I
// 中断服务函数2 D8 `. D( L. r, I; ?3 w# W4 P
// PWM 事件
' ~( P, u/ n ovoid PWMEventIsr(void);2 E# y! C8 \, Y: d
// PWM 错误控制事件. X/ l( h% x1 J$ g" }" }
void PWMTZIsr(void);
& _# F$ i7 M. U. A- s9 C& Y/ w$ b( n- }3 z3 U! ^
/****************************************************************************/
" Z( E; D! F+ h, ]3 H$ h/* */
4 A" G t, l6 S. H$ U+ G' A/* 主函数 */0 M* C$ |! _, E
/* */
6 e" g$ ~% I# y4 R* }" ^- M) T/****************************************************************************/4 T, |* \% L0 R# h. Y0 w; p
int main(void)" d) B6 n1 e' N) Z
{
; i+ b5 y1 s. } r% i9 E9 G // 外设使能配置
3 j7 D' U9 @! J0 n: @, i! Z PSCInit();
( J! v9 P! C& Q t
! e; y. Q- I1 w5 B! ]4 ^ // 初始化串口终端 使用串口2
5 Z K, _( l) B6 e% e( q UARTStdioInit();
; Z& ~1 m7 S% ^! b1 @ $ ^. F& V# ^, h2 z7 q* y: d
// GPIO 管脚复用配置1 ^/ D4 l% _/ ?2 Q
GPIOBankPinMuxSet();
+ R A9 h/ H3 Y" }* Q+ H
7 T& e+ W4 V5 Q7 ?' m // ARM 中断初始化
! A. _! \9 l( t) @5 d2 ] InterruptInit();3 ~; z$ ]5 W; `) n# f
4 Z% c, T# P/ U7 a6 S // PWM 中断初始化
8 e) ^# p7 y x: M" a* y. W# s9 M3 V PWMInterruptInit();5 a2 {9 t; }$ V4 s
( e& o/ G0 x, w/ O! U unsigned char i;8 c3 M, d5 \; `9 S3 j8 H
unsigned int j;
3 D6 e- w7 k2 e2 M Z. |" f0 ^3 A* F& ~; B% j% [+ ~
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);% Y' n" r5 D3 [% M, E" v
UARTPuts("------------------------------------------------------------\r\n", -1);
; @6 K% E$ \# D5 [3 W4 g% _$ X UARTPuts(" C6748 PWM Test\r\n\r\n", -1);6 s) \3 L& L# m8 P, H8 W
// 产生波形; x4 v/ s6 v7 ^! d( v6 C! F
PWM1ABasic(25000,50);" Z9 a. t! P# r/ f
2 A/ r+ y+ a% t4 l& c B
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
, d/ L- s3 h. v4 z7 r. G4 g% z2 l6 X UARTPuts("------------------------------------------------------------\r\n", -1);
7 U$ w* h0 l2 W7 V) B g) k b1 c5 ]) ~# M* V8 J
" k. ~( f9 U2 M& H2 ~' y8 m6 [
6 e6 \* `0 N! g* Q* i, w+ K UARTPuts("------------------------------------------------------------\r\n", -1);
+ \ F6 J7 N, |. v" F UARTPuts(" C6748 ECAP Test\r\n", -1);
8 e; i2 ^! m( }! m+ y& |3 c // ECAP 捕获初始化2 o; Y$ |+ L0 @5 V* R5 U# H
ECAPInit();1 ?& q- ~6 I% h, t: y
UARTPuts("Initialize ECAP.......\r\n",-1);. S) p/ f% s7 \$ o$ J
for(i=0;i<5;i++)
; O" u$ ?7 l) x0 I4 v {
5 x6 f$ U7 j4 k8 o5 p; R0 B- c( f for(j=0x00FFFFFF;j>0;j--); // 延时
8 W' X P" ?2 `8 u% z' ?4 u8 m ECAPRead();: X1 V. b9 m( {& f
}
* q" |- }- n( ]1 H" ^ UARTPuts("\r\n",-1);
( G3 N& G' [2 |# m: I UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
; c7 ]3 |% G& u1 m% i3 g. o UARTPuts("------------------------------------------------------------\r\n", -1);
1 x+ H7 E4 j1 I+ e. H$ Z. }% c/ `8 \4 r: B' M5 r# m7 T6 ?
// 主循环
/ t8 j i, Q9 R7 r/ [, T5 u for(;;)- l8 n2 D1 E N5 I7 |$ _: Y" A
{
( B# ]* N! w, |8 U/ C. J
; N2 s/ l I) c3 J# D }
* F) @# N/ F7 J6 [+ H4 S/ N# D}
/ |/ y. A3 {0 p6 N8 O, X7 F" _" [( e" V/ g9 H' k
/****************************************************************************/8 U3 w2 F X1 c! B, ]
/* */5 q" x8 u2 o' t5 e7 B0 _, e6 m
/* PSC 初始化 */
: a X) ~7 \. Y1 l; f |/* */2 y7 i6 d" F0 z# J2 s- i
/****************************************************************************/9 }! Y9 O1 X4 e! r9 E3 r
void PSCInit(void)
6 e+ x8 ]2 d" T# e{
; L( }5 m; ]6 K) V$ | // 使能 EHRPWM 和 ECAP 模块7 j- [& N \6 h
// 对相应外设模块的使能也可以在 BootLoader 中完成& q+ M2 ?# ^, ]
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 L+ o5 h" P9 V [: ^ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
% B4 {* y6 K1 x, n/ W0 S}& X9 R4 n% L. |8 z7 A7 m8 y% u8 }
- ~ j$ n- ?1 S4 B1 _% y/****************************************************************************/
/ C" G; e4 n3 x$ k5 I4 E- ^/* */& l) V7 r z* p; t& N$ P% w
/* GPIO 管脚复用配置 */
7 v: G2 G5 m. Z4 [' J' [3 G5 L/* */4 M/ ~6 \0 m3 C$ ~' R/ d3 m
/****************************************************************************/
+ l* e+ A! h* Hvoid GPIOBankPinMuxSet(void)4 ]3 q0 B) U: z
{
- E! m& M( I; O/ [1 C2 } EHRPWM1PinMuxSetup();
0 ?1 G% @1 \/ }* H3 a8 R
2 x, K6 V( S2 j // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)& V. j, A9 e5 S
// 作为捕获功能时管脚方向为输入3 W, b5 u9 `: E. u
// 作为辅助脉宽调制时管脚方向为输出
- e5 f. ?6 _9 z: K // ECAP2 / APWM2
4 f9 W2 x2 x( c7 \" ]+ Q. g9 |" k; p ECAPPinMuxSetup(2);
) c6 o" X" a# J7 M
I R: V) g& _# p* F, j; }# a // ECAP2 / APWM2方向设置为输入6 n2 ?( I5 R% W7 t2 s0 G* M4 Z k
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7] F( s4 O8 M- x& z
}
3 N0 k9 z3 Z: ?+ P1 r* c
+ k! j6 q) b. l; K: H' T/ {7 d* M' m$ g/****************************************************************************/( A: R8 _! c0 {/ J9 d l9 J
/* */4 J1 u. k. J) E& \
/* PWM 输出波形 */2 r$ n: M. o9 f
/* */
8 i( }4 U% l& P; Y' D$ E# Y/****************************************************************************/
; C4 H, d4 E, ]$ Z+ yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
; O. W0 P: M! |! d1 N{
1 f1 W) A' o5 q. }, o // 时间基准配置
$ G8 v9 V: q1 [( T$ R // 时钟配置
/ } K8 T% m1 |3 R: b, k EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
' G. l2 v9 o" d6 E3 U, H. A3 y3 [% r
// 配置周期9 O Q7 Z3 w! L2 L( V
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,4 ~# _2 \) {$ e( U4 J s4 M
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);, q, _7 u8 N8 m0 U
( h. ~8 r, e6 U
// 禁用输入同步信号8 w& K; b# U9 r
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
+ H+ E$ P/ P- @" f. g1 c( X9 B+ b* ^
// 禁用输出同步信号) S; I5 o) R. T9 d
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
! t: Z) J" ~8 ]3 l, K/ K6 T" ~3 [8 u) j
// 仿真(DEBUG)模式行为配置
* E! X( P7 q( ] }5 t EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);' a8 b1 |7 [ G/ Q; u$ v
, h$ U, l6 i3 |5 J% c! { // 配置计数比较器子模块$ J6 O( z, C3 z! ]5 n+ U- \* i4 p9 o
// 加载比较器 A 值3 p8 v9 J; Z8 R
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,* l1 b! C) g. n2 c# _ y
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);8 }) _# l' Z! g Q* Y8 k
% H: m( F$ N& j! j9 Z- m" e, Y // 加载比较器 B 值
1 I9 R! x* b; }$ G. h EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
' c. a4 p- r8 s1 b' e' y, g& \ EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
+ [) B, S# U5 Y1 E
) H: U# l8 r8 k( `( |- I // 功能限定配置(输出引脚触发方式设定)
) }- m* l' _/ M // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
4 \1 g( z8 g# G; j! A4 F EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,8 B* c% b# \4 `1 S( S; S
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,! U/ Y* `0 N3 S1 t) O) G5 e
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
: Z( L5 k7 v5 w7 A! v+ w6 w
% g; K- i1 B1 V, s- i // 禁用(旁路,信号直接输出到斩波子模块)死区模块
; j0 B7 B, y7 I+ G. I EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);0 v# [) ?+ }% \
( K; w* T) ?, h7 e0 x+ E* I // 禁用斩波子模块
, n- H% {7 N. t EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);# |0 ]7 w# a0 q2 k. N
! k6 {8 p" P' ?4 B9 c; w3 w5 |
// 禁用错误控制事件$ F& m/ S) A" m6 i4 k# H U8 P
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);7 h2 Y& N3 l& ], Y) c
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
$ v. C$ P: L, }* }5 |# L3 i
" Q; g! y6 f* S // 事件触发配置) w* B! T6 C# m0 O
// 每三次事件发生产生中断
; W3 c# H0 M7 b* X0 s. u EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
' ?% b0 Y9 W! E' y8 j- Z" z // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
9 M: K$ k$ v# x5 x1 K/ B: c; D EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
( C: V ]3 T+ B+ E // 使能中断
# w/ I# V5 ? P& D) w8 P" } EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
" P: x# @( |: G" o2 d1 Y: Y ?, G' N2 `
// 禁用高精度子模块
. @) q( m0 e; @" a) a4 ^$ G EHRPWMHRDisable(SOC_EHRPWM_1_REGS);6 Q! {4 p0 \& @1 f
- Y; l" b0 K G- M9 B& k m. J% m
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);0 f8 ?* J$ O" S+ d
}
: H& u/ I- P2 _: Q
- v! |3 w: M& y7 n4 T9 r& a( J; lvoid ChopperWaveform(void)
. ^& S5 W! o* F4 Q, q{" A6 }/ Z+ e6 Y* v
// 50% 占空比* \, J4 E1 l+ X0 M
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);! h8 q3 F' ^% i9 o
// 4 分频3 s" A- `9 W8 ^7 o. P9 p8 B
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);6 Q; M. B' A4 ^4 O, J
// 单个脉冲宽度
$ W g7 M1 J5 I4 l6 ]& E EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);) F4 s* @/ Y( l" ? p4 z
// 使能斩波子模块
( m$ |: W6 D. ?& t EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
! [7 u# J6 e/ b, a" p}
( Q/ `* W4 G2 I; I% c! \# t6 t9 G! k3 e9 t6 U# s# @ c/ `3 b& o
/****************************************************************************/
* [1 n' l. j) `7 s6 Y/* */
" Z+ q/ p. G6 V9 _7 g/ x$ Q/* PWM 中断初始化 *// |/ L0 {$ g" I4 @2 q
/* */. z4 S' Z* i; Z- M
/****************************************************************************/
' u7 B& U+ Q6 c. }/ Fvoid PWMInterruptInit(void)" `0 ^. z1 P; C8 ?# [
{
. }3 t. P9 i2 w9 U1 X( ]3 W // 注册中断服务函数
1 M! R2 V# S, i& Z' o IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);, r3 s& o0 \8 t+ y) b9 D" P
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);9 R+ M4 `5 H. m% \2 W; ?! g
- Q6 F( e# A# s6 I // 映射中断- P1 q# \# B& g- }
IntChannelSet(SYS_INT_EHRPWM1, 2);
# R/ ^- H2 H, H( w IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
/ X8 N# M3 ~, |8 X9 x# X5 q' B/ e# M
// 使能中断5 ?5 j9 g' E- b- [/ J
IntSystemEnable(SYS_INT_EHRPWM1);1 D, n& S% h1 a
IntSystemEnable(SYS_INT_EHRPWM1TZ);
; q+ A9 F+ n& m! v( u6 L}2 K# r! j. u- N9 q
+ @5 G7 c, Y; X' z: X, x
/****************************************************************************/
2 F- \. \$ L8 `/ ]/* */: Q+ z9 N, E0 k B- {
/* ARM 中断初始化 */5 l% `3 Y. Q1 i7 [: W
/* */% I+ e: A3 k" i9 r( E9 m
/****************************************************************************/* N! U9 N/ f3 p
void InterruptInit(void)
& g- Z* [1 J% r. G{
9 {1 t7 [ H& }" d$ R // 初始化 ARM 中断控制器
7 `0 }2 d; o: V ?" R IntAINTCInit();
5 D- D2 Y8 e# o6 I# T3 t0 B* J @5 r) u+ J
// 使能 IRQ(CPSR)
$ G; e' f+ R' r& @' H. Z IntMasterIRQEnable();3 m" c O/ ^0 E6 P& _
0 B1 F( H2 |1 H( D; T // 使能中断(AINTC GER)2 t, Q9 w( m4 h5 E5 F. e
IntGlobalEnable();3 g7 u: ]* M, G. j- H, S
& ]0 c( _1 M0 v$ _, T, p1 `; w/ w9 x6 o
// 使能中断(AINTC HIER)% X/ B/ b4 y2 s/ }
IntIRQEnable();
' G- q7 k0 e0 b1 c k; j: ~6 _}
) I5 @. C, _6 d! K: r7 |+ z5 q, e V' `$ t* C
|
|