27,382
社区成员
发帖
与我相关
我的任务
分享
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
//这些数据我都是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);//
}
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不完全手则来的.它写的比较浅。很容易懂。
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;
}
/*************************************************/
/* 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 = . ;
}