你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

[请教]STM32固件库结构有点不是很清楚

[复制链接]
surge_d 提问时间:2010-2-23 18:08 /
       关于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);
        这里又不好理解了,我的理解是:其实这些声明是可要可不要的,这里加上这些声明是不是一方面是为了保持库代码的一致性,另一方面也是一种习惯写法,不知我的理解是否正确?请高手指正,最好能详细地说明一下库代码中这部分的结构和编译过程,谢谢!
       
收藏 评论5 发布时间:2010-2-23 18:08

举报

5个回答
surge_d 回答时间:2010-2-24 18:41:27

以上是STM32F10xxx固件库V2.0.3,STM32固件库3.0中也有类似的问题!

启动代码部分,3.0的库与2.0的库相比有所变化——3.0的库中所用的启动代码利用“PROC、ENDP”这一对伪指令把所有STM32 IRQ服务程序分为一个过程,如下所示:
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 */
 
kf118 回答时间:2010-6-1 08:31:12

回复:[请教]STM32固件库结构有点不是很清楚

使用 那个宏 配合后面的[WAEK] 就是说明 如果此中断处理 在别的地方有同名的地方 就首先使用那个同名的    就不要使用这个了 这个是M3出来后ARM公司为了规范 联合开发了CMSIS的LIB 因此你选择了对应的M3芯片(M0 M4都一样) 那么就可以统一使用CMSIS的这部分
香水城 回答时间:2010-6-1 09:03:00

RE:[请教]STM32固件库结构有点不是很清楚

回楼主:这是Cortex-M3的结构决定的;Cortex-M3要求中断向量表中必须是每个中断程序的入口地址。
surge_d 回答时间:2010-9-7 21:11:18

回复:[请教]STM32固件库结构有点不是很清楚

 这个问题似乎突然明白了,现附上我的解释:
这里stm32f10x_vector.s是整个库的起点,复位后会调用Reset_Handler,然后进入__main(),最后进入main(),main()中包含stm32f10x_lib.h,对外设进行处理,这就是正常的程序流!而包含stm32f10x_it.h文件 应该是为了处理中断嵌套。
固件函数库文件体系结构中,程序的执行实际上是分成了二支,一支是正常的应用程序(不包括中断),另一支是中断。正常的应用程序执行流好理解,这个分支下去的库文件体系结构不多作解释,而中断则是比较特殊的一个程序执行流,一旦进入中断,在程序执行时有可能会再次调用其它库文件体(不包括stm32f10x_it.c),或者再次发生中断(即中断嵌套)。这就是这样安排库代码结构的原因吧? 
龙天-342726 回答时间:2012-2-18 17:31:38

回复:[请教]STM32固件库结构有点不是很清楚

可是我看到例程中的stm32f10x_it.c中有很多个函数,而且有些是有死循环的,从main函数转去执行中断服务程序后,怎么知道的执行的是哪一个?

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版