用GCC开发STM32入门一(使用官方库)

简介: 用GCC开发STM32入门一(使用官方库)

先说说为什么需要用GCC开发stm32吧,作为一名编程方面的爱好者,又是搞嵌入式的,总是用现成的IDE,感觉很不舒服,虽然IDE能很大提高咱们的工作效率,可是作为业余学习研究,还是越熟悉底层越好。比如如何搭建环境,如何使用编译器和编写makefile,这些搞过linux开发的都知道,而且 linux环境下没那么多IDE可用,而且也没必要用IDE.还有一个原因是,喜欢黑色的dos窗口下编程的感觉,IDE编辑环境太刺眼了,每次下班后都很累眼睛。


一、开发环境的搭建


在《一步步写嵌入式操作系统》一书中,讲到了如何搭建嵌入式开发环境,cygwin+arm-elf-gcc+make工具


1.首先从www.leeos.org网站中下载所需要的软件,可以用cygwin+skyeye+gcc


2.安装cygwin软件,安装步骤按照书上的进行,需要说明的是 :在进入cygwin setup-select packages界面时,必须选中devel包中的gcc4和make,我们还可以选中vim作为我们之后的编写环境, 就不用不停的在window界面下切换了。


3.安装编译环境arm-elf-gcc。 首先将leeos_tools_for_cygwin.tar.gz复制到D:\cygwin\usr中(我把cygwin装在了D盘,具体看自己情况),然后解压缩为leeos_tools_for_cygwin。打开cygwin,输入cd /usr命令,切换到usr目录下,进行环境变量的设置,一次输入以下三条命令:


echo "PATH=\$PATH:/usr/leeos_tools_for_Cygwin/bin">>/etc/profile


echo "PATH=\$PATH:/usr/leeos_tools_for_Cygwin/libexec/gcc/arm-elf/4.4.2">>/etc/profile


echo "PATH=\$PATH:/usr/leeos_tools_for_Cygwin/arm-elf/bin">>/etc/profile


此时编译环境安装成功。我们可以打开看一下D:/cygwin/etc/profile文件,在该文件的最下边多了三句话 还要说明的一点是我们需要用chmod命令将三个目录下的所有exe文件设置一下权限,方法是chmod 777 *.exe 重启cygwin之后arm-elf-gcc就可以用了。


以上环境搭建的方法,摘自网络,百度一下有很多,我照着上面说的试了试,没有成功,再用arm-elf-gcc编译时出来了一堆提示汇编的错误,最后解决了,原来还是权限的问题。


二.编写makefile


上面的环境搭建好了,接下来就可以动手实验了。需要注意的是,下载的arm-elf-gcc编译器先看一下版本,听说只有4.2以上的才支持stm32.然后测试下编译器是否管用,随便写个c文件,用arm-elf-gcc -o2 -c hello.c -o hello.o测试下,成功生成hello.o说明环境搭建成功了。然后看一下make工具是否管用,make -v查看一下。


开始写makefile,其实这一步也不是必须的,完全可以手动的去编译,但是makefile的确很强大,写好一次,保存为模板,很好用,编辑时直接mske就可以了。


不用makefile,你需要写很长的东西,如:


arm-elf-gcc -g -mcpu=cortex-m3 -mthumb -c uart_helloworld.c -nostartfiles -o uart_helloworld.o
arm-elf-gcc -g -mcpu=cortex-m3 -mthumb -c isr.c -nostartfiles -o isr.o
arm-elf-ld -T stm32f103vet6.ld -o helloworld.out uart_helloworld.o isr.o
arm-elf-objcopy -O binary helloworld.out helloworld.bin


写成makefile就省事多了,简单的写法如:


PREFIX := arm-elf-
.PHONY: all clean
all: helloworld.bin
uart_helloworld.o: uart_helloworld.c
arm-elf-gcc -g -mcpu=cortex-m3 -mthumb -c uart_helloworld.c -nostartfiles -o uart_helloworld.o
isr.o: isr.c
arm-elf-gcc -g -mcpu=cortex-m3 -mthumb -c isr.c -nostartfiles -o isr.o
helloworld.out: uart_helloworld.o isr.o stm32f103vet6.ld
arm-elf-ld -T stm32f103vet6.ld -o helloworld.out uart_helloworld.o isr.o
helloworld.bin: helloworld.out
arm-elf-objcopy -O binary helloworld.out helloworld.bin
clean:
rm -f *.o *.out *.bin


这样写,虽然很清楚,文件的依赖关系等很明显,但是还是不够精简。这个就是一个简单的makefile,方便初学者学习和理解makefile原理。


以下是我整理了一份自己使用的模板:makefile


BINARY= main
PREFIX = arm-elf
CC = $(PREFIX)-gcc
LD = $(PREFIX)-ld
OBJCOPY = $(PREFIX)-objcopy
OBJDUMP = $(PREFIX)-objdump
CFLAGS= -mcpu=cortex-m3 -mthumb -nostartfiles 
LDSCRIPT =standalone.ld
LDFLAGS =  -T $(LDSCRIPT) 
OBJS= main.o 
.PHONY: clean
all:images
images: $(BINARY).hex $(BINARY).bin $(BINARY).srec $(BINARY).list
$(OBJS):%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@
%.elf: $(OBJS) $(LDSCRIPT)
$(CC) $(CFLAGS) -o start.o -c start.s
$(LD) -o $(*).elf start.o $(OBJS) $(LDFLAGS)
%.bin: %.elf
$(OBJCOPY) -Obinary $(*).elf $(*).bin
%.hex:%.elf
$(OBJCOPY) -Oihex $(*).elf $(*).hex
%.srec: %.elf
$(OBJCOPY) -Osrec $(*).elf $(*).srec
%.list: %.elf
$(OBJDUMP) -S $(*).elf > $(*).list
clean:
rm -f *.o
rm -f *.d
rm -f *.elf
rm -f *.bin
rm -f *.hex
rm -f *.srec
rm -f *.list


接下来,开始用GCC开发stm32了,先从简单的点灯开始......


相关文章
|
5月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
818 0
|
2月前
【寄存器开发速成】半小时入门STM32寄存器开发(二)
【寄存器开发速成】半小时入门STM32寄存器开发(二)
|
2月前
|
芯片
【寄存器开发速成】半小时入门STM32寄存器开发(一)
【寄存器开发速成】半小时入门STM32寄存器开发(一)
|
6月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
540 4
|
6月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
276 1
|
5月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
216 0
|
6月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
488 2
|
7月前
|
传感器
STM32标准库ADC和DMA知识点总结-1
STM32标准库ADC和DMA知识点总结
|
6月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
814 2