forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

周巍
2024-04-11 91ef77c00ed797b1048c5187f416e351e646a009
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
 
/******************************************************************************
 * Copyright (C) 2014-2015 HangZhou SiZhu Co.,LTD.
 *
 *-----------------------------------------------------------------------------
 * File:                 fm25v02.c
 * Description:        FRAM operation code
 * Author:              Lishoujian (867693272@qq.com)
 * Date:                Jan 8, 2015
 *****************************************************************************/
 
/* ----------------------- Platform includes --------------------------------*/
 
#include "PWM.h"
#include "sys.h"
 
 
 
 
 
/******************************************
 * func:    PWM1_out
 * desc:    set pwm1
 * input:   
 *   - period: period clk num
 *   - count : duty clk num (set duty cycle) 
 *   - div   : frequence division - 1
 * output:  eg: when period = 1000,count=500,div=71,cpu_freq = 72MHZ  then => period time = 1000us & duty = 50%
 * return:  none
 *****************************************/
void PWM1_out(uint16 period,uint16 div)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
 
    TIM_DeInit(TIM4);
    
    RCC_APB1PeriphClockCmd(    RCC_APB1Periph_TIM4 , ENABLE );      //TIM3£¬TIM4
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE); 
    GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);
    
    /* Time base configuration */         
    TIM_TimeBaseStructure.TIM_Period = period-1;                   //¼ÆÊýµ½B´Î£¬ÎªÒ»¸ö¶¨Ê±ÖÜÆÚ
    TIM_TimeBaseStructure.TIM_Prescaler = div-1;                     //ÉèÖÃÔ¤·ÖƵ
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;       //ÉèÖÃʱÖÓ·ÖÆµÏµÊý£º²»·ÖƵ
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //ÏòÉϼÆÊýģʽ
 
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
 
    /* PWM1 Mode configuration: Channel3 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;               //ÅäÖÃΪPWMģʽ1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    
    TIM_OCInitStructure.TIM_Pulse = period/2;            //ÉèÖÃÌø±äÖµ£¬µ±¼ÆÊýÆ÷¼ÆÊýµ½Õâ¸öֵʱ£¬µçƽ·¢ÉúÌø±ä
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;    //
 
    TIM_OC2Init(TIM4, &TIM_OCInitStructure);                       //ʹÄÜͨµÀ3
 
    TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);            //ʹÄÜͨµÀ3±È½Ï¼Ä´æÆ÷
 
    TIM_ARRPreloadConfig(TIM4, ENABLE);                                 // Ê¹ÄÜTIM8ÖØÔØ¼Ä´æÆ÷ARR
 
 
    TIM_Cmd(TIM4, ENABLE);                                       //ʹÄܶ¨Ê±Æ÷8
    
}
 
 
 
 
/******************************************
 * func:   µ¥Âö³åÐÎʽ TIM3 CH1
 * desc:    set pwm3
 * input:   
 *   - period: period
 *   - count : set duty cycle 
 *   - div   : frequence division
 * output:  none
 * return:  none
 *****************************************/
 /*12MµÄʱÖÓ*/
void pluse_init_out(uint8 pluse_enable, uint16 pluse_wide)
{
 
 
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
 
    TIM_DeInit(TIM3);
 
    RCC_APB1PeriphClockCmd(    RCC_APB1Periph_TIM3 , ENABLE );      //TIM3£¬TIM4
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE); 
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
 
    /* Time base configuration */         
    TIM_TimeBaseStructure.TIM_Period             = 1000;                   //¼ÆÊýµ½B´Î£¬ÎªÒ»¸ö¶¨Ê±ÖÜÆÚ
    TIM_TimeBaseStructure.TIM_Prescaler         = 3000;                     //ÉèÖÃÔ¤·ÖƵ
    TIM_TimeBaseStructure.TIM_ClockDivision     = TIM_CKD_DIV4 ;       //ÉèÖÃʱÖÓ·ÖÆµÏµÊý£º²»·ÖƵ
    TIM_TimeBaseStructure.TIM_CounterMode         = TIM_CounterMode_Up;  //ÏòÉϼÆÊýģʽ
 
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
 
    /* pluse Mode configuration: Channel3 */
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                   //ÅäÖÃΪPWMģʽ1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    
    TIM_OCInitStructure.TIM_Pulse = pluse_wide;                        //ÉèÖÃÌø±äÖµ£¬µ±¼ÆÊýÆ÷¼ÆÊýµ½Õâ¸öֵʱ£¬µçƽ·¢ÉúÌø±ä
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;        //
 
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);                       //ʹÄÜͨµÀ3
 
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);            //ʹÄÜͨµÀ3±È½Ï¼Ä´æÆ÷
 
    
    TIM_SelectOnePulseMode(TIM3, TIM_OPMode_Single);
 
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
 
    
    TIM_Cmd(TIM3, ENABLE);
 
}