📄 tim.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 + -