关于STM32固件库结构有点不是很清楚,请高人指点,谢谢! 文件“UM0427用户手册”中,第34页Figure 2. 固件函数库文件体系结构中,为什么需要“stm32f10x_it.h”头文件?其实在汇编启动代码中已经有了下面的说明(如下列表所示): ; Import exceptions handlers IMPORT NMIException IMPORT HardFaultException 。。。。。。 IMPORT USBWakeUp_IRQHandler “IMPORT”伪指令已经通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中,所以似乎stm32f10x_it.h不需要,只需stm32f10x_it.c文件就可以了,而加入“stm32f10x_it.h”文件,我的理解理解是: “第34页Figure 2. 固件函数库文件体系结构”中,程序的执行实际上是分成了二支,一支是正常的应用程序(不包括中断),另一支是中断。正常的应用程序执行流好理解,这个分支下去的库文件体系结构不多作解释,而中断则是比较特殊的一个程序执行流,一旦进入中断,在程序执行时有可能会再次调用其它库文件体(不包括stm32f10x_it.c),而一旦这样做,就得include“stm32f10x_lib.h”这个唯一的头文件,所以需要“stm32f10x_it.h”来include“stm32f10x_lib.h”文件,而“stm32f10x_it.h”文件中如下的函数的声明: void NMIException(void); void HardFaultException(void); void MemManageException(void); 。。。。。。 void RTCAlarm_IRQHandler(void); void USBWakeUp_IRQHandler(void); 这里又不好理解了,我的理解是:其实这些声明是可要可不要的,这里加上这些声明是不是一方面是为了保持库代码的一致性,另一方面也是一种习惯写法,不知我的理解是否正确?请高手指正,最好能详细地说明一下库代码中这部分的结构和编译过程,谢谢! |
以上是STM32F10xxx固件库V2.0.3,STM32固件库3.0中也有类似的问题!
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Channel1_IRQHandler [WEAK]
EXPORT DMA1_Channel2_IRQHandler [WEAK]
EXPORT DMA1_Channel3_IRQHandler [WEAK]
EXPORT DMA1_Channel4_IRQHandler [WEAK]
EXPORT DMA1_Channel5_IRQHandler [WEAK]
EXPORT DMA1_Channel6_IRQHandler [WEAK]
EXPORT DMA1_Channel7_IRQHandler [WEAK]
EXPORT ADC1_2_IRQHandler [WEAK]
EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK]
EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK]
EXPORT CAN1_RX1_IRQHandler [WEAK]
EXPORT CAN1_SCE_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_IRQHandler [WEAK]
EXPORT TIM1_UP_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTCAlarm_IRQHandler [WEAK]
EXPORT USBWakeUp_IRQHandler [WEAK]
EXPORT TIM8_BRK_IRQHandler [WEAK]
EXPORT TIM8_UP_IRQHandler [WEAK]
EXPORT TIM8_TRG_COM_IRQHandler [WEAK]
EXPORT TIM8_CC_IRQHandler [WEAK]
EXPORT ADC3_IRQHandler [WEAK]
EXPORT FSMC_IRQHandler [WEAK]
EXPORT SDIO_IRQHandler [WEAK]
EXPORT TIM5_IRQHandler [WEAK]
EXPORT SPI3_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT UART5_IRQHandler [WEAK]
EXPORT TIM6_IRQHandler [WEAK]
EXPORT TIM7_IRQHandler [WEAK]
EXPORT DMA2_Channel1_IRQHandler [WEAK]
EXPORT DMA2_Channel2_IRQHandler [WEAK]
EXPORT DMA2_Channel3_IRQHandler [WEAK]
EXPORT DMA2_Channel4_5_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_2_IRQHandler
USB_HP_CAN1_TX_IRQHandler
USB_LP_CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler
TIM8_BRK_IRQHandler
TIM8_UP_IRQHandler
TIM8_TRG_COM_IRQHandler
TIM8_CC_IRQHandler
ADC3_IRQHandler
FSMC_IRQHandler
SDIO_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_IRQHandler
TIM7_IRQHandler
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_5_IRQHandler
B .
ENDP
问一下:上面启动代码红色部分为什么利用“PROC、ENDP”这一对伪指令把所有除异常外的STM32 IRQ服务程序分为一个过程,然后放入各个中断函数(实际上是一个个地址),最后是一个循环?能否帮解释一下?谢谢!
另外,在3.0的库中,依然在stm32f10x_it.h头文件中保留了Cortex-M3的异常处理函数的声明(见下面的代码所示),从这一点来说和2.0的库是类似的,为什么头文件中需要这部分声明?不知这是否与汇编程序调用C程序的机制有关?对库代码中这部分结构确实不是很清楚,还是请高手指点一下,谢谢!
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F10x_IT_H
#define __STM32F10x_IT_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
#endif /* __STM32F10x_IT_H */
回复:[请教]STM32固件库结构有点不是很清楚
RE:[请教]STM32固件库结构有点不是很清楚
回复:[请教]STM32固件库结构有点不是很清楚
这里stm32f10x_vector.s是整个库的起点,复位后会调用Reset_Handler,然后进入__main(),最后进入main(),main()中包含stm32f10x_lib.h,对外设进行处理,这就是正常的程序流!而包含stm32f10x_it.h文件 应该是为了处理中断嵌套。
固件函数库文件体系结构中,程序的执行实际上是分成了二支,一支是正常的应用程序(不包括中断),另一支是中断。正常的应用程序执行流好理解,这个分支下去的库文件体系结构不多作解释,而中断则是比较特殊的一个程序执行流,一旦进入中断,在程序执行时有可能会再次调用其它库文件体(不包括stm32f10x_it.c),或者再次发生中断(即中断嵌套)。这就是这样安排库代码结构的原因吧?
回复:[请教]STM32固件库结构有点不是很清楚