STM32通用定时器
PWM和输入捕获的初始化函数:
在我们使用STM32的时候,用标准库的开发方式总是很让人头疼。因为要写的结构体实在有些复杂,并且有些结构体成员每次使用都是赋同样的值。
因此呢,我就给PWM和输入捕获这两个STM32常用的功能写了几个使用比较简单的函数。
哈哈,其实都是最基本的C语言if判断,本人第一次写博客,并且也是个菜鸡,大佬就直接跳过吧,哈哈哈!
下面给出.h文件和.c文件:
GuiStar_TIM.h
#ifndef __GUISTAR_TIM_H__
#define __GUISTAR_TIM_H__
/**
****************************************************************************************
* @file GuiStar_TIM.h
* @author GuiStar-李什么恩
* @version V1.1.0
* @date 2022-9-12
* @brief 该文件含有配置通用定时器2,3,4的函数及其他的一些定时器常用函数的提示
****************************************************************************************
* @attention
* 首先说明:PSC和ARR要加一才对应分频系数和重装值,因此为了函数使用方便
* 在函数内部完成加一,给参数的时候只需要写加1之后的值即可!
*
* 公式1:定时器CNT计数频率公式:
* 计数频率=CK_PSC/(PSC+1)
* 参数解释:
* CK_PSC:定时器的输入时钟频率,内部时钟驱动定时器一般为72MHz
* PSC=分频系数-1
*
* 公式2:定时器更新频率公式
* 定时频率=CK_PSC/(PSC+1)/(ARR+1)
* 参数解释:
* CK_PSC:定时器的输入时钟频率,内部时钟一般为72MHz
* PSC=分频系数-1
* CNT:定时器计数器的值
* ARR:重装值-1,当CNT达到ARR之后,再自增1的话就会触发更新事件
*
*****************************************************************************************
* @OtherFunctions
* 获取定时器当前计数值:TIM_GetCounter(TIM_TypeDef* TIMx);
*
* 重新设置定时器计数值:void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);
*
* 设置比较输出值(PWM占空比)的四个函数如下:
* void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
* void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
* void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
* void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
* 实际应用的时候要注意:CCR/(ARR+1)才是占空比
*
* 获取输入捕获ICR寄存器的值:uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);
*
******************************************************************************************
*/
void GuiStar_TIM(TIM_TypeDef* TIMx, uint16_t TIM_PSC, uint16_t TIM_ARR, uint8_t TIM_ENABLE, uint8_t IR_State);
void GuiStar_PWM_Init(TIM_TypeDef* TIMx, uint8_t PWM_tongdao, uint16_t TIM_PSC, uint16_t TIM_ARR);
void GuiStar_IC_Init(TIM_TypeDef* TIMx);
#endif
/************************************************************************
溢出中断函数模板
*************************************************************************
void TIMx_IRQHandler(void)
{
if(TIM_GetITStatus(TIMx,TIM_IT_Update)==SET)//判断是否触发TIM2中断
{
此处写中断操作...
TIM_ClearITPendingBit(TIMx,TIM_IT_Update);
}
}
GuiStar_TIM.c
#include "stm32f10x.h" // Device header
void GuiStar_TIM2_Init(uint16_t TIM_PSC, uint16_t TIM_ARR, uint8_t TIM_ENABLE, uint8_t IR_State)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseInitTypeDef TIM_ICInitStruct;
TIM_ICInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//滤波采样频率的分频系数确定
TIM_ICInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置计数器计数模式为向上计数
TIM_ICInitStruct.TIM_Period = TIM_ARR-1;//设定ARR,范围0~65535
TIM_ICInitStruct.TIM_Prescaler = TIM_PSC-1;//设定PSC,范围0~65535
TIM_ICInitStruct.TIM_RepetitionCounter = 0;//重复计数器在高级定时器中才可以使用,所以这里直接给0
TIM_TimeBaseInit(TIM2,&TIM_ICInitStruct);//调用时基初始化函数
if(IR_State)
{
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//避免上电运行一段时间之后,按复位键立刻进入中断函数
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//将定时器2配置为更新中断(即溢出中断)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStruct);
}
if(TIM_ENABLE)
{
TIM_Cmd(TIM2,ENABLE);
}
}
void GuiStar_TIM3_Init(uint16_t TIM_PSC, uint16_t TIM_ARR, uint8_t TIM_ENABLE, uint8_t IR_State)
{
RCC_APB1PeriphClockCmd

博客介绍了为STM32的通用定时器2、3、4编写的一组简单初始化函数,用于PWM和输入捕获功能。函数通过基本的C语言条件判断实现,简化了标准库的复杂结构体配置。文中还提供了获取计数值、设置比较输出值等辅助函数,以及输入捕获的频率计算方法。
最低0.47元/天 解锁文章
2733

被折叠的 条评论
为什么被折叠?



