#include "stm32f10x.h"
u16 capture=0;
u16 CCR1_Val=1000;//CH1要产生5000HZ频率的方波,则CCR1_Val=72M/(5000*2)=7200,0.1s
u16 CCR2_Val=100;//CH2要产生10Khz频率的方波,则CCR1_Val=72M/(10000*2)=3600,1s
u16 CCR3_Val=2;
u16 CCR4_Val=1;
/*TIM2 CLOCK ENABLE*/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/*Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置NVIC中断分组1:1位抢占优先级,1位响应优先级
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM2_Configuration(void)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_TimeBaseStructure.TIM_Period=10000;//计满值
TIM_TimeBaseStructure.TIM_Prescaler=7200-1;//预分频,此值加1为分频的出除数,0.0001s
//TIM_TimeBaseStructure.TIM_Prescaler=0;//不分频
TIM_TimeBaseStructure.TIM_ClockDivision=0x0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
// TIM_CCxCmd(TIM2,TIM_Channel_1,)
// TIM_CCxCmd(TIM2,TIM_Channel_1, TIM_CCx);
TIM_CCxCmd(TIM2, TIM_Channel_1, TIM_CCx_Enable);
TIM_CCxCmd(TIM2, TIM_Channel_2, TIM_CCx_Enable);
TIM_CCxCmd(TIM2, TIM_Channel_3, TIM_CCx_Enable);
TIM_CCxCmd(TIM2, TIM_Channel_4, TIM_CCx_Enable);
/*比较通道1*/
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Timing;//
TIM_OCInitStructure.TIM_Pulse=CCR1_Val;//设置了待装入捕获比较寄存器的脉冲zhi
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//极性为正
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC1Init(TIM2,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Disable);//禁止重装载
/*比较通道2*/
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Timing;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//极性为正
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=CCR2_Val;
TIM_OC2Init(TIM2,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Disable);
/*比较通道3*/
TIM_OCInitStructure.TIM_Pulse=CCR3_Val;
// TIM_ICInitStructure.TIM_Channel=TIM_Channel_3;
TIM_OC3Init(TIM2,&TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Disable);
/*比较通道4*/
TIM_OCInitStructure.TIM_Pulse=CCR4_Val;
// TIM_ICInitStructure.TIM_Channel=TIM_Channel_4;
TIM_OC4Init(TIM2,&TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Disable);
/*使能预装载*/
TIM_ARRPreloadConfig(TIM2,ENABLE);
/*预先清除所有中断位*/
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4|TIM_IT_Update);
/*4个中断和溢出都配置中断*/
TIM_ITConfig(TIM2,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4|TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2,ENABLE);
}
void TIM2_IRQHandler(void)
{
/*TIM2_CH1*/
if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);
/*PC.1引脚的翻转频率为 Hz*/
GPIO_WriteBit(GPIOB,GPIO_Pin_1,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_1)));
capture=TIM_GetCapture1(TIM2);
TIM_SetCompare1(TIM2,capture+CCR1_Val);
//GPIO_ResetBits(GPIOC,GPIO_Pin_All);
}
/*TIM2_CH2*/
if(TIM_GetITStatus(TIM2,TIM_IT_CC2)!=RESET)
{
GPIO_WriteBit(GPIOB,GPIO_Pin_2,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_2)));
TIM_ClearITPendingBit(TIM2,TIM_IT_CC2);
capture=TIM_GetCapture2(TIM2);
TIM_SetCompare2(TIM2,capture+CCR2_Val);
//GPIO_SetBits(GPIOC,GPIO_Pin_All);
}
}
// void TIM2_IRQHandler(void)
// {
// u8 ReadValue;
// //检测是否发生溢出更新事件
// if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
// {
// //清除TIM2的中断待处理位
// TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);//将PB.5管脚输出数值写入ReadValue
// ReadValue=GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5);
// if(ReadValue==0)
// {
// GPIO_SetBits(GPIOB,GPIO_Pin_5);
// }else
//
// GPIO_ResetBits(GPIOB,GPIO_Pin_5);
// }
// }
|