IAR的stm32f10x_vector.c文件的定義
- /******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
- * File Name : stm32f10x_vector.c
- * Author : MCD Application Team
- * Version : V2.0.3
- * Date : 09/22/2008
- * Description : STM32F10x vector table for EWARM5.x toolchain.
- * This module performs:
- * - Set the initial SP
- * - Set the initial PC == __iar_program_start,
- * - Set the vector table entries with the exceptions ISR address,
- * - Configure external SRAM mounted on STM3210E-EVAL board
- * to be used as data memory (optional, to be enabled by user)
- * After Reset the Cortex-M3 processor is in Thread mode,
- * priority is Privileged, and the Stack is set to Main.
- ********************************************************************************
- * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
- * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
- * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
- * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
- * CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
- * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
- *******************************************************************************/
- /* Includes ------------------------------------------------------------------*/
- #include "stm32f10x_lib.h"
- #include "stm32f10x_it.h"
- /* Private typedef -----------------------------------------------------------*/
- typedef void( *intfunc )( void );
- typedef union { intfunc __fun; void * __ptr; } intvec_elem;
- /* Private define ------------------------------------------------------------*/
- /* Uncomment the following line if you need to use external SRAM mounted on
- STM3210E-EVAL board as data memory */
- /* #define DATA_IN_ExtSRAM */
- /* Private macro -------------------------------------------------------------*/
- /* Private variables ---------------------------------------------------------*/
- /* Private function prototypes -----------------------------------------------*/
- /* Private functions ---------------------------------------------------------*/
- #pragma language=extended
- #pragma segment="CSTACK"
- void __iar_program_start( void );
- #pragma location = ".intvec"
- /* STM32F10x Vector Table entries */
- const intvec_elem __vector_table[] =
- {
- { .__ptr = __sfe( "CSTACK" ) },
- __iar_program_start,
- NMIException,
- HardFaultException,
- MemManageException,
- BusFaultException,
- UsageFaultException,
- 0, 0, 0, 0, /* Reserved */
- SVCHandler,
- DebugMonitor,
- 0, /* Reserved */
- PendSVC,
- SysTickHandler,
- 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_CAN_TX_IRQHandler,
- USB_LP_CAN_RX0_IRQHandler,
- CAN_RX1_IRQHandler,
- CAN_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,
- };
- #ifdef DATA_IN_ExtSRAM
- #pragma language=extended
- __interwork int __low_level_init(void);
- #pragma location="ICODE"
- __interwork int __low_level_init(void)
- {
- /* FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is
- required, then adjust the Register Addresses*/
- /* Enable FSMC clock */
- *(vu32 *)0x40021014 = 0x00000114;
- /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */
- *(vu32 *)0x40021018 = 0x000001E0;
- /* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/
- /*---------------- SRAM Address lines configuration -------------------------*/
- /*---------------- NOE and NWE configuration --------------------------------*/
- /*---------------- NE3 configuration ----------------------------------------*/
- /*---------------- NBL0, NBL1 configuration ---------------------------------*/
- *(vu32 *)0x40011400 = 0x44BB44BB;
- *(vu32 *)0x40011404 = 0xBBBBBBBB;
- *(vu32 *)0x40011800 = 0xB44444BB;
- *(vu32 *)0x40011804 = 0xBBBBBBBB;
- *(vu32 *)0x40011C00 = 0x44BBBBBB;
- *(vu32 *)0x40011C04 = 0xBBBB4444;
- *(vu32 *)0x40012000 = 0x44BBBBBB;
- *(vu32 *)0x40012004 = 0x44444B44;
- /*---------------- FSMC Configuration ---------------------------------------*/
- /*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/
- *(vu32 *)0xA0000010 = 0x00001011;
- *(vu32 *)0xA0000014 = 0x00000200;
- return (1);
- }
- #endif /*DATA_IN_ExtSRAM*/
- /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
typedef void( *intfunc )( void );
定義一個(gè)新類(lèi)型,這個(gè)類(lèi)型是一個(gè)函數(shù)指針,指針指向的函數(shù)類(lèi)型是void (void)型,
符合標(biāo)準(zhǔn)C
typedef union { intfunc __fun; void * __ptr; } intvec_elem;
定義一個(gè)新類(lèi)型,這個(gè)類(lèi)型是一個(gè)聯(lián)合體,聯(lián)合體有兩個(gè)元素,一個(gè)元素類(lèi)型是intfunc,一個(gè)元素類(lèi)型是void *
符合標(biāo)準(zhǔn)C
#pragma language=extended
#pragma segment="CSTACK"
void __iar_program_start( void );
申明外部函數(shù),extern可以用,也可以不用
符合標(biāo)準(zhǔn)C
#pragma location = ".intvec" // 下面的變量存放在段 .intvec
//IAR擴(kuò)展
/* STM32F10x Vector Table entries */
const intvec_elem __vector_table[] =
{
{ .__ptr = __sfe( "CSTACK" ) },
// { .__ptr = 常量 },
// 數(shù)組元素是聯(lián)合體,聯(lián)合體有兩個(gè)元素,對(duì)聯(lián)合體元素__ptr賦初值
//符合標(biāo)準(zhǔn)C
//__sfe( "CSTACK" ) 是段CSTACK的尾地址,更準(zhǔn)確是段CSTACK下一個(gè)段的首地址(記憶中應(yīng)該是這樣)。
//IAR擴(kuò)展
__iar_program_start,
//數(shù)組元素是聯(lián)合體,聯(lián)合體有兩個(gè)元素,對(duì)聯(lián)合體第一個(gè)元素__fun賦初值
//完整的寫(xiě)法是 { .__fun= __iar_program_start },
//這里簡(jiǎn)寫(xiě)成__iar_program_start,是否符合標(biāo)準(zhǔn)C,有待考證
.....
}
}
補(bǔ)充:
對(duì)聯(lián)合體第一個(gè)元素賦初值,可以簡(jiǎn)寫(xiě)。
{ .__fun= __iar_program_start },
//__fun是聯(lián)合體第一個(gè)元素,可直接簡(jiǎn)寫(xiě)成__iar_program_start.
//符合標(biāo)準(zhǔn)C
__sfe是IAR的“段操作符”segment operator。表示取某個(gè)段的后一個(gè)字節(jié)的地址。
比如"CSTACK"定義為0x20001000~0x20001fff。那__sfe( "CSTACK" ) 就得到0x20002000這個(gè)值,剛好用來(lái)初始化msp堆棧指針。
注意使用segment operator前,需要先定義段名如下:
#pragma segment="CSTACK"
評(píng)論