/*************************************************************
Function : OCToggle_GPIO_Init
Description: 输出比较翻转模式下定时器对应通道引脚初始化
Input : none
return : none
*************************************************************/
static void OCToggle_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//定时器各通道引脚配置成复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*************************************************************
Function : OCToggle_TIM2_Init
Description: 输出比较翻转模式定时器2初始化
Input : none
return : none
*************************************************************/
static void OCToggle_TIM2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//初始化TIM2时钟
/* -------------------------------------------------------
TIM_OCMode_Toggle模式计数值等于比较值翻转电平
在PA0引脚输出频率为72M/CCR1_Val/2=732Hz,占空比为50%的PWM波
在PA1引脚输出频率为72M/CCR2_Val/2=1099Hz,占空比为50%的PWM波
在PA2引脚输出频率为72M/CCR3_Val/2=2197Hz,占空比为50%的PWM波
在PA3引脚输出频率为72M/CCR4_Val/2=4395Hz,占空比为50%的PWM波
---------------------------------------------------------*/
TIM_TimeBaseStructure.TIM_Period = 65535;//定时器计数周期
TIM_TimeBaseStructure.TIM_Prescaler = 1 - 1;//预分频
TIM_TimeBaseStructure.TIM_ClockDivision = 1 - 1;//时钟不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//增计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;//输出比较主动模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;//设置比较值(跳变值)
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高电平
TIM_OC1Init(TIM2, &TIM_OCInitStructure);//初始化输出比较寄存器
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);//关闭预转载
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;//设置比较值(跳变值)
TIM_OC2Init(TIM2, &TIM_OCInitStructure);//初始化输出比较寄存器
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;//设置比较值(跳变值)
TIM_OC3Init(TIM2, &TIM_OCInitStructure);//初始化输出比较寄存器
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;//设置比较值(跳变值)
TIM_OC4Init(TIM2, &TIM_OCInitStructure);//初始化输出比较寄存器
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);//打开定时器2
}
/*************************************************************
Function : OCToggle_Int_Init
Description: 输出比较翻转模式中断初始化
Input : none
return : none
*************************************************************/
static void OCToggle_Int_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//中断优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*************************************************************
Function : OCToggle_Init
Description: 输出比较翻转模式初始化
Input : none
return : none
*************************************************************/
void OCToggle_Init(void)
{
OCToggle_GPIO_Init();
OCToggle_TIM2_Init();
OCToggle_Int_Init();
}
#ifndef __OCTOGGLE_H__
#define __OCTOGGLE_H__
#include "stm32f10x.h"
#define CCR1_Val 49152
#define CCR2_Val 32768
#define CCR3_Val 16384
#define CCR4_Val 8192
void OCToggle_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);//清除标志位
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);//清除标志位
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);//清除标志位
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);//清除标志位
capture = TIM_GetCapture4(TIM2);
TIM_SetCompare4(TIM2, capture + CCR4_Val);//重新设置比较值
}
}
/*************************************************************
Function : main
Description: main入口
Input : none
return : none
*************************************************************/
int main(void)
{
BSP_Init();
OCToggle_Init();
PRINTF("\nmain() is running!\r\n");
while(1)
{
LED1_Toggle();
Delay_ms(1000);
}
}
上一篇:STM32 定时器单脉冲模式
下一篇:STM32 定时器输出比较非主动模式
推荐阅读最新更新时间:2024-03-16 15:14
设计资源 培训 开发板 精华推荐
- 了解 MPS 隔离解决方案,答题赢【华为蓝牙无线耳机、小米氮化镓充电器】!
- 借助 Microchip 生态系统中的 PIC® 和 AVR® 单片机开启嵌入式到云端之旅 系列在线研讨会
- 有奖直播|TI 新一代Sitara™ AM62处理器革新人机交互——产品介绍和相关资源
- 盛夏嗨学有礼——和dcexpert一起学ESP8266
- 有奖直播报名:赛灵思和安富利专注嵌入式视觉应用,助力人工智能和汽车辅助驾驶!
- 有奖直播:ST60 非接触式连接器及应用探索
- 是德感恩月:有奖征文免费送示波器啦!
- 新年祝福语 欢乐大竞猜
- Follow me第2期来袭,与得捷电子一起解锁开源硬件 Adafruit ESP32-S3 TFT Feather!