• PWM


    #include "sys.h"
    #include "beep.h"
    
    //tim5 定时器  
    
    /*
    tim4 定时器 定时10分钟 控制LED1
    */
    
    void my_tim5_init()
    {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
        NVIC_InitTypeDef  NVIC_InitStruct;
        //1.打开时钟
        RCC_APB1Peri phClockCmd(RCC_APB1Periph_TIM5, ENABLE);
        
        //2.TIM_TimeBaseInit
        // 配置定时器
    /*
        void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
        TIM_TypeDef  控制器基地址 TIM1~14 
        
        TIM_TimeBaseInitTypeDef
        uint16_t TIM_Prescaler;  分频系数
        功能:用于分频
        范围:数字
        寄存器:PSC
        
        
        uint16_t TIM_CounterMode; 计数模式
        范围:TIM_CounterMode_Up TIM_CounterMode_Down
        寄存器:CR1  4 5 6 三位
        
        uint32_t TIM_Period;   自动重载寄存器
        范围:
        寄存器:ARR  
        
        uint16_t TIM_ClockDivision;
        
        uint8_t TIM_RepetitionCounter;
        
        2s  42MHz *2 = 84MHz
        */
        TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
        //16位 防止溢出
        TIM_TimeBaseStruct.TIM_Period = 20000 -1; 
        TIM_TimeBaseStruct.TIM_Prescaler= 8400-1;
        TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStruct);
        
      //打开中断
    /*
    void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)
    
    TIM_IT  中断的标志
    TIM_IT_Update  更新中断
    
    NewState   状态
    ENABLE  DISABLE 
    */
        TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
        
        NVIC_InitStruct.NVIC_IRQChannel = TIM5_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x2;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x2;
        NVIC_Init(&NVIC_InitStruct);
    
    }
    
    
    extern u32 jfees;
    //2S 一次 如何产生10分钟的定时
    void TIM5_IRQHandler(void)
    {
        if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) {
        //    BEEP = !BEEP;
            jfees++;
            
            
            TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
        }
    }
    
    
    //占空比:一个时钟周期高电平所占的比例
    //PWM  外设 需要一个特定的波形
    //外设需要不同的电压来控制
    //BEEP  PF8 通过production_data.pdf     TIM13_CH1
    //PF8 可以 TIM13 的第一个通道
    
    //tim13  控制器
    void timer13_init()
    {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
        GPIO_InitTypeDef GPIO_InitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruct;
        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13, ENABLE);
        
        //PF8 配置成复用模式
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_Init(GPIOF, &GPIO_InitStruct);
    
        //把PF8 复用为TIM13功能,就可以把PF8作为 TIM13的一个通道
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13 );
    
        TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
        //16位 防止 溢出
        TIM_TimeBaseStruct.TIM_Period = 300 -1; 
        TIM_TimeBaseStruct.TIM_Prescaler= 84-1;
        TIM_TimeBaseInit(TIM13, &TIM_TimeBaseStruct);
        
        //PWM的配置
        //CCMR1  OC1M  4~6
        //111 PWM2     CNT > CCR1  输出有效电平
        //110 PWM1     CNT < CCR1  输出有效电平
        
        //CCER 1位 配置有效电平
    /*
    void TIM_OCnInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    使用不同的通道需要调用不同的函数
    通道1   TIM_OC1Init
    
     uint16_t TIM_OCMode; 
     功能:配置PWM的模式
     范围:TIM_OCMode_PWM1  TIM_OCMode_PWM2
     
     uint16_t TIM_OutputState;
     功能:PWM通道使能 开关
     范围:TIM_OutputState_Disable TIM_OutputState_Enable
     寄存器:CCER 0位
     
     uint16_t TIM_OCPolarity;
     功能:有效电平
     范围:TIM_OCPolarity_High TIM_OCPolarity_Low
     寄存器:CCER 1位
     
    */
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OC1Init(TIM13, &TIM_OCInitStruct);
        
    /*
    void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
    x 1~4
    只有调用该函数 那么才能修改CCR1的值
    
    
    void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
    */
        TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable);
        TIM_ARRPreloadConfig(TIM13, ENABLE);
        
        TIM_Cmd(TIM13, ENABLE);
    }
    
    
    
    //tim14  控制器
    void timer14_init()
    {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
        GPIO_InitTypeDef GPIO_InitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruct;
        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
        
        //PF9 配置成复用模式
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
        
        GPIO_Init(GPIOF, &GPIO_InitStruct);
    
        //把PF9 复用为TIM14功能,就可以把PF9 作为TIM14的一个通道
        GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14 );
    
        TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
        //16位 防止 溢出
        TIM_TimeBaseStruct.TIM_Period = 300 -1; 
        TIM_TimeBaseStruct.TIM_Prescaler= 84-1;
        TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStruct);
        
        //PWM的配置
        //CCMR1  OC1M  4~6
        //111 PWM2     CNT > CCR1  输出有效电平
        //110 PWM1     CNT < CCR1  输出有效电平
        
        //CCER 1位  有效电平
    /*
    void TIM_OCnInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    使用不同的通道需要调用不同的函数
    通道1   TIM_OC1Init
    
     uint16_t TIM_OCMode; 
     功能:配置 PWM的模式
     范围TIM_OCMode_PWM1  TIM_OCMode_PWM2
     
     uint16_t TIM_OutputState;
     功能:PWM通道使能 开关
     范围:TIM_OutputState_Disable TIM_OutputState_Enable
     寄存器:CCER 0位
     
     uint16_t TIM_OCPolarity;
     功能:有效电平
     范围:TIM_OCPolarity_High TIM_OCPolarity_Low
     寄存器:CCER 1位
     
    */
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OC1Init(TIM14, &TIM_OCInitStruct);
        
    /*
    void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
    x 1~4
    只有调用该函数 那么才能修改CCR1的值
    
    
    void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
    */
        TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
        TIM_ARRPreloadConfig(TIM14, ENABLE);
        
        TIM_Cmd(TIM14, ENABLE);
    }
        while(1)
        {
    
    //        if(jfees >=  time + 5)
    //        {
    //            BEEP = !BEEP;
    //            time = jfees;
    //        }
            if(dir==0) val++;
            else if(dir==1) val--;
            
            if(val==300) dir=1;
            else if(val==0)dir=0;
            
            //TIM_SetComparen
            //设置 CCR1 比较寄存器的值
            TIM_SetCompare1(TIM14, val);
            
            delay_ms(10);
        }
  • 相关阅读:
    git rm与git rm --cached
    成小胖学习ActiveMQ·基础篇
    Nginx负载均衡的详细配置及使用案例详解.
    win10安装git fatal: open /dev/null or dup failed: No such file or directory错误解决方法
    linux系统下安装两个或多个tomcat
    linux环境下安装nginx步骤
    JDK里常见容器总结
    深入理解HashMap
    如何再一台电脑上配置多个tomcat同时运行
    洛谷P1530 分数化小数 Fractions to Decimals
  • 原文地址:https://www.cnblogs.com/baoshulin/p/6219209.html
Copyright © 2020-2023  润新知