主函数:
u16 time;
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
TIM_Configuration();
time=0;
while(1)
{
}
}
#include "time.h"
/*=============================================================================================
时钟设置:72M
使能TIM3和GPIOA
==============================================================================================*/
void RCC_Configuration()
{
SystemInit();//系统时钟设置位72MHz
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOA,GPIOB
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3
}
/*=============================================================================================
GPIO端口设置:
PORTA.7端口设置为复用推挽输出
==============================================================================================*/
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure; //定义一个结构体
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7; //设定管脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //50MHz翻转速度
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //设置模式,复用推挽输出,这个很重要
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化这些设置
}
/*=============================================================================================
NVIC设置:
中断优先级为最高
定时器3
==============================================================================================*/
void NVIC_Configuration()
{
NVIC_InitTypeDef NVIC_InitStructure; //定义结构体
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //采用分组2方式
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //0抢断优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //0从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能该通道
NVIC_Init(&NVIC_InitStructure); //初始化设置
}
/*=============================================================================================
TIM模块设置
==============================================================================================*/
void TIM_Configuration()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //定义两个结构体,一个基本机构,一个比较输出结构
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseStructure.TIM_Period=0xffff; //必须是0xffff
TIM_TimeBaseStructure.TIM_Prescaler=72-1; //时钟为72/72=1MHz
TIM_TimeBaseStructure.TIM_ClockDivision=0; //0个采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //初始化设置
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //管脚输出模式:翻转模式
TIM_OCInitStructure.TIM_Pulse=2000; //翻转周期2000个脉冲
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //使能这个通道
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //输出为正逻辑
TIM_OC2Init(TIM3,&TIM_OCInitStructure); //写入配置
//TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能预装载寄存器
//TIM_ARRPreloadConfig(TIM3,ENABLE);
TIM_ClearFlag(TIM3, TIM_FLAG_Update); //清除中断
//TIM_PrescalerConfig(TIM3, 0xEA5F, TIM_PSCReloadMode_Immediate); //设置预分频数
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //TIM中断源设置,开启相应通道的捕获比较中断
TIM_Cmd(TIM3,ENABLE); //开启TIM3
TIM_CtrlPWMOutputs(TIM3,ENABLE); //通道输出使能
}
在这里要注意的是,你要看到你使能的中断源是什么,因为这个倒最后你要查询的东西!
void TIM3_IRQHandler(void)
{
// if(TIM_GetITStatus(TIM3, TIM_IT_CC2)==SET)//这个的中断源是TIM_IT_CC2这个通道
// {
// time++;
// TIM_ClearITPendingBit(TIM3, TIM_IT_CC2 );
// capture = TIM_GetCapture2(TIM3);
// TIM_SetCompare2(TIM3, capture + 2000);
// //这里解释下:
// //将TIM1_CCR1的值增加2000,使得下一个TIM事件也需要2000个脉冲,
// //另一种方式是清零脉冲计数器
// //TIM_SetCounter(TIM2,0x0000);
// }
time++;
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) //这个的中断源是TIM_IT_Update
{
capture++;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
//GPIO_WriteBit(GPIOA,GPIO_Pin_9,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_9)));
}
}