gcc 编写stm32不用官方库通过。带中断。

xujianxiang 2013-03-19 02:24:47
网上找了两天了。要么就是gcc编译入门。其本上就一个helloworld.如果要中断。你几乎找不到想要的程序。要么就是带官方库。在机器上make都通不过。而且bin可能会很大。不利于初学者。如果用keil程序是很简单。但是可能有版权的问题。经过两天的努力,总算有了一点成绩,不敢独享。共免之。程序主要基于
http://code.google.com/p/stm32-tutorial/source/browse/trunk/?r=7(没有中断)。高手不要喷我。我也是刚学。
makefile
PREFIX := arm-none-eabi-

.PHONY: all clean

all: helloworld.bin

uart_helloworld.o: uart_helloworld.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -c uart_helloworld.c -nostartfiles -o uart_helloworld.o

isr.o: isr.c
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -c isr.c -nostartfiles -o isr.o

helloworld.out: uart_helloworld.o isr.o stm32f103vet6.ld
arm-none-eabi-ld -T stm32f103vet6.ld -o helloworld.out uart_helloworld.o isr.o


helloworld.bin: helloworld.out
arm-none-eabi-objcopy -O binary helloworld.out helloworld.bin

clean:
rm -f *.o *.out *.bin
...全文
665 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xujianxiang 2013-03-22
  • 打赏
  • 举报
回复
终于完全搞定中断。 MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);指定一下向量表就ok了
(☆随缘☆) 2013-03-20
  • 打赏
  • 举报
回复
感谢分享,
xujianxiang 2013-03-19
  • 打赏
  • 举报
回复
实在是网上没找到浅一点的文章。大多是keil加个库。真不适合初学者。这个程序基本都是底层相关了。这个程序还有一个问题。就是下载之后程序跑起来直接interrupt程序就会跳会。必须跳线后重新启动才能正常运行。希望大侠们在这个问题上指点一下。
xujianxiang 2013-03-19
  • 打赏
  • 举报
回复
//还有最后一段给大。这个就完整了。其他的中断的话,跟串口的写法大同小异。初级编程就差不多了。 int main(void) { int i; Stm32_Clock_Init(2); //50M,外部晶振25M PLL锁相环设定 delay_init(50);//延时初始化。用不着就删了吧。 LED_Init();//led初始化用不着也删了吧。 uart_init();//串口一初始化。bbs用的是系统时钟50M uart2_init();//串口二初始化。bbs用的是外部时钟25M while (1) { /* for (i = 0; i < 256; i++) { uart1_send(i); }*/ /*led用不着就删了吧*/ LED0=0; LED1=1; LED2=1; LED3=1; delay_ms(1000); delay_ms(1000); delay_ms(1000); delay_ms(1000); delay_ms(1000); LED0=1; LED1=0; LED2=1; LED3=1; delay_ms(1000); delay_ms(1000); delay_ms(1000); delay_ms(1000); delay_ms(1000); LED0=1; LED1=1; LED2=0; LED3=1; delay_ms(1000); delay_ms(1000); delay_ms(1000); delay_ms(1000); delay_ms(1000); LED0=1; LED1=1; LED2=1; LED3=0; delay_ms(1000); delay_ms(1000); delay_ms(1000); delay_ms(1000); delay_ms(1000); } }
wesley 2013-03-19
  • 打赏
  • 举报
回复
牛人 赞一个,stm32一直用库
(☆随缘☆) 2013-03-19
  • 打赏
  • 举报
回复
感谢分享,
xujianxiang 2013-03-19
  • 打赏
  • 举报
回复

//这些数据我都是stm32不完全手则上那边考来的。
void Sys_Soft_Reset(void)//软复位
{
SCB->AIRCR =0X05FA0000|(u32)0x04;
}

void send2(unsigned char ch)
{      
	while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
	USART2->DR =  ch;      

}
void send1(unsigned char ch)
{      
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
	USART1->DR =  ch;      

}
void vUARTInterruptHandler(void)
//中断,我就测一下。已能收能发。你们可能进行一些修正。我51来的。比较习惯51的写法。
{ unsigned char res;	    
	if(USART1->SR&(1<<5))//
	{	 
		res=USART1->DR; 
		send1(res+5);
Sys_Soft_Reset();
	}
  return; 
}
void USART2_IRQHandler(void)
//中断,我就测一下。已能收能发。你们可能进行一些修正。我51来的。比较习惯51的写法。
{ unsigned char res;	    
	if(USART2->SR&(1<<5))//
	{	 
		res=USART2->DR; 
		send2(res+5);
	}
  return; 
}




