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

查看: 8317|回复: 5

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

[复制链接]

1

主题

7

回帖

0

蝴蝶豆

新手上路

最后登录
2018-8-25
发表于 2010-2-23 18:08:37 | 显示全部楼层 |阅读模式
       关于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);
        这里又不好理解了,我的理解是:其实这些声明是可要可不要的,这里加上这些声明是不是一方面是为了保持库代码的一致性,另一方面也是一种习惯写法,不知我的理解是否正确?请高手指正,最好能详细地说明一下库代码中这部分的结构和编译过程,谢谢!
       
回复

使用道具 举报

1

主题

7

回帖

0

蝴蝶豆

新手上路

最后登录
2018-8-25
 楼主| 发表于 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 */
 
回复 支持 反对

使用道具 举报

0

主题

5

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2010-6-1 08:31:12 | 显示全部楼层

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

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

使用道具 举报

1

主题

39

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2010-6-1 09:03:00 | 显示全部楼层

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

回楼主:这是Cortex-M3的结构决定的;Cortex-M3要求中断向量表中必须是每个中断程序的入口地址。
回复 支持 反对

使用道具 举报

1

主题

7

回帖

0

蝴蝶豆

新手上路

最后登录
2018-8-25
 楼主| 发表于 2010-9-7 21:11:18 | 显示全部楼层

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

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

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2012-2-18 17:31:38 | 显示全部楼层

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

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

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版