新手上路
- 积分
- 49
- 金钱
- 49
- 注册时间
- 2013-7-4
- 在线时间
- 3 小时
|
大家好,我是刚用STM32不久的,现在研究定时器做延时的问题。我发现STM32定时器是不是有问题啊,我按照正常配置的,先配置TIM5为每10us进一次中断,然后计算N个10us,就通过计算一个数值的减,来判断进入了多少次中断,也就知道经过了多少个10us,然后计算MS时,就调用10us的延时,就调用计算N个10us的函数,跑100次就好了。但是,这个程序有问题,不知道是不是我设置的有问题:
//设置TIM5
void DelayTIM5_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_ClocksTypeDef RCC_ClocksStatus;
uint16_t PrescalerValue = 0;
PrescalerValue=(RCC_ClocksStatus.PCLK1_Frequency*2)/1000000-1; //Prescal to 1MHz
/* TIM5 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
/* Enable the TIM5 gloabal Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// TIM5 clock enable [TIM3定时器允许]
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
// TIM5 configuration
TIM_TimeBaseStructure.TIM_Period = 9; //ARR的值
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;//59
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
// Clear TIM5 update pending flag[清除TIM5溢出中断标志]
TIM_ClearFlag(TIM5, TIM_FLAG_Update);
//ARR预装载缓冲器
TIM_ARRPreloadConfig(TIM5, ENABLE);
// Enable TIM5 Update interrupt [TIM5溢出中断允许]
TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);
// TIM5 enable counter [TIM5计数]
TIM_Cmd(TIM5,DISABLE);
}
//开启定时器,关闭定时器设置:
void starTimer(void)
{
TIM_ClearFlag(TIM5, TIM_FLAG_Update);
TIM_SetCounter(TIM5, 0);
TIM_Cmd(TIM5,ENABLE);
}
void stopTimer(void)
{
TIM_Cmd(TIM5,DISABLE);
TIM_ClearFlag(TIM5, TIM_FLAG_Update);
TIM_SetCounter(TIM5, 0);
}
//DELAY 10us函数
void delay10Us(unsigned int n_10us)
{
// int i;
// for(i=0;i<500;i++);
starTimer();
gTimerCount = n_10us;
gTimerOutFlag = 0;
while(!gTimerOutFlag);
stopTimer();
}
//DELAY 1ms函数
void delay1Ms(unsigned int n_1ms)
{
starTimer();
while(n_1ms != 0)
{
gTimerCount = 100;
gTimerOutFlag = 0;
while(!gTimerOutFlag);
n_1ms --;
}
stopTimer();
}
//计算用的变量的定义:
volatile unsigned short gTimerCount = 0;
unsigned char gTimerOutFlag = 0;
//中断函数:
void TIM5_IRQHandler(void)
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
{
TIM_ClearITPendingBit(TIM5,TIM_FLAG_Update);
gTimerCount--;
if (gTimerCount)
{
return;
}
else
{
gTimerOutFlag=1;
}
}
}
现在情况是,10us计算,基本上没有太大问题,可以正常工作,计算ms上,数值小一点,也是没问题的,但是当我写上500 ms时,立刻就不行了,但是神奇的是,下面的其他程序,我如果改动了一些,他竟然有时候又能正常工作了,但是下面程序跟定时器无关啊,而且有时候又跑进了HardFault_Handler。坑爹啊,这样怎么弄啊,STM32定时器咋这么复杂啊 |
|