|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
8 _$ b4 ?* T9 o4 l4 S" y/* */7 V- L, t5 k! R, V
/* 宏定义 */9 @8 d# @# ~* v5 t5 _: c
/* */3 X7 T$ o; Z9 ?- U3 k
/****************************************************************************/
; A0 v" L0 M! j& _// 软件断点
- ~: u! q( y& _- R! I#define SW_BREAKPOINT asm(" SWBP 0 ");
+ [$ R* y8 U4 ?: n" a8 c, p
R% o4 @' }4 q$ m9 P: ^// 时钟分频
1 }5 L% A" Z4 J1 d$ D7 I#define CLOCK_DIV_VAL 228$ j& ~4 d( u, e
! O* F% d C+ n* s3 Y/****************************************************************************/' A) G2 z$ r& h8 {& y2 _
/* */9 x3 k( c5 ?' x* V8 ~: {2 {
/* 全局变量 */
4 k$ Q! m h" g( q/ R4 y4 l/* */
$ S, p" p9 B' v. v/****************************************************************************/
2 w0 N2 Q! L& k; [2 \ p7 KECAPCONTEXT ECAPResult;
) @( u) \+ C4 N; D9 R4 ~% o2 @- p4 Y. _! {
/****************************************************************************/
0 n, O/ R2 y' s0 Q0 @* t. W' l5 T7 `/* */4 i+ S( T3 d7 r6 w
/* 函数声明 */. _) Y! o& Q2 r! f
/* */! R# |; n A+ l1 W2 H( ^1 @* ]4 y G
/****************************************************************************/, S1 ]# v* L: y/ u( ^5 k: J5 R
// 外设使能配置
; r6 B- b! u, R) y9 gvoid PSCInit(void);
# N' p* r4 Y/ Y9 g$ B
$ g; p/ n2 w; K8 m// GPIO 管脚复用配置
R' E- [1 w2 s; Ivoid GPIOBankPinMuxSet();
8 A+ _4 |" V$ L+ T/ I8 _. V% U+ _1 M7 a3 s! f0 T
// 产生波形4 {8 d) c) h& \: X/ m* `$ h$ J
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);" o/ U% W; O" N/ l, T v" w
void ChopperWaveform(void);2 z O9 M7 A/ J* _3 s
& O# s( b+ i" K% I0 m! K w8 S
// ECAP初始化和读函数4 P3 F( e( H" |
void ECAPInit(void);$ R$ r2 h4 U8 p" v' Y l! q0 k, Q
unsigned int ECAPRead(void);
) c) h' `" R- e* r2 r5 \) R
! |$ H( b, v" j7 L+ D P//ARM 中断初始化
7 J( I; z8 ?% r9 T Gvoid InterruptInit(void);
& V$ q- ~/ O; O8 j# Y" b6 q/ u. ?9 X7 E! n5 A* `
// PWM 中断初始化
6 ^+ a- Q Y9 M2 d/ w% Hvoid PWMInterruptInit(void);
1 Q5 w& y1 v2 y# j, V/ l// 中断服务函数: j1 a/ E7 D8 _; b
// PWM 事件
2 e0 S' ^8 q; J' {, U4 Evoid PWMEventIsr(void);
9 Z, a8 k" U0 \9 u1 y# B// PWM 错误控制事件$ D) T/ B/ `3 l
void PWMTZIsr(void);, R9 G- A/ X. [5 ^& x: P) w
7 r$ h, l8 {" B+ v1 q% c E" h
/****************************************************************************/& g5 K. [$ C1 Z) `4 T9 Z
/* */" P, Q' ^7 B! z+ Y
/* 主函数 */
. W: I5 u. o6 ]2 G# e/* */
+ p: h- [; J0 n0 E& O% s/****************************************************************************/2 D: V5 c- b4 V" \; B* R$ C" L
int main(void)
: l* g& K+ a% r6 T3 X% G{; N) @6 U3 E9 p/ P* J ^
// 外设使能配置8 x) {2 ]! j3 R! `
PSCInit();9 Y8 y! Z2 P) k4 Q" v9 h3 i
# \, ?" t- U5 O) b2 Y
// 初始化串口终端 使用串口2* D& c: ~$ X3 i+ O: _) X4 c; W
UARTStdioInit();
( b+ Q$ }7 u" S9 ?% Q 7 O6 ^4 N$ Z' l' W
// GPIO 管脚复用配置 ~* L8 C& E. m9 a& m+ Y+ d
GPIOBankPinMuxSet();
6 |( _' q$ ]' r2 b
* y9 q0 R' R3 q& U0 h" N$ M0 ~! V // ARM 中断初始化
# G" n* h4 x7 h4 B InterruptInit();
. D% b& @3 l% n+ k3 U6 f1 z' ^5 Q) s
// PWM 中断初始化$ v" a5 }4 [/ c* l9 \* K
PWMInterruptInit();
$ I3 C* |8 V- g# h
% B5 a5 b b {) V% Z unsigned char i;
1 V! y+ W. @* H9 p- x& n, B unsigned int j;1 ~ \" T4 e8 d) z) z* y% {
1 K; J7 H- _& P UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);+ K' U# i5 i& K3 m
UARTPuts("------------------------------------------------------------\r\n", -1);+ N; K' g- O$ u$ x2 ^& L: D
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);7 f! y/ D( L& Y8 p6 Y+ H
// 产生波形
- S( @- T& E0 j) x/ ? K PWM1ABasic(25000,50);
! h* V' c/ f( p6 Z2 |
. F$ Z5 w5 `8 q7 o UARTPuts(" C6748 PWM Test Over!\r\n",-1);2 y+ d5 ^3 z$ }- S
UARTPuts("------------------------------------------------------------\r\n", -1);
' @0 { V2 Y# ~8 S4 M: m
; O T8 [6 L" |" N+ R3 K3 w/ j0 \
- S4 s2 X& o2 z; R6 W
UARTPuts("------------------------------------------------------------\r\n", -1);
2 @7 {3 Y$ M \% T4 E UARTPuts(" C6748 ECAP Test\r\n", -1);
% H* {8 s5 L; {0 a% y/ R' g. ` // ECAP 捕获初始化
. \4 o. W9 O/ \9 {$ b+ A, y3 N% ~. p ECAPInit();5 q+ n1 f! J( C7 [; ~% c
UARTPuts("Initialize ECAP.......\r\n",-1); Z! C7 E8 Y$ \1 S L! j) D$ Y
for(i=0;i<5;i++)
5 K3 J s; u+ Z3 D, G$ K8 V) X {: d7 r7 B/ M* Z
for(j=0x00FFFFFF;j>0;j--); // 延时7 G- r+ J- S3 L3 v1 u: J) i! w
ECAPRead();4 O7 G" l6 n" `+ u& _, P
}5 y1 h6 v9 d) u. ]( v/ f) `2 W
UARTPuts("\r\n",-1);
6 P8 Q4 x) l* [+ G4 v UARTPuts(" C6748 ECAP Test Over!\r\n",-1);* a* z- v) o9 e
UARTPuts("------------------------------------------------------------\r\n", -1);, c* ?5 y3 h, x' e
7 V) C9 S0 [; T3 D& k2 A* t // 主循环" J: u2 V$ {! P- p6 O5 F6 |
for(;;)) I5 a% |# a$ \" Z! \$ s
{5 u) X2 c% E; n: P. c
- g8 q# g, ^ b s8 m
}. v9 ?$ [3 i" f) }; I; `) T
}
, M" Z7 W) G9 d9 [" S/ {2 L' m5 Y3 _8 I8 V
/****************************************************************************/" I1 p d1 {# c/ n1 O
/* */
1 z& k' G7 E0 ]* g% h) s; v/* PSC 初始化 */
2 C5 @- T9 b9 o7 a/* */
' [& R g, x3 L7 ^, l% b/****************************************************************************/4 X ]) w7 {# y6 Q8 L9 C" j( x: C5 e
void PSCInit(void)" v( ?9 v( N- V: y
{; U/ T0 R- l }: B
// 使能 EHRPWM 和 ECAP 模块6 E' @& v5 m, ?" i8 c5 d6 W |
// 对相应外设模块的使能也可以在 BootLoader 中完成# ~: E9 {. ~7 ^( n& ~9 g8 P
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ X8 `( X8 |2 B% A PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
. N7 h$ i) {5 Z* I( y% m4 y& j5 P' h}! {0 \: t% D2 w" Q/ D8 Y4 T+ s; }# l, L
2 p8 k( k; q6 w% f. V& N. ?/****************************************************************************/' ^) U9 I" _6 I& f5 u2 u' K* ?- X
/* */5 D6 `! M" \4 O: b
/* GPIO 管脚复用配置 */
$ S5 l/ @- N J/ X* N* F* E! \/* */! y# K( }0 p5 D5 W# k) L' C, E7 A
/****************************************************************************/
0 t& i7 m3 h" ~) N* Gvoid GPIOBankPinMuxSet(void)' c9 ^* c) ?' @( i# V8 o1 b- w/ {
{
+ [- X c/ w' M0 k EHRPWM1PinMuxSetup();- s5 F3 X; j& b; V; S3 |
T- [$ Q* o- l4 O% c1 D) d // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP): K/ {& f) T9 A3 ^6 t: a
// 作为捕获功能时管脚方向为输入
% Y7 X! {5 ?' _( v1 U8 N8 l- _ // 作为辅助脉宽调制时管脚方向为输出$ V$ M- d+ D$ v& `7 r% z. N+ r/ O
// ECAP2 / APWM2. v2 p. f5 X2 [+ p7 A4 {
ECAPPinMuxSetup(2);
! Z5 O% @* B4 B" T" ^: |2 @% y3 p& \1 ^& L' J( e
// ECAP2 / APWM2方向设置为输入
. C- p* f% h2 l+ v) p GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]2 v: ?/ A& L% m1 f2 `
}* u; W& s5 x; _8 Z
5 `) D9 c% `8 q. T# G" B. M# s/****************************************************************************/
! H/ |/ z3 i O! W: C/* */
" R$ e& c" X4 B; G9 h P/ }5 G/* PWM 输出波形 */
" ]1 _* D, B2 U. c( m; W. w/* */6 c* U. ?# D- e1 l7 d
/****************************************************************************/
& ^$ D: C1 x9 k( p6 M& pvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)* @' @( ?) B# Z
{- ~ W7 O5 u' G- {
// 时间基准配置% O$ I3 Z( F9 c% x* e/ N2 z: T
// 时钟配置% X) P f& L2 G1 J* j& a; @
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);* i1 S8 x! o) K- C
) K5 k3 n4 V1 u$ h# K2 |9 i! |
// 配置周期$ w0 m! K7 Z/ p4 V" q( Z1 h
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
5 \0 _3 o8 H( Q3 V/ c pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
; D5 t4 G0 R2 e3 T) }0 v3 Q; j* Z' p4 S, K0 V
// 禁用输入同步信号
4 k! j7 C1 z) c7 n Q' t- k! i EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
4 Q* B" x$ Y/ X4 l* q# V1 s# u f ]! X" u
// 禁用输出同步信号5 R Y- Z: a k* D Q& d( L8 X. W8 s
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
2 E" D0 k- b4 @4 s4 D: I. r4 c( i* ^. g7 g$ E
// 仿真(DEBUG)模式行为配置$ |/ a; ~1 P: Q4 g$ w* t
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);' t1 l, H& d. b* Y2 k) M. G" A
+ w7 r; h8 l% S7 w2 P; N // 配置计数比较器子模块
. |5 y! W2 k% L1 l // 加载比较器 A 值
, q3 o6 @$ Z! e3 P EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
- |2 o# S) B+ c: ~ EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) y: T; n3 v. u* I- U+ H- W9 J& _1 s; c- j9 W6 ~
// 加载比较器 B 值" E; C" o C5 z
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
8 ]$ I. N9 _! {0 ~5 m; U* t, [ EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);* V8 o, E. Q2 a& O
% j& R; V8 U4 W. i# }) b4 E // 功能限定配置(输出引脚触发方式设定)
, d3 ]% I- G4 L c/ l // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出# V# n1 h* U! {; f
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,2 b+ V& Y4 j- D% c, _
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
) v. C) h' O: U/ [ S! ~ EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);; X& R! u( q0 s8 k- z) N
; R. G6 } L8 Y% a
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 p6 L( X. E i; [. Q1 ~% H EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
6 \( b% a' b1 ], I
) N7 L; V3 P1 ?" c // 禁用斩波子模块
$ ^/ L( ^5 P0 ]7 E EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
, W( g9 S& g) t) |) \( p) O" N* U. j
// 禁用错误控制事件2 k2 z) ^& M* T k. o, }
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
6 ^: I6 T8 k. Z8 i- B, w EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);5 B0 m5 F$ B+ u$ x( |# f
. x& S# i% w, Q( n* t
// 事件触发配置/ g) V" X3 n4 |7 e8 Z7 d
// 每三次事件发生产生中断) I1 P( d4 D% v
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
' H' L: P1 h$ L4 s0 f/ ]0 G6 | // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
* O. v v3 }6 Q$ ] EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);) M8 [7 [+ H: m5 C
// 使能中断7 O6 x2 _# h8 ~+ c" \ x4 U0 {* ?, o
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
. y! X( _: f, M5 [/ i
d. T$ Y5 H. e8 u // 禁用高精度子模块
9 N) ^, i: H# L- o) n/ p8 R0 F* v EHRPWMHRDisable(SOC_EHRPWM_1_REGS);) v5 \, h+ _: r0 I
( S9 }) h& ^& y; ]; h8 Q) k1 t: D! F UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
! ~( e6 E, j' x2 r6 e}
) l$ j+ I" T) O& \/ Y$ a( k. C3 A: F0 R/ A! A; X2 l9 D
void ChopperWaveform(void). C4 \. l6 L1 h) K
{
" C( `6 e4 N6 P5 `- q# w // 50% 占空比* O2 G& t J' r& f
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);8 l6 G# z; ]" p' D; }/ u
// 4 分频. {- _. A# d3 ]5 k" P
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);+ e9 B' o; C# x! f0 O7 N2 t1 c& u2 U
// 单个脉冲宽度: \ h1 V- S. K3 R8 P; u: E4 W. |
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);' k! O; Z5 M% `4 J! J
// 使能斩波子模块4 p4 R+ g$ U6 d. s5 x o u4 L
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);) O& C2 \9 {& M
}+ u* a: r8 g0 F8 ^* O5 K
% { x6 v6 ^3 j }7 k/****************************************************************************/& W9 I' ~6 h$ L# e( F! H
/* */7 w, F, i& X8 [: l6 t
/* PWM 中断初始化 */
$ W8 x" o" ^3 f" T, a! o/* */) `6 f- B% b7 f; ~9 u
/****************************************************************************/
, L! @$ E. C {; e6 ?void PWMInterruptInit(void)
7 G8 Y1 T/ [: ^{% {6 P, X0 T8 I* I% s( u! I
// 注册中断服务函数' N- B, ?; E; G _
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
1 Z2 N. C, X' z( f IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);% N% C$ D3 Y7 f, s2 S& Y) y' R3 c; y
) l$ _7 M4 a, l7 Y' S: Y // 映射中断8 t5 Q; d. l2 X; x( R' m, }* T
IntChannelSet(SYS_INT_EHRPWM1, 2);
5 A2 I+ [9 O, u9 b3 ^7 }' K IntChannelSet(SYS_INT_EHRPWM1TZ, 3);- H6 a' D; a. X# B$ |
# {7 X3 l6 @- A; A" \
// 使能中断
+ @; h$ O( w" ? q# H4 @ IntSystemEnable(SYS_INT_EHRPWM1);
5 ~1 L6 L0 b) S8 V7 ^5 T IntSystemEnable(SYS_INT_EHRPWM1TZ);% ?: W4 O, o" d
}( | C' a6 p2 ?! M2 U5 c) T
0 v! v% r& U: f" T) u/****************************************************************************/
% l/ E) Z+ H6 o- J& F& D. S) d! q9 E/* */
' | z' s) N2 R5 I# m! V2 j% z/* ARM 中断初始化 */+ }/ ^: L$ w& ^1 Z
/* */- W1 z( q4 ` [. f0 m6 T7 f6 p
/****************************************************************************/
j% k' p- Y' h. B' u5 Qvoid InterruptInit(void)& ]) E/ L# [3 D* O& h( p
{3 `$ h, j& b$ N, m' G
// 初始化 ARM 中断控制器( ~7 Q5 T* g, o% Q' y1 L
IntAINTCInit();- E4 `$ j! [0 D4 c1 m; W4 A. b' f
% e6 W E7 F2 I$ i* z
// 使能 IRQ(CPSR)
9 `3 g0 s' p2 F2 Z! K IntMasterIRQEnable();6 i( A0 Z8 B1 h* b, O
6 ?) R V( ~+ B, |+ O1 \
// 使能中断(AINTC GER)
% z2 ?! H7 d2 i8 Z3 { IntGlobalEnable();
$ L+ v# ]& y& x$ O/ Y) a) W7 N! O: |' A; e/ Z7 b( J7 d
// 使能中断(AINTC HIER)
% j# D( E" p8 k* X2 c3 W1 r8 j IntIRQEnable();
1 [/ a% g2 @# J+ F# J}' H- B/ J0 r7 c& q, d- V
6 J3 u8 ?6 {$ ]* |" C |
|