void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)	 
{ 
	u32 temp,temp1;	  
	temp1=(~NVIC_Group)&0x07;//取后三位
	temp1<<=8;
	temp=SCB->AIRCR;  //读取先前的设置
	temp&=0X0000F8FF; //清空先前分组
	temp|=0X05FA0000; //写入钥匙
	temp|=temp1;	   
	SCB->AIRCR=temp;  //设置分组	    	  				   
}
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)	 
{ 
	u32 temp;	
	u8 IPRADDR=NVIC_Channel/4;  //每组只能存4个,得到组地址 
	u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移
	IPROFFSET=IPROFFSET*8+4;    //得到偏移的确切位置
	MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
	temp=NVIC_PreemptionPriority<<(4-NVIC_Group);	  
	temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
	temp&=0xf;//取低四位

	if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK)
	else NVIC->ISER[1]|=1<<(NVIC_Channel-32);    
	NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级   	    	  				   
}










void MYRCC_DeInit(void)
{										  					   
	RCC->APB1RSTR = 0x00000000;//			 
	RCC->APB2RSTR = 0x00000000; 
	  
  	RCC->AHBENR = 0x00000014;  	  
  	RCC->APB2ENR = 0x00000000; 			   
  	RCC->APB1ENR = 0x00000000;   
	RCC->CR |= 0x00000001;     	 															 
	RCC->CFGR &= 0xF8FF0000;   				 
	RCC->CR &= 0xFEF6FFFF;     
	RCC->CR &= 0xFFFBFFFF;    	  
	RCC->CFGR &= 0xFF80FFFF;  
	RCC->CIR = 0x00000000;     
					  

}

void Stm32_Clock_Init(u8 PLL)
{
	unsigned char temp=0;   
	MYRCC_DeInit();		  
	RCC->CR|=0x00010000; 
	while(!(RCC->CR>>17));//
	RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
	PLL-=2;//
	RCC->CFGR|=PLL<<18;   //
	RCC->CFGR|=1<<16;	  //PLLSRC ON 
	FLASH->ACR|=0x32;	  //FLASH 

	RCC->CR|=0x01000000;  //PLLON
	while(!(RCC->CR>>25));//
	RCC->CFGR|=0x00000002;//PLL 
	while(temp!=0x02)     //
	{   
		temp=RCC->CFGR>>2;
		temp&=0x03;
	}    
}
void delay_init(u8 SYSCLK)
{
	SysTick->CTRL&=0xfffffffb;// HCLK/8
	fac_us=SYSCLK/8;		    
	fac_ms=(u16)fac_us*1000;
}
void delay_ms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=(u32)nms*fac_ms;//
	SysTick->VAL =0x00;           //
	SysTick->CTRL=0x01 ;          //
	do
	{
		temp=SysTick->CTRL;
	}
	while(temp&0x01&&!(temp&(1<<16)));//
	SysTick->CTRL=0x00;       //
	SysTick->VAL =0X00;       //  	    
} 
void LED_Init(void)
{
   	 
	RCC->APB2ENR|=1<<5;    //
	   	 
	GPIOA->CRH&=0XFFFFFFF0; 
	GPIOA->CRH|=0X00000003;// 	 
    GPIOA->ODR|=1<<8;      //PA8 
											  
	GPIOD->CRL&=0X0FF000FF;
	GPIOD->CRL|=0X30033300;//PD.2
	GPIOD->ODR|=1<<2;      //PD.2
		GPIOD->ODR|=1<<3;      //PD.3
			GPIOD->ODR|=1<<4;      //PD.4
				GPIOD->ODR|=1<<7;      //PD.7
}  
void uart_init()
{  	 
	
	RCC->APB2ENR|=1<<2;   //
	RCC->APB2ENR|=1<<14;  //
	GPIOA->CRH&=0XFFFFF00F; 
	GPIOA->CRH|=0X000008B0;//
		  
	RCC->APB2RSTR|=1<<14;   //
	RCC->APB2RSTR&=~(1<<14);//   	   
	//
 	USART1->BRR=5208; // 这是波特率算法,本来有个算法的,可能gcc不支持float就没有用,
	USART1->CR1|=0X200C;  //
	  //
	//
	USART1->CR1|=1<<8;    //
	USART1->CR1|=1<<5;    // 	
	MY_NVIC_Init(3,3,37,2);
//37是串口1的中断号,STM32F10x参考手册_cn.pdf里写得很清楚(中断和异常向量)那一块,可能define 一下就更好一点。
	//send1(USART1_IRQChannel);

}
void uart2_init()
{  	 
	
	RCC->APB2ENR|=1<<0;   //
	RCC->APB2ENR|=1<<5;   //
	RCC->APB1ENR|=1<<17;  //
	GPIOD->CRL&=0XF00FFFFF; 
	GPIOD->CRL|=0X08B00000;//
		  
	RCC->APB1RSTR|=1<<17;   //
	RCC->APB1RSTR&=~(1<<17);//	   	   
	//
 	USART2->BRR=2604; //
	USART2->CR1|=0X200C;  //
	AFIO->MAPR|=1<<3;
		  //
	
	USART2->CR1|=1<<8;    //
	USART2->CR1|=1<<5;    //    	
	MY_NVIC_Init(2,3,38,2);//

}
xujianxiang 2013-03-19
  • 打赏
  • 举报
