按照你这种应用,属于定时器的基础应用,虽然定时周期是微秒级别,但是你的精确度只要10us就够了,定时器完全可以实现。我先给你贴一个我的代码:void TIM2_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定义一个TIM_InitTypeDef类型的结构体
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能TIM2时钟
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清中断标志,以备下次中断到来使用
TIM_TimeBaseStructure.TIM_Period =335;
TIM_TimeBaseStructure.TIM_Prescaler =7;
TIM_TimeBaseStructure.TIM_ClockDivision =0; //TIM_CKD_DIV1
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化定时器
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能溢出中断
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2,ENABLE);//初始化定时器关闭
}
我的主频为了能适配出0.2us精度的定时,设为40M,TIM_Prescaler 设置为7,其实是8分频,也就是0.2us。然后TIM_Period 等于335,也就是计数336次,0.2*336=67.2us。
示波器测量的时间也是67.2us。为了向你展示时间进行中需要执行指令,我在定时器中断中添加了串口发送,可以看到在定时周期内执行力串口发送指令。但是定时依旧准确。
那么回到你的问题,你可以定时100us。你的主频是85M。那么你的预分频值TIM_Prescaler设为850-1,即为10us,TIM_Period 设为10-1,那么你的定时器中断则为100ms执行一次。你在中断中设置一个数,每次进中断都+1.当这个数等于52说明到达5.2ms,你就执行相关程序,当这个数到达109,再执行下一个。
|