|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/7 M. E$ C9 ^# Z; r5 X
/* */% m9 ~" ~# I8 f8 I
/* 宏定义 */7 d7 m3 X8 I0 Y. N( h5 o8 H
/* */
2 Q1 |% A" a. J/****************************************************************************/7 z* h* A s! G* ?. t: c5 W1 ?# K
// 软件断点% ?: h% L- \# |
#define SW_BREAKPOINT asm(" SWBP 0 ");
o& m1 A1 r9 N& J3 M D9 v' \) R! t: ^
// 时钟分频8 | ^% Y6 e/ i& t7 E% d2 ]4 S5 n
#define CLOCK_DIV_VAL 228+ P \) b; ]+ t3 N1 i% u2 W
6 m/ |: f, W+ ?( k; P" a( E
/****************************************************************************/) H! f# v6 h! w& i/ x6 R' T; P+ }
/* */! X7 Y" ?3 G1 B! u
/* 全局变量 */
( b y0 S. v- ]9 `% g; k8 w/* */
% ^2 ~' D( r+ \; q" U! S' u/ C/****************************************************************************/2 j) I5 c; c/ B( U) n
ECAPCONTEXT ECAPResult;7 O+ }; k# Z8 ?' G
i, |0 b+ B: M; r: O, v
/****************************************************************************/( S6 N! k3 m; {: G* N M
/* */
6 q( M% n& O2 ?: A6 ?/* 函数声明 */, T1 o( j' N" O, s* \5 H# c( Z% y
/* */. D6 ^3 m5 U( y9 s: ?
/****************************************************************************/+ h& b& g( f( g: P4 W. E
// 外设使能配置& v8 x8 c) w) u7 g8 h
void PSCInit(void);
( ] d% n* s$ q1 j4 }2 Q. ?" \: L n3 R/ k! T
// GPIO 管脚复用配置
" ^/ }0 u7 a3 A4 {void GPIOBankPinMuxSet();5 X/ P" d5 q/ F& q
9 _# ?7 o5 q9 H% J5 o+ j B* E
// 产生波形
! {. `+ P- @6 P7 G0 o: L5 Yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
3 b" g% A- S! V- e. K: [1 Ivoid ChopperWaveform(void);
- [" l p( w5 g- p2 B$ @
( l' g2 E$ F! M$ N8 d, a: e4 t// ECAP初始化和读函数' c- M$ `( ]5 M
void ECAPInit(void);
5 L3 b/ V( _. F" x; f$ f. {- Cunsigned int ECAPRead(void);
' F& A+ P, i$ \; W7 v T
, z1 Q: H* Z3 Y, u. m6 T" [! Q//ARM 中断初始化
% A7 w+ x" ?, c9 U2 j4 cvoid InterruptInit(void);
% V4 w; n P6 H% ~0 u1 ~1 e! M- w" _9 H
// PWM 中断初始化5 ?' F g$ X7 ?! A4 v. y4 G$ n, H
void PWMInterruptInit(void);
o( r. s+ h+ ?// 中断服务函数
& @9 \0 m8 p! `' u4 U0 r7 H, b// PWM 事件& ~6 X3 }$ c' Y9 b B$ q
void PWMEventIsr(void);
# [$ \: w1 q/ X% D0 G// PWM 错误控制事件
0 D3 K4 u0 b, T5 M# b$ o. Svoid PWMTZIsr(void);# g. a9 P% N! z# H2 l
. m6 l/ o9 u4 @# s, y) M# C, F/****************************************************************************/
, ?8 [- w3 J0 U/* */6 h* {4 v) c; J# I- K6 ^2 C b
/* 主函数 */& _* E, A) w' w
/* */* O2 S, O: h3 e
/****************************************************************************/
8 t& P$ l1 r4 x" x' @5 A3 ~. [int main(void)
/ W7 O9 M' N# K8 G8 W/ O- ~$ \! T{
) F% u' v) s1 h+ V( \- V // 外设使能配置
Y% _" P& c) U5 G PSCInit();, a" r) Q/ ?+ O0 g4 k
/ o# F" }! l" u
// 初始化串口终端 使用串口2% K$ e( n6 y% |4 r5 R7 c
UARTStdioInit();
. L" N }# h8 x+ b0 }: { - U& g) X$ `9 u& i% _
// GPIO 管脚复用配置- ^ {0 o9 O! d
GPIOBankPinMuxSet();
7 t2 T9 t/ l# [' S$ {6 E
# |2 `0 c& v. C& l) n3 P // ARM 中断初始化2 d; H E. W' P1 h' q6 G) [; Q
InterruptInit();
8 B* r2 H: S% m7 t$ X- D; c' c3 O. u
// PWM 中断初始化 C' X- g& ~7 E
PWMInterruptInit();+ o; R: F9 l p! E( v3 P
0 U, l7 |, o! A
unsigned char i;- |6 u2 T1 K( g6 M" L
unsigned int j;
* R' t* B& v/ y, L0 |1 k
, ~* V p5 H. t' i1 O+ H UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
2 H: A+ G- V: S" O! t9 k! ~4 N0 ~ UARTPuts("------------------------------------------------------------\r\n", -1);
8 ]! T- `1 Q. i: o0 \+ H/ e' @ UARTPuts(" C6748 PWM Test\r\n\r\n", -1);& u- C. {6 ~* ^. g+ ]# X
// 产生波形0 Z+ B9 e+ s# G$ o
PWM1ABasic(25000,50);
4 `& y. p2 e, K; h a* P( C9 V" W. j1 J
UARTPuts(" C6748 PWM Test Over!\r\n",-1);/ F' l5 _0 g: B. ~3 E4 s
UARTPuts("------------------------------------------------------------\r\n", -1);
5 W& g H# }# m1 W) d2 w
6 e* j7 I1 P, W% a4 t% l5 N) ]6 z0 Q" a/ J# L+ l
2 B! m% k& h3 ]$ W6 q4 Q5 Q
UARTPuts("------------------------------------------------------------\r\n", -1);
7 A5 N- P$ E W2 j5 N* @# I UARTPuts(" C6748 ECAP Test\r\n", -1);
: ~# ~: \" D9 ~1 z# B4 |9 ^ // ECAP 捕获初始化
$ o* e& h# l7 f/ y ECAPInit();/ B: u- S$ w! w' H5 `# ~
UARTPuts("Initialize ECAP.......\r\n",-1);
, ]7 t ]1 f( {6 g for(i=0;i<5;i++)
- s' D) j/ A% ` B6 a. C+ x {
( _# B$ ~6 ]2 Q; l for(j=0x00FFFFFF;j>0;j--); // 延时8 m; z4 Z4 p( n" C* V" D
ECAPRead();+ M- h+ `6 @2 q& a$ ^" z
}2 v5 I3 u' C, w
UARTPuts("\r\n",-1);4 U0 z/ Q5 N3 ]
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
) B5 H" n+ Q- S/ b' p9 C$ T; G UARTPuts("------------------------------------------------------------\r\n", -1);
( g! Q. \! G# k3 x# E! ^, ], {3 r# b$ d& u+ _
// 主循环8 j0 k% @) x j7 U1 ]) y
for(;;)
: i/ y* Q3 j6 P( q {
, u1 u z5 J0 Y& D' `7 h/ ^3 c! Y3 n* Y; Q/ C3 k& n; U( C
}" E" n4 T2 x5 R0 |
}
6 l0 |& w/ n/ Q: v$ E8 b, M- Q; s! a& H; I
/****************************************************************************/
* q1 N( D7 {! G' v$ x/* */
, U, Z9 d8 U6 j2 b0 q; o, r$ ?3 _- {& w/* PSC 初始化 */
3 H: ?5 v% Y1 ?+ F3 ~6 d5 l/* */5 Q; {2 v+ g9 {5 ?
/****************************************************************************/2 `# l4 L! g3 u. d0 k& G
void PSCInit(void)
6 A4 s9 j, v I- [{) \8 b/ m0 {$ i D
// 使能 EHRPWM 和 ECAP 模块
T& r3 H! p3 W! H# }' { // 对相应外设模块的使能也可以在 BootLoader 中完成
/ m. Z# M! s' l. M8 W+ ? PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 Z# `' z B; h. G8 v% `/ K PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
* z- @2 J" b! f+ z& z) o8 ]7 K/ J}
. P. |4 s' w2 `' d( M' I" g& H5 o: s
+ G2 b6 A. Q1 \4 M0 ^+ V/****************************************************************************/
- y" B: Y: Q9 U4 i ^/* */
: ]6 h7 a; i* n* d/* GPIO 管脚复用配置 */4 k& b2 R' Y2 ^4 A7 w* N9 C
/* */8 y6 L9 ?; U3 S e6 s8 O, v+ f
/****************************************************************************/
5 r( t5 w- F8 ?void GPIOBankPinMuxSet(void), }; v% _2 {4 p: G& c
{# Z% @6 O* o9 k9 {9 @. ^+ t
EHRPWM1PinMuxSetup();# O; ^" y* a% a2 U0 H. o
( N. A ]% p$ [ ]6 L$ M // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)0 m% |( V7 x2 s, b4 [5 r7 O
// 作为捕获功能时管脚方向为输入8 K4 n6 H- O4 J- T" q
// 作为辅助脉宽调制时管脚方向为输出$ t1 k/ ~" s z# Q3 H' z
// ECAP2 / APWM2# t8 t5 `5 y) q( F
ECAPPinMuxSetup(2);# H* F$ C d3 \# R
! A$ m( [# f; W // ECAP2 / APWM2方向设置为输入8 {" V7 D) H) b" ]- l5 O( b; w5 [
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]3 L+ _! u3 C; D3 N7 C0 ?
}
6 u6 X% N2 r" F M& }
* _0 F: i$ s. G. }( c$ V1 [/****************************************************************************/
! O: }( V; G5 Q+ V/* */
- D7 f' }0 b w& @/* PWM 输出波形 */# Q0 ?; \5 a- f. f' V8 s* |' a1 {, l
/* */' h9 a9 A2 b- n3 q! T) M
/****************************************************************************/+ s" K8 \: a+ H! y7 j3 q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)1 U4 q# s* x/ t) r3 w8 }6 a
{4 D4 T2 Z) x5 V! i+ N2 `; [2 ]! l
// 时间基准配置- ~4 k/ K& M# R7 G6 _3 H- b- P! C
// 时钟配置
( |( ~, S- K# Z4 L5 Q EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);+ C: q7 N0 b6 S( l \
5 A1 W' v# l; H0 @
// 配置周期; |" E% e. V( H- i, q+ b# v
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
" ^) N& q* |# Z& I pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
0 M6 Z/ ?, j" U: c
% t/ `1 l" P* T* `4 D" W // 禁用输入同步信号
$ S* a; P7 L/ T" [ EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);5 |' O# O L0 l3 _
# A" s9 \8 b# y" G% I; j // 禁用输出同步信号
7 V3 \8 x0 P1 h EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
; ]8 ^$ s& Q/ a0 _
2 b3 t: `: j6 m' d, ~/ b. M: ] // 仿真(DEBUG)模式行为配置
- a9 o( H5 G, ]$ q$ J1 K EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
$ Q/ c6 c$ V5 S7 O2 v" F% j7 j/ D- z" A" k3 B
// 配置计数比较器子模块
8 i: I2 y7 A% a- w // 加载比较器 A 值- r! v1 K6 c7 X$ k6 I) h% @# ^" Q$ l
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,; s# n/ }$ v/ B; G% R
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 a% m, y- r( D6 h w* {' q2 u# R
// 加载比较器 B 值+ d6 f6 z( F. e
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
$ w6 z" a: _3 h EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 y* c! E1 D" J& J8 G4 {9 ?
" [+ q+ H! t: E/ z) a" p* A3 Y // 功能限定配置(输出引脚触发方式设定)( k% T2 \( |8 F+ Q+ v7 t; y3 p/ Z
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
- X+ R0 p; g8 Z" J* \) h EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,( S: j. o0 {% V# j2 I
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,, t; ]7 z; Y. q0 V: @: L; D! Q
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
2 \/ f8 G/ ^8 o; ~+ z
! ^3 c% B9 X+ R8 G& _9 g // 禁用(旁路,信号直接输出到斩波子模块)死区模块# `8 {. p, Q6 R; V" H* z7 N
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
/ B$ L; c' p# T/ G2 B! f
, \* d) h# g. X3 g$ m // 禁用斩波子模块
% e0 K8 a1 r4 f1 N7 s EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);7 A" P$ u# M o1 D9 |
4 J; K! D S0 e2 T, ~! }2 ~ // 禁用错误控制事件: ^' E5 o g" J l9 C" A8 L. p# T
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);; d L6 X8 `- J/ H3 s5 |6 s
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
9 v- ^! r* ]' t- k9 m
- Q, z5 k1 [$ c) N. W) | // 事件触发配置
; r" @8 o8 H3 D% F: N4 I // 每三次事件发生产生中断. ^- ?! J, q, ]4 C& K$ r6 b
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
, k% E8 p E- F/ Y( W( ^4 K! c: | // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
! c+ D4 J$ q: R! O! ?" S7 e) K2 k EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);8 @9 L' g* L4 s& m F: ?
// 使能中断' J5 m+ V, b: j/ |* {0 I
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);3 m+ V9 p4 j; |2 m7 {
- M- |( e2 H" |; M // 禁用高精度子模块+ K* H( _4 n( B8 A
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);( [. g0 \& F. `+ z0 ?
3 [0 p: q- V6 `+ b8 E) A- O5 L. O
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
8 \8 w+ ~, j/ O+ G7 E N0 ]}
- w) y+ C8 F5 I6 s- P1 T% h9 n0 r i; e- H
void ChopperWaveform(void)
# Q& ]1 R4 n/ F1 f{
2 I* b- J; K" T$ J // 50% 占空比8 J3 A$ ~$ V7 \5 P# K* b7 y
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);, E9 v0 ]7 h8 A% j) ~" F
// 4 分频$ p# s* k, y5 e ]
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
/ E1 M" [' F6 Y- P2 W: y$ x% D // 单个脉冲宽度
9 {( |% g' `! F- \( C EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
! S/ r- W) e6 q5 w // 使能斩波子模块6 ^$ u+ j8 [% n* i
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
. j' \, W4 U; Q3 Y}
9 a* t w% p/ A- w5 X* e( ~2 X' N2 K$ C' D
/****************************************************************************/
4 Z# g5 f/ j9 Q/* */
# `+ P/ t3 W5 D# |! H8 E/* PWM 中断初始化 */
0 v& `# b3 O+ {+ k- i' ]/* */, Z3 N% B+ n1 W; ]$ U4 |
/****************************************************************************/
+ c9 S4 p( H8 P( Vvoid PWMInterruptInit(void)0 M# n8 F$ o( u1 Y; I
{
; E+ g! O2 C+ q. B* Z3 t2 v$ w8 ` // 注册中断服务函数
/ u! p4 n& C7 v& l. e IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
( U! _! p/ `; R IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);* u' n& e$ r9 ^" B J. G1 z
$ Y/ _5 P/ e8 [- R% ?+ X // 映射中断* z0 f; r7 H/ G7 r) S: w
IntChannelSet(SYS_INT_EHRPWM1, 2);3 {8 |6 j+ I8 v( e
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);$ f7 M0 ~7 T2 d. ?
2 U, u s9 \2 M3 I' h7 c6 O' q+ D8 S
// 使能中断
]9 s+ Z$ `2 Q7 t1 A. ~) A IntSystemEnable(SYS_INT_EHRPWM1);3 Z/ v) S4 O3 ]9 H, O8 u
IntSystemEnable(SYS_INT_EHRPWM1TZ);
8 S% K& C& n! [ H% Z" \$ F& n2 A}( g! F9 c5 J6 N( }0 ], V7 q
" k9 B9 Q& ]5 @1 {
/****************************************************************************/4 k0 x: `7 g, R2 a9 o
/* */
- S8 Z: p5 M4 D/* ARM 中断初始化 */
! G/ b+ m1 `# h5 F" u, D9 h/* */, X, B) T; ]: Q m* H
/****************************************************************************/
" C8 i# [0 q( T# d% z5 Evoid InterruptInit(void)# B6 q. x5 V0 k6 g9 D. i. C9 S
{" t, k: x# X0 L
// 初始化 ARM 中断控制器# Z- o: T$ B( f: W" B) v# ~+ |
IntAINTCInit();
$ r) h X S7 w( o w' v5 c+ I9 a9 q2 d
// 使能 IRQ(CPSR)" i; |* J" [$ s/ h
IntMasterIRQEnable();
i Q1 A" U$ S: B/ L1 U1 _
. s9 T1 l6 R- {/ W4 n$ m/ A$ T" M6 ^ // 使能中断(AINTC GER)4 Y; `3 V8 J, o0 e# X
IntGlobalEnable();3 T5 G6 K% t2 z0 F" s8 x& J
! c% X/ h: ?* V4 R+ N6 P5 y3 H
// 使能中断(AINTC HIER)
; m* X# \9 u/ c2 K1 m8 y IntIRQEnable();) X7 F" M X! [( K; _7 E6 X
}
- W6 w5 m" k, r9 L$ U/ Z C) [! B' `1 e) O2 |3 e. d. F4 M9 [! D
|
|