回复
helloworld.c我没有弄.h文件。你们可以把它分几部分。这个比较长.我们几部分发。

typedef volatile unsigned long  vu32;
typedef volatile unsigned short vu16;
typedef volatile unsigned char  vu8;
typedef unsigned long  u32;
typedef unsigned short u16;
typedef unsigned char  u8;
typedef volatile unsigned long  const vuc32;  /* Read Only */
typedef volatile unsigned short const vuc16;  /* Read Only */
typedef volatile unsigned char  const vuc8;   /* Read Only */
static u8  fac_us=0;//
static u16 fac_ms=0;//

/*------------------------ Reset and Clock Control ---------------------------*/
typedef struct
{
  vu32 CR;
  vu32 CFGR;
  vu32 CIR;
  vu32 APB2RSTR;
  vu32 APB1RSTR;
  vu32 AHBENR;
  vu32 APB2ENR;
  vu32 APB1ENR;
  vu32 BDCR;
  vu32 CSR;
} RCC_TypeDef;


typedef struct
{
  vu32 ISER[2];
  u32  RESERVED0[30];
  vu32 ICER[2];
  u32  RSERVED1[30];
  vu32 ISPR[2];
  u32  RESERVED2[30];
  vu32 ICPR[2];
  u32  RESERVED3[30];
  vu32 IABR[2];
  u32  RESERVED4[62];
  vu32 IPR[15];
} NVIC_TypeDef;
typedef struct
{
  vuc32 CPUID;
  vu32 ICSR;
  vu32 VTOR;
  vu32 AIRCR;
  vu32 SCR;
  vu32 CCR;
  vu32 SHPR[3];
  vu32 SHCSR;
  vu32 CFSR;
  vu32 HFSR;
  vu32 DFSR;
  vu32 MMFAR;
  vu32 BFAR;
  vu32 AFSR;
} SCB_TypeDef;
typedef struct
{
  vu32 ACR;
  vu32 KEYR;
  vu32 OPTKEYR;
  vu32 SR;
  vu32 CR;
  vu32 AR;
  vu32 RESERVED;
  vu32 OBR;
  vu32 WRPR;
} FLASH_TypeDef;
/*------------------------ SystemTick ----------------------------------------*/
typedef struct
{
  vu32 CTRL;
  vu32 LOAD;
  vu32 VAL;
  vuc32 CALIB;
} SysTick_TypeDef;
/*------------------------ General Purpose and Alternate Function IO ---------*/
typedef struct
{
  vu32 CRL;
  vu32 CRH;
  vu32 IDR;
  vu32 ODR;
  vu32 BSRR;
  vu32 BRR;
  vu32 LCKR;
} GPIO_TypeDef;
/*----------------- Universal Synchronous Asynchronous Receiver Transmitter --*/
typedef struct
{
  vu16 SR;
  u16  RESERVED0;
  vu16 DR;
  u16  RESERVED1;
  vu16 BRR;
  u16  RESERVED2;
  vu16 CR1;
  u16  RESERVED3;
  vu16 CR2;
  u16  RESERVED4;
  vu16 CR3;
  u16  RESERVED5;
  vu16 GTPR;
  u16  RESERVED6;
} USART_TypeDef;
typedef struct
{
  vu32 EVCR;
  vu32 MAPR;
  vu32 EXTICR[4];
} AFIO_TypeDef;

