您的位置:首页 > 其它

用RVCT编译STM32点亮LED

2014-02-26 17:39 197 查看
STM32开发环境一般都MDK和IAR,我自己玩,没有这些东西。

我平时机器上的ARM编译器是RVCT,就用RVCT编译一个简单的项目学习一下。

我下面说的在网上都可以找到,上面说的RVCT是商业软件。

编译器用上面说的RVCT。

make用GNU make的windows版本,我用的GNU Make 3.81。

下载工具用的ST Visual Programer,意法半导体网页上有,http://www.st.com/web/cn/catalog/tools/FM147/CL1794/SC961/SS1533/PF210568

还有意法半导体的标准外设库,有很多代码可以参考使用,http://www.st.com/web/cn/catalog/tools/FM147/CL1794/SC961/SS1743/PF257890

板子用的微芯力科的三合一单片机开发评估套件,要点亮的两个LED接在PB5,PB6上。

先写main.c了:

#define RCC_APB2ENR *(volatile unsigned long *)0x40021018   //时钟使能寄存器
#define GPIOB_CRL *(volatile unsigned long *)0x40010C00     //GPIOB控制寄存器
#define GPIOB_ODR *(volatile unsigned long *)0x40010C0C     //GPIOB数据寄存器

int main(void)
{
volatile unsigned int i=0,j = 0;
int flag = 0;
//打开GPIOB的时钟
RCC_APB2ENR |= (1<<3);
//设置PB5,PB6模式
GPIOB_CRL = (2<<20) | (0<<22) | (2<<24) | (0<<26);
//设置PB5,PB6输出
GPIOB_ODR = (1<<5) | (1<<6);
flag = 1;
while (1)
{
//延时
for( i = 0 ; i <2000000 ; ++i )
{
}
if(flag)
{
//关灯
GPIOB_ODR = 0;
}
else
{
//开灯
GPIOB_ODR =  (1<<5) | (1<<6);
}
flag = !flag;
}
}


还会用到一个startup_stm32f10x_md.s,这个汇编代码,直接用标准库里的代码,不用修改。其中做了一些初始化工作,还有中断向量表等。里面调用了一个函数SystemInit,这个可以写个空函数,我比较懒,把标准库里的system_stm32f10x.c放当前目录就OK了,这个代码里有SystemInit。

需要的几个头文件:

core_cm3.h

stm32f10x.h

system_stm32f10x.h

都在标准库的代码里有。

然后就可以编译了,一个一个编,最后连接也可以,写个make直接搞完当然更好:

SIMPLE_PATH_NAME=Progra~1
FULL_PATH_NAME  =Program Files
ARM_HOME        =$(subst \,/,$(subst $(FULL_PATH_NAME),$(SIMPLE_PATH_NAME),$(RVCT31BIN)))
ARMCC           ="$(ARM_HOME)/armcc"
CC              ="$(ARM_HOME)/tcc"
CPP             ="$(ARM_HOME)/tcpp"
ASM             ="$(ARM_HOME)/armasm"
LINK            ="$(ARM_HOME)/armlink"
AR              ="$(ARM_HOME)/armar"
FROMELF         ="$(ARM_HOME)/fromelf"

TARGET        = STM32_1
T_FN	=$(strip $(TARGET))

CFLAGS        = -c --cpu Cortex-M3 -D__EVAL -g -O0 --apcs=interwork -DSTM32F10X_MD
AFLAGS        = --cpu Cortex-M3 --pd "__EVAL SETA 1" -g --apcs=interwork --xref
LFLAGS        = --cpu Cortex-M3 --ro-base 0x08000000 --entry 0x08000000 --rw-base 0x20000000 --entry Reset_Handler --first __Vectors --strict --summary_stderr --info summarysizes --map --xref --callgraph --symbols --info sizes --info totals --info unused --info veneers

IFLAGS        = -I.\

CFLAGS       += $(IFLAGS)

CSRCS = $(wildcard *.c)
ASRCS = $(wildcard *.s)
COBJS = $(CSRCS:.c=.o)
AOBJS = $(ASRCS:.s=.o)
OBJS = $(COBJS) $(AOBJS)

all: $(T_FN).axf
$(FROMELF) -c --i32 $(T_FN).axf  --output $(T_FN).hex

$(T_FN).axf: $(OBJS)
$(LINK) $(LFLAGS) --list ".\$(T_FN).map" $(OBJS) -o $@

startup_stm32f10x_md.o: startup_stm32f10x_md.s
$(ASM) $(AFLAGS) startup_stm32f10x_md.s -o $@

sinclude $(CSRCS:.c=.d)
%d: %c
$(ARMCC) --md $(CFLAGS) $<
@C:\Python33\python d_post.py $@

%o: %c %d
$(ARMCC) $(CFLAGS) --depend "$*d" -o $@ $<

clean :
del *.o
del *.d
del *.axf
del *.hex


Makefile里的python程序是用来处理生成的依赖文件的,因为C:\Program Files\xxx 这种路径有空格会编译失败。

如果觉得上面Makefile比较难理解,就看看下面我这个初期版本:

all: $(T_FN).axf
$(FROMELF) -c --i32 $(T_FN).axf  --output $(T_FN).hex

$(T_FN).axf: startup_stm32f10x_md.o main.o subfun.o system_stm32f10x.o
$(LINK) $(LFLAGS) --list ".\$(T_FN).map" startup_stm32f10x_md.o main.o subfun.o system_stm32f10x.o -o $@

startup_stm32f10x_md.o: startup_stm32f10x_md.s
$(ASM) $(AFLAGS) startup_stm32f10x_md.s -o $@
main.o: main.c
$(ARMCC) $(CFLAGS) main.c -o $@
system_stm32f10x.o: system_stm32f10x.c stm32f10x.h
$(ARMCC) $(CFLAGS) system_stm32f10x.c -o $@


尽管使用ST的外设标准库里的两个文件,main.c里是直接操作寄存器点亮两个LED的,没有使用lib。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: