|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
这是main.c 主程序4 H/ A$ q& @8 R! k* A2 d4 X5 o) x4 l H
. Z M7 ]& ?5 E3 m; \* I, p {: U. R. A- n9 I* M1 s8 o6 G. C, J: _, G' R: \
//这是STM32F103ZE的一个模板: ?) S* {, j( y* K* Y6 ]7 \
//在PA8 PB13 产生一个互补的PWM波,频率为10KHz,占空比为1/5) Q* ^" f9 _5 I1 A
1 Z' z( U% K0 J2 d: f( F+ T#include "stm32f10x.h"1 X- Z4 }1 j" h" l. y9 k. M& H+ V, G# y1 c' Y. ]
BitAction bbt=0; //定义一个位变量 bbt,并清0& M* j! y& c/ {0 X
u16 i;
+ [( Z, T, W0 p9 }# B: Qint main(void). r6 h5 v# F& F4 G; U, |
{" B5 @& U4 [7 n$ K7 n; x: N6 z: k8 O( {9 O2 t7 l
u16 InitValue,Pre_Divide,ZKB;" }$ h" M x3 d; c+ F, a* s# y% Q% W: g
SystemInit(); //系统时钟初始化,调用该函数后,系统时钟为72M,函数原形在system_stm32f10x.c中
$ d& a. D8 F- v R5 bGPIO_init();. |+ F, A: j" ]- ?6 L4 y+ ?3 }
: o8 Z5 c6 o) j! m" V0 b" V: m* A//****TIM1_PWM波1通道设置****************************************************************; X& g& ]0 M. S0 j5 A) b( l( @
$ ?/ u: ?% J( R: ] S7 dInitValue=7200; //初值1000' B9 m7 c5 U! ~; \
k& N0 t8 b. k4 XPre_Divide=1; //预分频1' l. s5 r7 _/ r% _( O2 Z8 b+ u1 V( F5 B
ZKB=1200; //占空比
" }7 w+ X& h% v: S5 iTIM1_PWM_1_init(InitValue,Pre_Divide,ZKB);( V. j7 m+ B* F
9 [- s* k6 B9 I& ^" R% G& s; n) ? j; F: L1 E d( M" e; U. h! R/ {" F$ y, N# r6 x7 l
//TIM1->CCR1=2400; //修改占空比$ {' @* N$ H8 N2 @# N* ]+ w- }* L. T9 s; G' a& s
//**************************************************************************************% `, j% {: _8 g2 I/ H7 D- w }( K* ]2 T# Y5 q4 `# c7 K: w
. e* l: K/ U& A% ]0 F: K. i' E1 |% M" V
while(1)
) W0 b: x( H" u2 D8 E1 R{3 D: f& [( v. V. d5 `9 o q. @
//. y; u7 ^7 ~; M& X. F# `, X% F+ [
3 q& [ e1 [- C" T$ q+ H}8 X: P4 F$ d, z) H; `8 [- C) s/ \, _9 J* p
; j- F$ c. F8 w* M}5 p r, X( O# }4 J, M
4 v* o1 J; c9 N
/ g9 E3 D. f. S1 b4 F, [
& v% I5 m6 i# x这是sysinit.c 系统程序- G2 `# O2 X9 }( [' o0 S6 c
! k5 }3 o# U0 h0 t( S- w; y
! O Z6 V7 S, y: u& Y2 m! ?8 G3 C! ^5 J4 p- m
7 r) V- R4 ~; m$ X+ ]
2 ]7 k& h4 ~7 q) `* ^#include "stm32f10x.h"% C. n' U# K& x- x6 x2 f
3 F+ Z+ G0 q) \6 L E6 q- Y4 G# _& W$ N3 S8 z( R1 t. T1 m7 `
void GPIO_init()4 X3 J* t/ t. \# B
{
$ C* @( }, t, R% zGPIO_InitTypeDef GPIO_InitStructure; //声明端口结构,需要放在前面0 W% e8 b j) \9 b2 D
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE); ; N5 E5 j) S" P3 [5 j% h4 v O
//开启相应端口时钟
0 Z' J, c" k3 p$ P# lRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);" n6 _" N- l) E/ \* k$ [) m/ ?' S8 x% ^& S0 V- d8 |- D5 }& i
//***************端口A8,A9,A10是TIM1_PWM波的输出端***************************$ U& Q6 H: _, N4 m9 v: V' s4 O% Y1 c; |3 W& L1 \ f+ A! z% h% d
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10; 4 Q9 Y, E& K. `8 }1 _1 c' E
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PWM波设为复用推挽输出% ~% j* y; ?$ T8 u9 w7 r4 F2 Q) h% ^( P, b3 B
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //端口频率可设为2,10,50% R8 C& [, C% H8 a
( s9 w( F# q, |GPIO_Init(GPIOA, &GPIO_InitStructure); //启动A端口! k# Y1 m6 O( R8 r
//***************************************************************************! S! I! G s. J7 R
/ I- ?9 @" X* X; V: E0 I) ^8 j//**************端口B13,B14,B15是TIM1_PWM波的互补输出端**********************+ X/ H% p7 K+ D# a) x+ z) s" X g- g! v" `
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;- E& Q) s4 h+ G
- _2 x1 S7 Z: E i6 O" AGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //端口频率可设为2,10,50
3 ^3 W1 Z! N# X A4 t* aGPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //PWM波的复用推挽输出: g. C" u2 ] e/ B ~+ |( D; f! S" N6 [5 _6 z
GPIO_Init(GPIOB,&GPIO_InitStructure); //启动B端口# J9 x R/ R+ N/ d
//***************************************************************************
9 z( N. Z! w; L8 K3 E}7 L0 P* ^& q5 E/ {
2 e0 k/ Y8 t2 b//****TIM1_PWM波1通道初始化**********************************************************************1 \0 N5 h# c6 w8 R1 F
6 e+ Z. J' M' i) q; b- W* j# N lvoid TIM1_PWM_1_init(u16 InitValue, u16 Pre_Divide, u16 CCR1_Val): d0 e5 ^9 o! F1 i) |0 t, \
{9 ]. n& [7 t$ v) k0 h
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
6 P2 e# Z+ {4 Z/ M4 ~' e- I- eTIM_OCInitTypeDef TIM_OCInitStructure;
: }$ X4 j" ~9 I6 YTIM_BDTRInitTypeDef TIM_BDTRInitStructure;
7 q, i& c) F9 F4 o5 KRCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);* H; m& [2 c; v- b6 D' q5 U ?' O; J; Y
TIM_TimeBaseStructure.TIM_Period =InitValue;& X- a( r' x9 M Y+ r/ ^8 a6 f* p8 r3 l i g
TIM_TimeBaseStructure.TIM_Prescaler =Pre_Divide-1;/ L- j" u2 J3 b+ i: n6 B5 v$ P5 E8 S% Z% u6 Y# a$ c
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- v9 P$ s+ \. z' P$ x8 R8 G% _TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;6 `& U' D% i/ ^7 i, J9 U' ]$ S) ^
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;6 A) z0 R, |6 O: p
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);1 t1 H; B1 q- n# u. V+ |( e S1 \; B5 D! M1 j4 z# A7 m
TIM_ARRPreloadConfig(TIM1,ENABLE); //使能TIM1在ARR上的预装载寄存器# f# r/ X) {5 }4 D0 b
4 O# X7 E" r3 {9 X$ ^, \TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;// 选择定时器模式 TIM脉冲宽度调制模式1 r, E' k' H% h0 ~. _$ W9 ~; J
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //选择输出比较状态" P+ Q7 i3 s+ q. M( s9 x3 J& j3 |) ^ W* o. V- _ ^9 B
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //选择互补输出比较状态1 V) ^6 D7 L# X& R! e2 S& f" ?; q' Q7 O) y
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //选择输出极性4 `9 A% N) l6 o: j+ E( v1 \
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //选择互补输出极性
0 v" G3 w1 x$ O9 ]8 M# TTIM_OCInitStructure.TIM_Pulse = CCR1_Val; //设置待装入捕获比较寄存器的脉冲值
! b9 u! i/ j8 S4 M6 v/ x4 zTIM_OC1Init(TIM1, &TIM_OCInitStructure);//捕获比较匹配器结构1通道赋值+ {3 z) A1 x7 b; \
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM1在CCR1上的预装载寄存器% N$ g) p% x5 N' g2 ]# J6 U
//死区设置
# O1 B' ~6 S' P4 {" nTIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;//TIM1_OSSRState设置在运行模式下非工作状态选项
, q/ J4 V3 r7 r1 ^9 qTIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;//TIM1_OSSIState设置在空闲模式下非工作状态选项(使能TIM1 OSSI状态)& C+ Y8 z4 L* G( ?' Z$ A9 T D b
, M' V, J% H/ W+ W8 `& ?( p) J* YTIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; //TIM1_LOCKLevel设置了锁电平参数(不锁任何位)3 n! }! [3 J* l" ]' w7 L6 C9 ~
TIM_BDTRInitStructure.TIM_DeadTime = 0x90; //这里调整死区大小0-0xff,TIM1_DeadTIM1指定了输出打开和关闭状态之间的延时- Y2 ] N! S; i
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; //TIM1_Break使能或者失能TIM1刹车输入(失能TIM1刹车输入)# k1 t9 d9 [# r% a2 m- z* Z {$ w' x: k5 z5 K* K! J
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;//TIM1_BreakPolarity设置TIM1刹车输入管脚极性(TIM1刹车输入管脚极性高): ^1 T. m) z8 u$ j2 r3 h- S: V, g
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//TIM1_AutomaticOutput使能或者失能自动输出功能(自动输出功能使能)
& J* N! q. A1 t H" y9 cTIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);//(设置刹车特性,死区时间,锁电平,OSSI,OSSR状态和AOE(自动输出使能))
: u- E( f( K# I& X! KTIM_Cmd(TIM1, ENABLE); //使能或者失能指定的TIM1! w! m; V6 ^' A5 N: y4 @9 T' C# `, h# o$ w; M, e/ r: l, r! J3 J$ k& j
TIM_CtrlPWMOutputs(TIM1, ENABLE); //使能或者失能TIM1外设的主输出) j2 X7 U- d- B+ `$ e: Q
}
# D( W: Y0 G' ?! e1 m' A+ z l |
|