您的位置:首页 > 其它

stm32的启动文件--startup_stm32f10x_hd.s

2016-12-12 11:32 351 查看
在学习stm32 定时器中断时,发现我写的程序进入不了中断服务程序,而且我也没找到定时器服务程序的注册入口,上网查了一下,大家都使用的都是下面这个函数:void TIM3_IRQHandler(void),那为什么其他人的中断程序可以执行,而我的却执行不了呢。

经过请教得知,我的工程中没有包含该一个叫做startup_stm32f10x_hd.s的文件,而我所谓的中断服务程序的注册入口就是包含在这里。startup_stm32f10x_hd.s是用汇编语言编写的STM32处理器的初始化程序,它规定了系统的堆栈大小等系统信息,也包含了一个向量表,这个向量表中对所有的中断入口函数都进行了分配,如TIM3的中断入口是:

…………………………………………
DCD     TIM3_IRQHandler           ; TIM3
DCD     TIM4_IRQHandler           ; TIM4
DCD     I2C1_EV_IRQHandler        ; I2C1 Event
DCD     I2C1_ER_IRQHandler        ; I2C1 Error
……………………………………………
TIM2_IRQHandler
B TIM2_IRQHandler

PUBWEAK TIM3_IRQHandler
SECTION .text:CODE:REORDER(1)
TIM3_IRQHandler
B TIM3_IRQHandler

PUBWEAK TIM4_IRQHandler
SECTION .text:CODE:REORDER(1)
TIM4_IRQHandler
B TIM4_IRQHandler

只有包含了startup_stm32f10x_hd.s文件,系统才可以知道我们所需要的中断处理函数是哪一个,进而可以进行调用。

如果你想使用其他的函数名作为中断处理函数,需要在以上几处同时改变函数名才可以,当然为了改函数名而改函数名是没有必要的。

由于我之前搭建工程的时候不认真缺了这个文件,导致中断调不通,走了弯路。

我的TIM3中断的相关代码如下:

void Do_Timer_Init()
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

TIM_DeInit(TIM3);
TIM_Cmd(TIM3, DISABLE);
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;		   		//选择中断线0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  	//抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		   	//响应优先级为 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 		 	//中断使能
NVIC_Init(&NVIC_InitStructure);

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); //将结构体赋初值

TIM_TimeBaseStructure.TIM_Period = 2000*5 - 1;   //计数为9999 时产生中断
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_Prescaler = 36000-1;  //分配为36000 则时钟变为72MHz / 36000 = 2KHz 结合前面的10000次产生中断得到 5s产生一次中断
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //该元素表示多少次溢出后会产生一次中断,这个中断与每次溢出的中断不冲突

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //中断使能

TIM_Cmd(TIM3,ENABLE); // 计数器使能

}

extern int Timer_flag;
void TIM3_IRQHandler()
{

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//检查是不是TIM3中断
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update  ); //清除TIM3中断待处理位
if(Timer_flag != 1)
{
Timer_flag = 1;
}
}
}










                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STM32 中断