复用功能 | 没有重映射 | 部分重映射 | 完全重映射 | TIM3_CH1 | PA6 | PB4 | PC6 | CH2 | PA7 | PB5 | PC7 | CH3 | PB0 | PB0 | PC8 | CH4 | PB1 | PB1 | PC9 |
- /**重映射 tim3 使得PC7 PC8输出Pwm波
: T5 V/ h* d2 Y) A4 \, n - ****************************************************************************** N) a8 ]6 w$ d; o e) T( Y
- * @file Project/Template/main.c
* o1 D, D+ l2 E1 r3 D4 o - * @author MCD Application Team
z5 U; o6 a' D# P0 h - * @version V3.0.0
D' A# `- ~0 N, p. p7 z8 a' B - * @date 04/06/2009
5 @, ?& u0 \" H+ ?- \* J - * @brief Main program body
" [% j: r8 |% `% I. U - ******************************************************************************3 {: c, k& F% C# P0 f+ d. p* J( ~
- * @copy
% R: z. Z% m! O4 t! { - *5 {9 b/ r7 i: Q+ ^* r
- * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS) x' T4 h" x9 \. I
- * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE! z& e$ d7 d1 z( G0 t
- * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
0 H. ^5 l- j9 ^5 f4 D ]' X2 r1 }! D - * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
; C f9 f7 |6 n9 S- m( A y - * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE1 R6 T$ Q' p" W. L* e- a1 p: q
- * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
" J0 _9 Z: E! R/ C. A4 V2 D - *
! S8 N2 u7 l. |' n - * <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>
1 C" u& Z7 Z, B1 k( C( o. }* [! j - */
. E2 f5 v( i- ]# C$ o y0 W - /* Includes ------------------------------------------------------------------*/
0 k# V! @1 _# J9 b6 c - #include "stm32f10x.h"
+ U6 k8 p4 c8 c - #include "stm32f10x_tim.h"
$ z1 N; [1 o" W5 j7 C! e* l( V- M - #include "misc.h"% Z* U. q3 z# s, o% H
- void GPIO_AFIODeInit(void);//这个函数不能落下,否则不能成功) g/ E* R- E! A$ C, l% c
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//配置PWM需要使用的结构体声名( z$ K& X+ c5 z7 G
- TIM_OCInitTypeDef TIM_OCInitStructure;$ i! n' F! @' C. c8 A. m
- u16 CCR3_Val =250;. ^9 ` Z" h, Z- d# T7 {
- u16 CCR4_Val =250;
1 b( r. ]( a0 L, { - . W2 w4 u- B5 i& Q+ S1 f, q
- void GPIO_Config(void);, M7 M+ \: A: j4 E! o
- void Timer_Config(void);6 w+ m$ Q% ~+ p* m6 ?
- /**
2 X+ u3 U% l5 q1 r5 D( @ - * @brief Delay program.
! R1 b) H5 E4 j8 U - * @param None! k W+ _2 t# ^) d# N
- * @retval : None
$ f5 k6 ]- R& c% p' t: O - */2 E0 n* v, D% z3 v+ n
- void Delay (u32 nCount)
8 G3 }7 y+ C) ~1 s; g7 k - {% o7 l9 u0 J, Q& ^1 A$ @
- for(; nCount != 0; nCount--);
. d+ P) ]4 H* e0 L - }
5 P$ ^) K1 E2 d3 s& \ - /**; I9 W2 ~8 P; b
- * @brief Main program.
" x% J/ Z- w! N W( p( B5 p - * @param None( D) u& V N! K( G
- * @retval : None
( r3 G6 K3 B2 R: s - */5 t/ \9 X( D0 d: w' \7 |& m
- int main(void)
( {8 g- }6 F) T0 j1 \: H' O - {
2 A) w% c1 l9 F. a3 \5 l9 H5 O [ - /* Setup STM32 system (clock, PLL and Flash configuration) */+ R- a, }) }/ s* H' l" W, T
- SystemInit();: x/ Z, m! Z2 m( M* S
- GPIO_Config();% n0 u1 o1 O; s: k7 B- M# ~
- Timer_Config();
& U5 R3 Z& Z) u; J! q" z' Q8 } - /* Infinite loop */9 X( u- p; d8 u
- while (1) {% S v* n4 I0 h' b6 r% p6 S0 g
- }
* M4 j, }3 ~5 ~6 K - }
, w/ y' z A7 ~' _) [/ q - /**
; y: ~( f) z0 m' m - * @brief GPIO_Config program.
4 I4 u' A6 ]& ?+ d - * @param None# x0 c- T {, R9 A1 g C
- * @retval : None, a- G" }0 B8 N2 L8 p( @0 l
- */7 A: w) [! K* B# b( ^' u) A/ Q U
- void GPIO_Config(void)# e! b# S5 T. N4 h$ l1 [4 u# H' N
- {
. x- C, G/ T6 X - GPIO_InitTypeDef GPIO_InitStructure;
( F0 i- z& I+ O: ?7 t4 z7 y -
4 i8 b! r3 ]5 _( [ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
" i2 O" i; s! W4 A' | - ; m$ f0 T/ p0 {7 S9 {2 N
- GPIO_AFIODeInit(); //刚开始没有这个语句,所以一直没有重映射成功2 J) k# ^/ t3 R! Y& M% Q' x/ d$ s
- GPIO_PinRemapConfig(GPIO_FullRemap_TIM3 , ENABLE); //这个就是重映射功能函数
" ]0 B! ?1 F( e& U/ T; u - /*GPIOA Configuration: TIM3 channel 3 and 4 as alternate function push-pull */$ D; h5 N+ [) O* l1 h* I- n
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;* r1 G( E q7 j7 @$ q5 f* |) e! [* k
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //这里也要注意) G' c3 s& @( r3 Q9 r
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
: d1 d" x% {) U - GPIO_Init(GPIOB, &GPIO_InitStructure); //这四句是为了校验究竟PB0,PB1是否还有PWM输出
" }# {+ ^4 `% `! Y8 F7 N: J; U" F5 J - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;9 s6 _) L) @+ W( v6 c
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
/ d) ^% q( Y3 e7 L3 X s0 ^ - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 7 C9 U0 E) r, |
- GPIO_Init(GPIOC, &GPIO_InitStructure);; g7 u7 m4 k& ]+ x
- 7 @4 M+ l1 h1 j1 |9 l; V7 `
-
) H0 T9 b5 R" W8 C7 h2 E ^ - }5 d0 g% L9 r& F( D
- void Timer_Config(void)2 |0 L U) {- \7 ^. q. T. F
- {
: g0 n% x* y2 W* D) C* z - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);; i; I Y$ e( H1 o; g$ t
- ( \* P* o. z. H- _! l' v/ E
- TIM_DeInit(TIM3);, h( ^! ^0 b2 V; A* X/ H
- TIM_TimeBaseStructure.TIM_Period = 999; //在下一个更新事件装入活动的自动重装载寄存器周期的值
' d9 e9 I @8 e( y, t; _ - TIM_TimeBaseStructure.TIM_Prescaler = 0; // 设置了用来作为 TIMx 时钟频率除数的预分频值
b% g. G. |+ t* B - TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; " r9 u$ u* u+ u1 g- S
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/ r2 z# ^7 W0 Q1 Y% J/ R J - /* PWM1 Mode configuration: Channel3 */( B% `: u3 _4 a0 A' v3 g" @
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //TIM_OCMode( c' t1 [' _* T* x
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
2 e' ?- R7 f8 t6 X - TIM_OCInitStructure.TIM_Pulse = CCR3_Val; //设置了待装入捕获比较寄存器的值0 Q$ b! T/ x1 U/ T* {
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM_OCPolarity :TIM 输出比较极性高
8 b3 A' M( Q* w( g9 n& j - TIM_OC3Init(TIM3, &TIM_OCInitStructure);
2 }- q& J% V) ]1 V5 ~+ R - TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能或者失能 TIM3 在 CCR3 上的预装载寄存器0 V( T9 {0 G; W9 _( A
- /* PWM1 Mode configuration: Channel4 */& l) {1 z9 K3 C& i4 D+ S
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ) B. H% Y2 Q$ T$ l# I+ T- ~4 z d, s
- TIM_OCInitStructure.TIM_Pulse = CCR4_Val;7 t9 H+ O. F( S, r" @" @
- TIM_OC4Init(TIM3, &TIM_OCInitStructure);
8 y% h# _. ~$ \2 Q, O ` - TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);2 r1 g# ^' }1 f/ z3 u
- /* TIM3 enable counter */* a$ N" r: }1 c& b' a( ~6 m
- TIM_Cmd(TIM3, ENABLE); //开启时钟,别落下
+ G# a6 U' f7 r5 k) m" I - }9 j. K4 J! |$ m/ d! `0 o' b
- /**9 a- j6 E! ?, d8 Y7 ]
- * @brief EXTI_Config Program.
2 b2 t7 l$ z; P2 F4 U% @ - * @param None2 y' u* h/ F/ d' m$ ^, O1 e& V
- * @retval : None
; ^, g6 r8 c+ x! ^' Q - */0 L* K. D) }/ c S7 X- K5 C
-
2 _5 X9 h+ A8 D' W - /**) M2 p9 h; K* r
- * @brief Configures the nested vectored interrupt controller.
. y9 n& X0 {- o4 H7 x9 d - * @param None: G4 r' j8 E( T" K/ ?( e9 c2 m/ i% Y
- * @retval : None
$ s* z# H+ c8 ? - */
v9 D4 }& Y& p - 9 u# ~8 K2 {9 ^ b* {
- #ifdef USE_FULL_ASSERT% f! t. F" M5 c1 Z
- /**
$ U$ B3 q$ E0 U2 ~6 M- O/ l: H - * @brief Reports the name of the source file and the source line number
' L! e2 a; ?( B - * where the assert_param error has occurred.# N9 h# a: K' ^: t
- * @param file: pointer to the source file name8 O7 i3 C$ k+ x% }/ [% U& T7 f
- * @param line: assert_param error line source number
$ A! S: o9 I' X6 @; Z* Z* _ - * @retval : None
7 k2 P' g0 F$ w) Q9 I - */7 v5 d0 M; V* G8 _! n
- void assert_failed(uint8_t* file, uint32_t line)4 O& O' C. ?. Y6 M# L
- {
2 f. Z, w* R6 L0 ]# {2 C - /* User can add his own implementation to report the file name and line number," C0 d3 U" t, H9 D+ V8 v1 l4 R
- ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- F: ~5 F, M% h( d2 C y - /* Infinite loop */, n- T0 `/ N( B. g: z. M9 _7 s
- while (1)
3 G: ?6 _ t, R6 W0 O - {
8 d8 G* J5 G. j# c1 i7 }, o - }
! P+ f! ^8 j0 g7 n& K0 R) C - }; i/ d8 M, A0 ^" ~% v* d
- #endif
; c8 U/ R- e2 j% c: v( ] - /**: _, f3 y- r% @
- * @}
W1 E# i2 p5 x. y - */
/ ?# e# H& ]9 X/ G9 ]6 r7 S -
' Q$ l7 H7 q9 x( |- Y! ^ - /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
复制代码 . S* f! ? x: e' E) C; p
|