#define PERIPH_BASE           ((u32)0x40000000)
#define APB1PERIPH_BASE       PERIPH_BASE
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x20000)
#define FLASH_R_BASE          (AHBPERIPH_BASE + 0x2000)

#define SCS_BASE              ((u32)0xE000E000)
#define NVIC_BASE             (SCS_BASE + 0x0100)
#define SCB_BASE              (SCS_BASE + 0x0D00)
  #define NVIC                ((NVIC_TypeDef *) NVIC_BASE)
 #define SCB                 ((SCB_TypeDef *) SCB_BASE)  
#define RCC_BASE              (AHBPERIPH_BASE + 0x1000)
  #define RCC                 ((RCC_TypeDef *) RCC_BASE)
  #define FLASH               ((FLASH_TypeDef *) FLASH_R_BASE)
#define SysTick_BASE          (SCS_BASE + 0x0010)
 #define SysTick             ((SysTick_TypeDef *) SysTick_BASE)
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)

  #define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
  #define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)
  #define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)
  #define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)
  #define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)
  #define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)
  #define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE)
#define USART1_BASE           (APB2PERIPH_BASE + 0x3800)
  #define USART1              ((USART_TypeDef *) USART1_BASE)
#define USART2_BASE           (APB1PERIPH_BASE + 0x4400)
#define USART3_BASE           (APB1PERIPH_BASE + 0x4800)
  #define USART2              ((USART_TypeDef *) USART2_BASE)
#define AFIO_BASE             (APB2PERIPH_BASE + 0x0000)
  #define AFIO                ((AFIO_TypeDef *) AFIO_BASE)



#define LED0 PDout(2)// PA8
#define LED1 PDout(3)// PD2	
#define LED2 PDout(4)// PA8
#define LED3 PDout(7)// PD2	

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
//
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 
 
//
//
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //
#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //
//这里就定义了一些寄存器,网上还有很多。我是根据stm32不完全手则来的.它写的比较浅。很容易懂。
xujianxiang 2013-03-19
  • 打赏
  • 举报
回复
继续更新,你可能把不常用的定义成同一个函数名,那么就不会像我的程序一样又臭又长了。要看后成的程序要记得回复。
都市劳工 2013-03-19
  • 打赏
  • 举报
回复
xujianxiang 2013-03-19
  • 打赏
  • 举报
回复
isr.c可以把中断写在isr.c里面也可能extern写在其他文件里。这次我把两个串口main函数的文件里了。代码好下:
extern int main(void);

void ResetISR(void); 
void NMIException(void); 
void HardFaultException(void); 
void MemManageException(void); 
void BusFaultException(void); 
void UsageFaultException(void); 
void vPortSVCHandler(void); 
void DebugMonitor(void); 
void xPortPendSVHandler(void); 
void xPortSysTickHandler(void); 
void WWDG_IRQHandler(void); 
void PVD_IRQHandler(void); 
void TAMPER_IRQHandler(void); 
void RTC_IRQHandler(void); 
void FLASH_IRQHandler(void); 
void RCC_IRQHandler(void); 
void EXTI0_IRQHandler(void); 
void EXTI1_IRQHandler(void); 
void EXTI2_IRQHandler(void); 
void EXTI3_IRQHandler(void);
void EXTI4_IRQHandler(void);
void DMAChannel1_IRQHandler(void);
void DMAChannel2_IRQHandler(void);
void DMAChannel3_IRQHandler(void);
void DMAChannel4_IRQHandler(void);
void DMAChannel5_IRQHandler(void);
void DMAChannel6_IRQHandler(void);
void DMAChannel7_IRQHandler(void);
void ADC_IRQHandler(void);
void USB_HP_CAN_TX_IRQHandler(void);
void USB_LP_CAN_RX0_IRQHandler(void);
void CAN_RX1_IRQHandler(void);
void CAN_SCE_IRQHandler(void);
void EXTI9_5_IRQHandler(void);
void TIM1_BRK_IRQHandler(void);
void TIM1_UP_IRQHandler(void);
void TIM1_TRG_COM_IRQHandler(void);
void TIM1_CC_IRQHandler(void);
void vTimer2IntHandler(void);
void TIM3_IRQHandler(void);
void TIM4_IRQHandler(void);
void I2C1_EV_IRQHandler(void);
void I2C1_ER_IRQHandler(void);
void I2C2_EV_IRQHandler(void);
void I2C2_ER_IRQHandler(void);
void SPI1_IRQHandler(void);
void SPI2_IRQHandler(void);
extern void vUARTInterruptHandler(void);
extern void USART2_IRQHandler(void);
void USART3_IRQHandler(void);
void EXTI15_10_IRQHandler(void);
void RTCAlarm_IRQHandler(void);
void USBWakeUp_IRQHandler(void);


