论坛元老
 
- 积分
- 3772
- 金钱
- 3772
- 注册时间
- 2015-4-26
- 在线时间
- 765 小时
|
2金钱
用上ucos后,发现systick被占用了,所以写了这个基于TIM3采用时钟摘取法做的延时函数,用示波器测的时候发现每十几个准确的延时之间必然夹杂一个非常不准确的波形,不知道为什么。话不多说一些,上函数。
[mw_shl_code=applescript,true]#include "tim3delay.h"
vu8 overfull = 0;//溢出标志
void tim3delay_init(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_ClocksTypeDef rccclk;
u8 i;
u8 psc;//预分频系数
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_GetClocksFreq(&rccclk);
if(rccclk.HCLK_Frequency == rccclk.PCLK1_Frequency)
i = 1;
else i = 2;
psc = (u8)(rccclk.PCLK1_Frequency / 1000000) * i - 1;//此预分频下频率为1MHz
TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseInitStructure.TIM_Period = 0xffff;
TIM_BaseInitStructure.TIM_Prescaler = psc;
TIM_TimeBaseInit(TIM3,&TIM_BaseInitStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3,ENABLE);
}
void delay_us(u16 xus)
{
u16 thecount;
u32 nextcount;
u8 overnum = 0;//当前超长延时下需要定时器溢出的次数
thecount = TIM_GetCounter(TIM3);
nextcount = (u32)thecount + (u32)xus;
if(nextcount <= 65535)
while(TIM3->CNT < nextcount);
else
{
do{
nextcount -= 65535;
overnum++;
}while(nextcount > 65535);
overfull = 0;
while((TIM3->CNT < nextcount) || (overnum > overfull));
}
}
void delay_ms(u16 xms)//最大取值65
{
delay_us(xms * 1000);
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
overfull++;
}
}[/mw_shl_code]
|
|