文章目录
- 前言
- 一、环境搭建
- 1.arm-none-eabi-gcc
- 2.openocd
- 三、创建stm32标准库工程
- 1.创建工程目录
- 2.修改stm32_flash.ld文件
- 3.写makefile文件
- 4.修改core_cm3.c
- 5.写main函数并下载到板子上
- 最后
前言
我在那天终于说服自己将系统换成了linux系统了,当换成了linux系统后我发现,keil5这个软件实在是太香了,在linux系统下面没有keil5软件,当然我可以选择使用cubeIDE,但是我写stm32都是使用的是标准库进行编写的,要我再去学HAL库实在是太麻烦了。
然后我研究了一个星期后终于搞定这个环境了,所以我准备写一片文章来从头开始搭建stm32的环境,因为我又把ubuntu换成了kubuntu了,所以可以重头开始搭建了。
一、环境搭建
1.arm-none-eabi-gcc
这个工具是我们需要使用的编译工具,就和我们在linux中编译C语言程序一样,需要使用一个编译工具,这个工具可以编译arm芯片对应的机器码并生成hex
文件,所以我们首先要安装一下这个工具。
在官网中下载适合系统的压缩包:arm-none-eabi-gcc
我这选择的是这个安装包,然后等待下载。
下载完成后就看到有这个压缩包,我们先解压一下这个压缩包:
tar -jxvf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
解压出来的文件名字太长了,我们需要给它改个名字并且放在根目录下:
mv gcc-arm-none-eabi-10.3-2021.10 ~/gcc-arm-none-eabi
然后将这个文件中的bin
目录添加到环境变量中
vim ~/.zshrc
在最后一行添加:
export PATH=$PATH:/home/lavender_edgar/gcc-arm-none-eabi/bin
我这用的是zsh终端,你们如果用bash终端的话是使用:
vim ~/.bashrc
然后使用下面的命令重启一下即可:
source ~/.zshrc
如果是bash的就使用:
source ~/.bashrc
在终端中敲入arm
后按下tab键就可以看到有很多的补全,这就代表着安装成功了
2.openocd
这个工具可以将hex文件通过下载器下载到单片机中,这个工具支持很多的下载工具。
首先先在官网上下载这个工具:openocd
下载完成后进行解压:
tar -jxvf openocd-0.12.0.tar.bz2
然后还是一样的移动改名
mv openocd-0.12.0 ~/openocd
在开始之前我们需要做几个步骤,首先安装libtool
sudo apt install libtool-bin
然后安装一下HIDAPI
库,这个是CMSIS
需要的库
sudo apt-get install libhidapi-dev
将openocd/contrib
中的60-openocd.rules
复制一份到/etc/udev/rules.d/
中,如果不进行这个操作可能下载不进去,在复制时记得加上sudo
。
之后安装一下libusb++-dev
即可:
sudo apt-get install libusb++-dev
然后我们进入到刚才解压的目录中,执行下面的命令生成makefile
文件
sudo ./configure
如果出现下面的错误代表着你没有安装make
执行sudo apt install make
就可以了,安装完成后继续执行
sudo ./configure
然后就能生成makefile
文件
然后我们使用下面命令进行编译
sudo make
然后再执行
sudo make install
这样我们就安装好了openocd
了,我们可以在/usr/local/share/openocd/scripts/target
看到芯片配置文件
在/usr/local/share/openocd/scripts/interface
可以看到下载器配置文件
但还没有结束,因为刚才我们执行sudo ./configure
时出现了一个表
可以看到只有两个适合的,我们需要添加一下stlink
,这样才能支持,所以我们需要执行一下
sudo ./configure --enable-stlink
我在执行的时候出现了这样一个问题
这是因为少了一个pkg-config
,如果你也没有就需要使用下面的代码进行下载
sudo apt install pkg-config
然后在进行生成就会发现在stlink
后是ok了
然后再进行make
和make install
就可以了。
三、创建stm32标准库工程
1.创建工程目录
当环境安装完成后我们就可以创建stm32标准库的工程文件了,其实创建和在keil5中是一样的,只不过有些文件需要进行一下改变。
首先到官网下载标准库文件:标准库
然后创建一个文件夹用来存放项目文件,然后就可以开始移动了,这里可以直接使用图形化界面来进行移动要简单一点,这里我的项目格式如下:
├── doc
├── lib
│ ├── CMSIS
│ │ ├── core_cm3.c
│ │ ├── core_cm3.h
│ │ ├── startup
│ │ │ ├── startup_stm32f10x_cl.s
│ │ │ ├── startup_stm32f10x_hd.s
│ │ │ ├── startup_stm32f10x_hd_vl.s
│ │ │ ├── startup_stm32f10x_ld.s
│ │ │ ├── startup_stm32f10x_ld_vl.s
│ │ │ ├── startup_stm32f10x_md.s
│ │ │ ├── startup_stm32f10x_md_vl.s
│ │ │ └── startup_stm32f10x_xl.s
│ │ ├── stm32f10x.h
│ │ ├── system_stm32f10x.c
│ │ └── system_stm32f10x.h
│ └── FWlib
│ ├── inc
│ │ ├── misc.h
│ │ ├── stm32f10x_adc.h
│ │ ├── stm32f10x_bkp.h
│ │ ├── stm32f10x_can.h
│ │ ├── stm32f10x_cec.h
│ │ ├── stm32f10x_crc.h
│ │ ├── stm32f10x_dac.h
│ │ ├── stm32f10x_dbgmcu.h
│ │ ├── stm32f10x_dma.h
│ │ ├── stm32f10x_exti.h
│ │ ├── stm32f10x_flash.h
│ │ ├── stm32f10x_fsmc.h
│ │ ├── stm32f10x_gpio.h
│ │ ├── stm32f10x_i2c.h
│ │ ├── stm32f10x_iwdg.h
│ │ ├── stm32f10x_pwr.h
│ │ ├── stm32f10x_rcc.h
│ │ ├── stm32f10x_rtc.h
│ │ ├── stm32f10x_sdio.h
│ │ ├── stm32f10x_spi.h
│ │ ├── stm32f10x_tim.h
│ │ ├── stm32f10x_usart.h
│ │ └── stm32f10x_wwdg.h
│ └── src
│ ├── misc.c
│ ├── stm32f10x_adc.c
│ ├── stm32f10x_bkp.c
│ ├── stm32f10x_can.c
│ ├── stm32f10x_cec.c
│ ├── stm32f10x_crc.c
│ ├── stm32f10x_dac.c
│ ├── stm32f10x_dbgmcu.c
│ ├── stm32f10x_dma.c
│ ├── stm32f10x_exti.c
│ ├── stm32f10x_flash.c
│ ├── stm32f10x_fsmc.c
│ ├── stm32f10x_gpio.c
│ ├── stm32f10x_i2c.c
│ ├── stm32f10x_iwdg.c
│ ├── stm32f10x_pwr.c
│ ├── stm32f10x_rcc.c
│ ├── stm32f10x_rtc.c
│ ├── stm32f10x_sdio.c
│ ├── stm32f10x_spi.c
│ ├── stm32f10x_tim.c
│ ├── stm32f10x_usart.c
│ └── stm32f10x_wwdg.c
├── makefile
├── stm32_flash.ld
└── user├── main.c├── stm32f10x_conf.h├── stm32f10x_it.c└── stm32f10x_it.h
其中最主要的文件是启动文件,这个启动文件是在这个路径中进行查找:STM32F10x_StdPeriph_Lib_V3.6.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO
,你可以把他们全部拷贝,也可以只用一个。
当然一个一个的移动实在是太麻烦了,所以我写了一个sh脚本,大家可以一键移动:
#!/bin/zsh# 如果你是使用bash可以在上面改为!/bin/bashlocal=$(sudo find /home/ -name 'STM32F10x_StdPeriph_Lib_V3.6.0')
name=test1 # 这个修改为你的工程名字
start_name=startup_stm32f10x_hd.s # 修改这个移动对应的启动文件,如果要移动全部文件可以写为*.sfile_lib=(./$name/lib ./$name/lib/CMSIS ./$name/lib/FWlib ./$name/lib/CMSIS/startup)file_user=(./$name/user)echo $local
echo $name# 创建目录
mkdir ./$name ./$name/doc
for i in ${file_lib}
domkdir $i
donefor i in ${file_user}
domkdir $i
done# 创建文件
touch ./$name/makefile
touch ./$name/user/main.c# 移动文件
cp $local/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/$start_name ./$name/lib/CMSIS/startup
cp $local/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/*.(c|h) ./$name/lib/CMSIS/
cp $local/Libraries/CMSIS/CM3/CoreSupport/* ./$name/lib/CMSIS/
cp -r $local/Libraries/STM32F10x_StdPeriph_Driver/inc ./$name/lib/FWlib
cp -r $local/Libraries/STM32F10x_StdPeriph_Driver/src ./$name/lib/FWlib
cp $local/Project/STM32F10x_StdPeriph_Template/stm32f10x_conf.h ./$name/user
cp $local/Project/STM32F10x_StdPeriph_Template/stm32f10x_it.h ./$name/user
cp $local/Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c ./$name/user
cp $local/Project/STM32F10x_StdPeriph_Template/TrueSTUDIO/STM3210E-EVAL_XL/stm32_flash.ld ./$name/
我很久没有写shell了,这个脚本不是很完美,大家可以感根据自己的想法进行改写。
2.修改stm32_flash.ld文件
我之前在这踩了很多次坑,所以这里需要非常的注意,我们这使用的stm32_flash.ld
文件是移植STM32F103ZG
芯片的,因为这个ld
文件和c8t6
的文件差不多,所以我们选择这个作为我们的链接脚本,但并不是移植完就可以使用的,我们还需要给它修改一下。
这个是原始的链接文件:
我们需要修改的内容其实就是在最前面就可以了。
首先我们要将_estack = 0x20018000;
修改为_estack = ORIGIN(RAM) + LENGTH(RAM);
,然后将
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1M
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 96K
修改为:
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
然后就可以了,修改完成的内容如下:
修改完成后我们就可以开始写makefile文件了。
3.写makefile文件
上面的脚本执行完后会生成一个makefile文件,我们直接用vim
进行写入就可以了,脚本我是参考了很多文章写出来的,这里就不讲解了,直接用我写好的就可以了:
TARGET=test # 这里是项目名,改就可以
CC=arm-none-eabi-gcc
OBJCOPY=arm-none-eabi-objcopy
RM=rm -f
CORE=3
CPUFLAGS=-mthumb -mcpu=cortex-m$(CORE)
INCFLAGS=-I $(shell pwd)/lib/CMSIS -I $(shell pwd)/lib/FWlib/inc -I $(shell pwd)/user
LDFLAGS = -T stm32_flash.ld -Wl,-cref,-u,Reset_Handler -Wl,-Map=$(TARGET).map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 -Wl,--start-group -lc -lm -Wl,--end-group
CFLAGS=$(INCFLAGS) -D STM32F10X_HD -D USE_STDPERIPH_DRIVER -Wall -g
START_SRC=$(shell find ./ -name 'startup_stm32f10x_hd.s')
START_OBJ=$(START_SRC:%.s=%.o)
C_SRC=$(shell find ./ -name '*.c')
C_OBJ=$(C_SRC:%.c=%.o)
INTERRFACE_CFG=/usr/local/share/openocd/scripts/interface/stlink-v2.cfg # 这里就是下载器的配置文件,可以在前面提到的文件夹中找到对应下载器的配置文件
TARGET_CFG=/usr/local/share/openocd/scripts/target/stm32f1x.cfg
$(TARGET):$(START_OBJ) $(C_SRC)$(CC) $^ $(CPUFLAGS) $(LDFLAGS) $(CFLAGS) -o $(TARGET).elf$(OBJCOPY) $(TARGET).elf $(TARGET).bin$(OBJCOPY) $(TARGET).elf -Oihex $(TARGET).hex
$(START_OBJ):$(START_SRC)$(CC) -c $^ $(CPUFLAGS) $(CFLAGS) -o $@
$(C_OBJ):%.o:%.c$(CC) -c $^ $(CPUFLAGS) $(CFLAGS) -o $@
clear:$(RM) $(shell find ./ -name '*.o') $(TARGET).*# 这个是一键下载,如果不是stlink下载器可以改对应的变量
download:openocd -f $(INTERRFACE_CFG) -f $(TARGET_CFG) -c init -c halt -c "flash write_image erase $(PWD)/$(TARGET).bin" -c reset -c shutdown
4.修改core_cm3.c
这个文件是需要进行修改一下的,如果你不进行修改就会报错
这个错误需要你打开core_cm3.c
文件,然后在第736行和753行的=r
中添加一个&
,这样就不会报错了
5.写main函数并下载到板子上
这一步大家应该都会吧,这里我写的main函数是点亮PB0的LED灯来进行测试
#include "stm32f10x.h"int main(){GPIO_InitTypeDef GPIO_InitStruct = {0};RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);while(1){GPIO_WriteBit(GPIOB, GPIO_Pin_0, 0);}return 0;
}
然后执行make
,当编译完成后就可以执行make downlocal
进行下载了。
编译的效果图:
下载的效果图:
实物的效果:
最后
使用linux对stm32的开发的环境搭建就讲完了,如果大家有其他错误出现可以发在评论区,我这随时可以回答的,大家也可以关注一下我的csdn、博客园和我自己的论坛,链接放在下面了
Lavender Edgar的博客
博客园
CSDN