typedef void (*pfnISR)(void);    // Pointer to exception handle function 

__attribute__ ((section(".isr_vector")))
pfnISR VectorTable[] =  
{ 
  (pfnISR)(0x20010000),  // The initial stack pointer is the top of SRAM 
  ResetISR,              // The reset handler 
  NMIException, 
  HardFaultException,
  MemManageException,
  BusFaultException,
  UsageFaultException,
  0, 0, 0, 0,            /* Reserved */
  vPortSVCHandler,
  DebugMonitor,
  0,                      /* Reserved */
  xPortPendSVHandler,
  xPortSysTickHandler,
  WWDG_IRQHandler,
  PVD_IRQHandler,
  TAMPER_IRQHandler,
  RTC_IRQHandler,
  FLASH_IRQHandler,
  RCC_IRQHandler,
  EXTI0_IRQHandler,
  EXTI1_IRQHandler,
  EXTI2_IRQHandler,
  EXTI3_IRQHandler,
  EXTI4_IRQHandler,
  DMAChannel1_IRQHandler,
  DMAChannel2_IRQHandler,
  DMAChannel3_IRQHandler,
  DMAChannel4_IRQHandler,
  DMAChannel5_IRQHandler,
  DMAChannel6_IRQHandler,
  DMAChannel7_IRQHandler,
  ADC_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,
  vTimer2IntHandler,
  TIM3_IRQHandler,
  TIM4_IRQHandler,
  I2C1_EV_IRQHandler,
  I2C1_ER_IRQHandler,
  I2C2_EV_IRQHandler,
  I2C2_ER_IRQHandler,
  SPI1_IRQHandler,
  SPI2_IRQHandler,
  vUARTInterruptHandler,
  USART2_IRQHandler,
  USART3_IRQHandler,
  EXTI15_10_IRQHandler,
  RTCAlarm_IRQHandler,
  USBWakeUp_IRQHandler,
}; 

//***************************************************************************** 
// 
// The following are constructs created by the linker, indicating where the 
// the "data" and "bss" segments reside in memory.  The initializers for the 
// for the "data" segment resides immediately following the "text" segment. 
// 
//***************************************************************************** 
extern unsigned long _eisr_vector;
extern unsigned long _text;
extern unsigned long _etext; 
extern unsigned long _data; 
extern unsigned long _edata; 
extern unsigned long _bss; 
extern unsigned long _ebss; 

void ResetISR(void) 
{ 
  unsigned long *src, *dst; 

  // copy the text segment from flash to SRAM
  src = &_eisr_vector;
  dst = &_text;
  while (dst < &_etext) {
    *dst++ = *src++;
  }
  
  // Copy the data segment initializers from flash to SRAM. 
  dst = &_data;
  while (dst < &_edata) {
    *dst++ = *src++;
  }
  
  // Zero fill the bss segment. 
  for(dst = &_bss; dst < &_ebss; dst++) { 
    *dst = 0; 
  } 
  
  // Call the application's entry point. 
  main();
} 

void NMIException(void) 
{ 
  return; 
} 

void HardFaultException(void) 
{ 
  return; 
}
void MemManageException(void)
{ 
  return; 
}
void BusFaultException(void)
{ 
  return; 
}

