用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了:
还会用到一个startup_stm32f10x_md.s,这个汇编代码,直接用标准库里的代码,不用修改。其中做了一些初始化工作,还有中断向量表等。里面调用了一个函数SystemInit,这个可以写个空函数,我比较懒,把标准库里的system_stm32f10x.c放当前目录就OK了,这个代码里有SystemInit。
需要的几个头文件:
core_cm3.h
stm32f10x.h
system_stm32f10x.h
都在标准库的代码里有。
然后就可以编译了,一个一个编,最后连接也可以,写个make直接搞完当然更好:
Makefile里的python程序是用来处理生成的依赖文件的,因为C:\Program Files\xxx 这种路径有空格会编译失败。
如果觉得上面Makefile比较难理解,就看看下面我这个初期版本:
尽管使用ST的外设标准库里的两个文件,main.c里是直接操作寄存器点亮两个LED的,没有使用lib。
我平时机器上的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。
相关文章推荐
- STM32_GPIO之点亮LED实验
- STM32点亮LED
- STM32:CooCox IDE环境搭建 点亮LED
- STM32学习之第一个程序(点亮LED)
- STM32 位带操作点亮LED
- ARM裸板程序的开发和编译(以点亮LED灯为例)
- STM32学习笔记1-点亮LED
- 编译第一个驱动,加载点亮LED
- 第7章 使用寄存器点亮LED灯—零死角玩转STM32-F429系列
- STM32学习笔记之点亮LED灯
- stm32开发板点亮led遇到问题
- STM32-点亮LED灯(GPIO配置)
- STM32点亮LED(熟中新认识)
- STM32 自建库点亮LED
- STM32-1-LED点亮与熄灭
- [转载]STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)
- STM32学习之点亮LED
- 第11章 GPIO输出-使用固件库点亮LED—零死角玩转STM32-F429系列
- STM32学习笔记——控制GPIO输出点亮LED灯(直接操作存储器)
- 第7章 使用寄存器点亮LED灯—零死角玩转STM32-F429系列