今天我用stm32的定时器3做定时,我将中断函数的函数名写错了,这样当定时到来时,CPU会怎么执行呢?(正常情况下,CPU会去执行中断子函数,可是我现在中断函数名写错了,相当于没有中断服务函数)
我经调试发现,要是没有中断服务程序的话,那么在主函数执行的过程中,当执行到定时器初始化的函数时就会停下来,不执行下面的程序。不知道我的这个验证是否正确。要是正确的话,那么执行到定时器初始化以后CPU干嘛了呢?
定时器初始化程序如下:
#include "stm32f10x.h"
#include "tim.h"
void TIM3_Init(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1; //72Mhz/7200=10khz
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period=5000-1; //5000*(1/10000)=0.5s
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
中断服务子函数为:
void TIM3_IRQnHandler(void) //正确的写法是TIM3_IRQHandler ,没有n
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{
LED1_CROSS;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
主函数如下:
int main(void)
{
LED_Init(); //这个初始化后LED应该都是亮着的
TIM3_Init(); //这个初始化后,每隔0.5S中断一次。
LED_ALL_OFF; //如果执行到这句话那么LED等应该都灭了,可是实测LED等都是亮着的。说明程序并没有执行到这一句。
}
|