void UsageFaultException(void)
{ 
  return; 
} 
void vPortSVCHandler(void)
{ 
  return; 
}
void DebugMonitor(void)
{ 
  return; 
}
void xPortPendSVHandler(void)
{ 
  return; 
}
void xPortSysTickHandler(void)
{ 
  return; 
} 
void WWDG_IRQHandler(void)
{ 
  return; 
} 
void PVD_IRQHandler(void)
{ 
  return; 
}
void TAMPER_IRQHandler(void)
{ 
  return; 
} 
void RTC_IRQHandler(void)
{ 
  return; 
} 
void FLASH_IRQHandler(void)
{ 
  return; 
} 
void RCC_IRQHandler(void)
{ 
  return; 
} 
void EXTI0_IRQHandler(void)
{ 
  return; 
} 
void EXTI1_IRQHandler(void)
{ 
  return; 
} 
void EXTI2_IRQHandler(void)
{ 
  return; 
} 
void EXTI3_IRQHandler(void)
{ 
  return; 
}
void EXTI4_IRQHandler(void)
{ 
  return; 
}
void DMAChannel1_IRQHandler(void)
{ 
  return; 
}
void DMAChannel2_IRQHandler(void)
{ 
  return; 
}
void DMAChannel3_IRQHandler(void)
{ 
  return; 
}
void DMAChannel4_IRQHandler(void)
{ 
  return; 
}
void DMAChannel5_IRQHandler(void)
{ 
  return; 
}
void DMAChannel6_IRQHandler(void)
{ 
  return; 
}
void DMAChannel7_IRQHandler(void)
{ 
  return; 
}
void ADC_IRQHandler(void)
{ 
  return; 
}
void USB_HP_CAN_TX_IRQHandler(void)
{ 
  return; 
}
void USB_LP_CAN_RX0_IRQHandler(void)
{ 
  return; 
}
void CAN_RX1_IRQHandler(void)
{ 
  return; 
}
void CAN_SCE_IRQHandler(void)
{ 
  return; 
}
void EXTI9_5_IRQHandler(void)
{ 
  return; 
}
void TIM1_BRK_IRQHandler(void)
{ 
  return; 
}
void TIM1_UP_IRQHandler(void)
{ 
  return; 
}
void TIM1_TRG_COM_IRQHandler(void)
{ 
  return; 
}
void TIM1_CC_IRQHandler(void)
{ 
  return; 
}
void vTimer2IntHandler(void)
{ 
  return; 
}
void TIM3_IRQHandler(void)
{ 
  return; 
}
void TIM4_IRQHandler(void)
{ 
  return; 
}
void I2C1_EV_IRQHandler(void)
{ 
  return; 
}
void I2C1_ER_IRQHandler(void)
{ 
  return; 
}
void I2C2_EV_IRQHandler(void)
{ 
  return; 
}
void I2C2_ER_IRQHandler(void)
{ 
  return; 
}
void SPI1_IRQHandler(void)
{ 
  return; 
}
void SPI2_IRQHandler(void)
{ 
  return; 
}

void USART3_IRQHandler(void)
{ 
  return; 
}
void EXTI15_10_IRQHandler(void)
{ 
  return; 
}
void RTCAlarm_IRQHandler(void)
{ 
  return; 
}
void USBWakeUp_IRQHandler(void)
{ 
  return; 
}
xujianxiang 2013-03-19
  • 打赏
  • 举报
回复
stm32f103VET6.ld
xujianxiang 2013-03-19
  • 打赏
  • 举报
回复
/*************************************************/ 
/* filename: stm32f103VET6.ld                    */ 
/* linkscript for STM32F103VET6  microcontroller */ 
/*                                               */ 
/*************************************************/  
MEMORY 
{
  /*FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512k*/
  /*Let's use the address space start from 0x00000000*/
 /*原代码中是用了0x00000000,查询资料好像说stm32可以用绝对地址和相对地址,注意用0x00000000
程序不能下载后就运行。*/
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512k 
  SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64k 
}

/* Section Definitions */ 
SECTIONS
{
  .isr_vector :
  {
    KEEP(*(.isr_vector))
    isr.o(.text)
    . = ALIGN(4);
    _eisr_vector = .;
  }

  .text : AT (_eisr_vector)
  {
    _text = .;
    *(EXCLUDE_FILE(isr.o) .text)
    *(.rodata)
    . = ALIGN(4);
    _etext = .;
  } > SRAM

  .data :
  { 
    _data = .;
    *(.data)
    . = ALIGN(4);
    _edata = . ;
  } > SRAM

  /* .bss section which is used for uninitialized data */
  .bss (NOLOAD) :
  {
    _bss = . ;
    *(.bss)
    . = ALIGN(4);
    _ebss = . ;
  } > SRAM

  _end = . ;
}

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