⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tim.c

📁 str71x计数器实用库(根据需要已修改)。各功能分类列出
💻 C
字号:
/****************************************Copyright (c)**************************************************                              
**                               Henan Star Hi-Tech CO.,LTD                                      
**                                  All rights reserved.
**
**----------------------------------------File Info-----------------------------------------------------
** 文件名称:
** 工程项目:
** 说    明:STR71x外围TIM库函数
** 
** 作    者:              日    期:
** 建立版本:             
**
**----------------------------------------modification--------------------------------------------------
** 作    者:
** 日    期:
** 版    本:            标    记:
** 说    明:
**
********************************************************************************************************/

#include "tim.h"

/*****************************************************************************************
** 函数名称:void TIM_TimerModeConfig(TIM_TypeDef *tim, u32 ms)
** 函数功能:设置TIM为定时器方式。根据PWM方式,当CNTR==OCBR时CNTR将复位到0xfffc来定时。
** 说    明:定时器工作在PWM方式,但是不产生PWM输出
** 入口参数:tim--TIM通道           ms--定时时间(<650ms)
** 返 回 值:
** 编    写:        日    期:      版 本 号:
** 修改历史:
******************************************************************************************/
void TIM_TimerModeConfig(TIM_TypeDef *tim, u32 ms)
{
    /*          PWM                     */
    tim->CR1 = (1<<4);                          //PWM模式,OCMPA引脚不输出电平
#if PCLK2 < 25500000
    /*          OCBIE     PDIV          */
    tim->CR2 = ((1<<11) | (PCLK2/100000-1));    //允许OCBIE中断、将PCLK2分频为100000Hz
    tim->OCBR = ((100000/1000)*ms-5);
#else
    tim->CR2 = ((1<<11) | (250-1));             //PCLK2进行250分频
    tim->OCBR = (((PCLK2/250)/1000)*ms-5);
#endif
    tim->OCAR = 0xfffb;                         //将设置OCBR<OCAR<0xfffc,以不产生PWM
    tim->CNTR = 0xfffc;                         //复位计数器值为0xfffc
    tim->SR = 0;
}

/*****************************************************************************************
** 函数名称:void TIM_CounterModeConfig(TIM_TypeDef *tim, u32 divp)
** 函数功能:外部脉冲累计脉冲计数。
** 说    明:利用PWM模式的自动重装功能,进行不断循环累计计数
** 入口参数:tim--TIM通道(TIM1或TIM3)       divp--tim累计过divp个脉冲后产生中断(0<divp<=0xffff)
** 返 回 值:void
** 编    写:        日    期:      版 本 号:
** 修改历史:
******************************************************************************************/
void TIM_CounterModeConfig(TIM_TypeDef *tim, u32 divp)
{
    /*          PWM    EXEDG  ECKEN     */
    tim->CR1 = ((1<<4)|(1<<1)|(1));     //PWM模式,上升沿计数,外部脉冲计数
    tim->CR2 = (1<<11);                 //CNTR==OCBR时中断,不对EXCLK分频
    tim->OCBR = divp-5;
    tim->OCAR = 0xfffb;                 //设置OCAR<OCAR<0xfffc,以不产生中断
    tim->CNTR = 0xfffc;                 //复位CNTR
    tim->SR = 0;
} 

/*****************************************************************************************
** 函数名称:void TIM_PWMOModeConfig(TIM_TypeDef *tim, u32 fullp, u32 highp)
** 函数功能:设置TIM为PWM工作方式。脉冲从OCMPA管脚输出
** 入口参数:tim--TIM通道       fullp--PWM周期(us, <=0xffff)    highp--高电平时间(us, <fullp)
** 返 回 值:void
** 编    写:        日    期:      版 本 号:
** 修改历史:
******************************************************************************************/
void TIM_PWMOModeConfig(TIM_TypeDef *tim, u32 fullus, u32 highus)
{
    /*          HOLVLB  OLVLA  OCAE   PWM   */
    tim->CR1 = ((1<<9)|(0<<8)|(1<<6)|(1<<4));
    tim->CR2 = PCLK2/1000000;           //分频PCLK2为1MHz
    tim->OCBR = (fullus-5);
    if (highus >= fullus)                 //OCAR==OCBR时,将产生方波信号。
    {
        highus = fullus-1;
    }
    tim->OCAR = (highus-5);
    tim->CNTR = 0xfffc;                 //复位计数器值为0xfffc
    tim->SR = 0;
}

/*****************************************************************************************
** 函数名称:void TIM_PWMOSetHighCircle(TIM_TypeDef *tim, u32 highp)
** 函数功能:调节PWM模式下的高电平周期
** 入口参数:tim--TIM(PWM)通道          highp--高电平时间(us)
** 返 回 值:
** 编    写:        日    期:      版 本 号:
** 修改历史:
******************************************************************************************/
void TIM_PWMOSetHighCircle(TIM_TypeDef *tim, u32 highus)
{
    if (highus >= tim->OCBR+5)                 //OCAR==OCBR时,将产生方波信号。
    {
        highus = tim->OCBR+4;
    }
    tim->OCAR = highus-5;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -