TIM_OCMode | 函数库描述 | 解释 |
TIM_OCMode_Timing | TIM输出比较时间模式 | 冻结,输出比较不起作用 |
TIM_OOCMode_Active | TIM输出比较主动模式 | 当比较发生时,强制输出高电平 |
TIM_OCMode_Inactiive | TIM输出比较非主动模式 | 当比较发生时,强制输出低电平 |
TIM_OCMode_Toggle | TIM输出比较触发模式 | 当比较发生时,输出翻转 |
TIM_OCMode_PWM1 | TIM脉冲宽度调制模式1 | PWM1 |
TIM_OCMode_PWM2 | TIM脉冲宽度调制模式2 | PWM2 |
/*************************************************************
Function : OC_GPIO_Init
Description: 定时器输出比较的引脚初始化
Input : none
return : none
*************************************************************/
static void OCTiming_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //打开GPIOA的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/*************************************************************
Function : OC_TIM2_Init
Description: 设置定时器2的4路输出比较
Input : none
return : none
*************************************************************/
static void OCTiming_TIM2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 65535;//定时周期值
TIM_TimeBaseStructure.TIM_Prescaler = 0;//不预分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//增计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器
/* -------------------------------------------------------
定时器配置陈输出比较时间模式:
定时器的时钟频率为72M
PC6输出的频率为72M/CCR1_Val/2=732Hz,占空比为50%的PWM波
PC7输出的频率为72M/CCR2_Val/2=1099Hz,占空比为50%的PWM波
PC8输出的频率为72M/CCR3_Val/2=2197Hz,占空比为50%的PWM波
PC9输出的频率为72M/CCR4_Val/2=4395Hz,占空比为50%的PWM波
---------------------------------------------------------*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;//输出比较时间模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//设置比较值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//当定时器计数值小于CCR1_Val时为高电平
TIM_OC1Init(TIM2, &TIM_OCInitStructure);//初始化TIM2的输出比较通道11
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);//不自动重转计数值
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;//设置比较值
TIM_OC2Init(TIM2, &TIM_OCInitStructure);//初始化TIM2的输出比较通道2
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);//不自动重转计数值
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;//设置比较值
TIM_OC3Init(TIM2, &TIM_OCInitStructure);//初始化TIM2的输出比较通道3
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);//不自动重转计数值
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;//设置比较值
TIM_OC4Init(TIM2, &TIM_OCInitStructure);//初始化TIM2的输出比较通道3
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);//不自动重转计数值
TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);//清除中断标志为
TIM_Cmd(TIM2, ENABLE);//打开定时器
}
/*************************************************************
Function : OC_Int_Config
Description: 定时器输出比较中断配置
Input : none
return : none
*************************************************************/
static void OCTiming_Int_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//TIM2中断
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*************************************************************
Function : OC_Init
Description: 定时器输出比较初始化
Input : none
return : none
*************************************************************/
void OCTiming_Init(void)
{
OCTiming_GPIO_Init(); //输出比较引脚配置
OCTiming_TIM2_Init(); //定时器2的输出比较初始化
OCTiming_Int_Config(); //输出比较中断配置
}
#ifndef __TIMEBASE_H__
#define __TIMEBASE_H__
#include "stm32f10x.h"
#define CCR1_Val 49152
#define CCR2_Val 32768
#define CCR3_Val 16384
#define CCR4_Val 8192
void OCTiming_Init(void);
#endif
/*************************************************************
Function : TIM2_IRQHandler
Description: 定时器2中断服务程序
Input : none
return : none
*************************************************************/
void TIM2_IRQHandler(void)
{
static u16 capture = 0;
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//输出比较通道1
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));//翻转电平值,生成频率为72M/CCR1_Val/2,占空比为50%的PWM波
capture = TIM_GetCapture1(TIM2);//获取比较值
TIM_SetCompare1(TIM2, capture + CCR1_Val);//重新设置比较值
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)//输出比较通道1
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));//翻转电平值,生成频率为72M/CCR2_Val/2,占空比为50%的PWM波
capture = TIM_GetCapture2(TIM2);//获取比较值
TIM_SetCompare2(TIM2, capture + CCR2_Val);//重新设置比较值
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)//输出比较通道1
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
GPIO_WriteBit(GPIOC, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8)));//翻转电平值,生成频率为72M/CCR3_Val/2,占空比为50%的PWM波
capture = TIM_GetCapture3(TIM2);//获取比较值
TIM_SetCompare3(TIM2, capture + CCR3_Val);//重新设置比较值
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)//输出比较通道1
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
GPIO_WriteBit(GPIOC, GPIO_Pin_9, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9)));//翻转电平值,生成频率为72M/CCR4_Val/2,占空比为50%的PWM波
capture = TIM_GetCapture4(TIM2);//获取比较值
TIM_SetCompare4(TIM2, capture + CCR4_Val);//重新设置比较值
}
}
/*************************************************************
Function : main
Description: main入口
Input : none
return : none
*************************************************************/
int main(void)
{
BSP_Init();
OCTiming_Init(); //输出比较初始化
PRINTF("\nmain() is running!\r\n");
while(1)
{
LED1_Toggle();
Delay_ms(1000);
}
}
上一篇:STM32 定时器输出比较主动模式
下一篇:STM32 生成7路PWM波
推荐阅读最新更新时间:2024-03-16 15:14