微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > IAR的stm32f10x_vector.c文件的定义

IAR的stm32f10x_vector.c文件的定义

时间:11-10 来源:互联网 点击:

  1. annel2_IRQHandler,
  2. DMA2_Channel3_IRQHandler,
  3. DMA2_Channel4_5_IRQHandler,
  4. };
  5. #ifdef DATA_IN_ExtSRAM
  6. #pragma language=extended
  7. __interwork int __low_level_init(void);
  8. #pragma location="ICODE"
  9. __interwork int __low_level_init(void)
  10. {
  11. /* FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is
  12. required, then adjust the Register Addresses*/
  13. /* Enable FSMC clock */
  14. *(vu32 *)0x40021014 = 0x00000114;
  15. /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */
  16. *(vu32 *)0x40021018 = 0x000001E0;
  17. /* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/
  18. /*---------------- SRAM Address lines configuration -------------------------*/
  19. /*---------------- NOE and NWE configuration --------------------------------*/
  20. /*---------------- NE3 configuration ----------------------------------------*/
  21. /*---------------- NBL0, NBL1 configuration ---------------------------------*/
  22. *(vu32 *)0x40011400 = 0x44BB44BB;
  23. *(vu32 *)0x40011404 = 0xBBBBBBBB;
  24. *(vu32 *)0x40011800 = 0xB44444BB;
  25. *(vu32 *)0x40011804 = 0xBBBBBBBB;
  26. *(vu32 *)0x40011C00 = 0x44BBBBBB;
  27. *(vu32 *)0x40011C04 = 0xBBBB4444;
  28. *(vu32 *)0x40012000 = 0x44BBBBBB;
  29. *(vu32 *)0x40012004 = 0x44444B44;
  30. /*---------------- FSMC Configuration ---------------------------------------*/
  31. /*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/
  32. *(vu32 *)0xA0000010 = 0x00001011;
  33. *(vu32 *)0xA0000014 = 0x00000200;
  34. return (1);
  35. }
  36. #endif /*DATA_IN_ExtSRAM*/
  37. /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/

typedef void( *intfunc )( void );

定义一个新类型,这个类型是一个函数指针,指针指向的函数类型是void (void)型,

符合标准C

typedef union { intfunc __fun; void * __ptr; } intvec_elem;

定义一个新类型,这个类型是一个联合体,联合体有两个元素,一个元素类型是intfunc,一个元素类型是void *

符合标准C

#pragma language=extended

#pragma segment="CSTACK"

void __iar_program_start( void );

申明外部函数,extern可以用,也可以不用

符合标准C

#pragma location = ".intvec" // 下面的变量存放在段 .intvec

//IAR扩展

/* STM32F10x Vector Table entries */

const intvec_elem __vector_table[] =

{

{ .__ptr = __sfe( "CSTACK" ) },

// { .__ptr = 常量 },

// 数组元素是联合体,联合体有两个元素,对联合体元素__ptr赋初值

//符合标准C

//__sfe( "CSTACK" ) 是段CSTACK的尾地址,更准确是段CSTACK下一个段的首地址(记忆中应该是这样)。

//IAR扩展

__iar_program_start,

//数组元素是联合体,联合体有两个元素,对联合体第一个元素__fun赋初值

//完整的写法是 { .__fun= __iar_program_start },

//这里简写成__iar_program_start,是否符合标准C,有待考证

.....

}

}

补充:

对联合体第一个元素赋初值,可以简写。

{ .__fun= __iar_program_start },

//__fun是联合体第一个元素,可直接简写成__iar_program_start.

//符合标准C

__sfe是IAR的“段操作符”segment operator。表示取某个段的后一个字节的地址。

比如"CSTACK"定义为0x20001000~0x20001fff。那__sfe( "CSTACK" ) 就得到0x20002000这个值,刚好用来初始化msp堆栈指针

注意使用segment operator前,需要先定义段名如下:

#pragma segment="CSTACK"

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top