STM32中断入口地址与中断服务函数的关系
扫描二维码
随时随地手机看文章
在stm32单片机的编程时,中断函数的名称都是“xxx_Handler()”格式。这是固定的格式吗?编译的时候是怎么知道这是一个中断函数?哪里有注明?
我们知道,每个中断都是有入口地址的。程序在执行过程中遇到中断的时候,会先判断这个中断的类型,根据类型再到中断向量表中查找,找到之后,根据表中指明的地址,程序就跳到该地址开始执行代码。
ST提供的旧版本固件库(V3.0.0及以前),有提供一个stm32f10x_it.c文件,打开之后会发现里面放的都是些空函数,但是名字都是“xxx_Handler()”格式,需要使用某个中断的时候,在代码中使能该中断,并到这个文件中将中断服务函数添加上,就OK了。但是较新版本的库里没有了这个文件,用户要使用中断服务函数的时候,得自己在文件中声明然后实现它,并且函数名还是得用那种格式。
为什么呢?
因为这些名字就是一个个的中断函数入口地址。在哪里定义了这些名字呢?答案是:启动代码中。
打开启动代码文件,能看到以下信息:
可以看到,定义了一个个名称,这些名称就是中断函数入口的地址,用这些名称来代替具体的地址值,有两个好处:一是编程时简化了,二是由于不同芯片的入口初始地址可能不同,用名字代替,可移植性较强。
所以要使用中断的话,中断函数就要用上面说的那种格式。当然你觉得不爽的话,可以到启动代码里把这些名字给改了J