一开始学习51单片机就是用的MDK这个IDE软件,IDE软件虽然看起来直观好像更加容易入门(因为有界面看起来很形象),但是实际上IDE却是向我们这些入门人员隐藏了背后真实存在的过程,让我们以为编译就是点一下一个按键就完成了。直到使用了大半年的STM32芯片,我觉得不能一直依赖IDE软件,所以打算试试在Linux下开发STM32,首先需要一个 linux下STM32的编译器查了一下,度娘告诉我 arm-none-eabi-gcc编译器是可以编译STM32的代码的,所以需要现在Linux(ubantu)下安装好arm-none-eabi-gcc这里就不写怎么安装了。然后我们开始开发一个STM32的LED程序,可能在MDK软件下,没人不会但是在Linux下没接触过了就无从下手了。我也是第一次尝试学习所以记录下。

因为在MDK上开发过STM32所以我知道需要下面几个文件

core_cm3.c
core_cm3.h
system_stm32f10x.c
stm32f10x.h
stm32f10x_conf.h
system_stm32f10x.h
startup_stm32f103xb.s

所以把他们从以前的工程中考出来,放到linux下的目录下备用,这里需要注意是,启动文件startup_stm32f103xb.s是和MDK下不同的需要在ST官网上去下载。

然后需要的了解的就是linux下的编译命令

arm-none-eabi-gcc -c  xxx.c -o   name   这个命令就是将一个c文件编译生成name名称的.o文件。但是这里还需要用到一些编译标志暂时不用清楚作用,先打通流程最终的编译命令就是

arm-none-eabi-gcc -o   “”name“”  -c   -W -Wall -g -I $(INC)  -lm  -lc -mcpu=cortex-m3 -mthumb -D STM32F10X_HD -D USE_STDPERIPH_DRIVER -O1 -std=gnu11

然后是将上面的 c 文件挨个编译一下,产生对应的.o文件。

其中编译 core-m3这个文件时遇到报错,查询到是两个函数中需要修改如下。具体原因是因为对应的编译器的汇编语句不同。

修改前
uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
uint32_t result=0;
__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
return(result);
}
uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
uint32_t result=0;
__ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
return(result);
}
修改后
uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
uint32_t result=0;
__ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
return(result);
}
uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
uint32_t result=0;
__ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
return(result);
}

最后再来补充一个控制LED闪灯的驱动程序,使用过STM32单片机的一定不难理解底下的这段代码。就是控制GPIOA_PIN8高低电平切换。

#include "stm32f10x.h"

int main(void)
{
int i,j;
RCC->APB2ENR = 0x00000004;
GPIOA->CRH = 0x00000003;
while(1)
{
GPIOA->BSRR=(0x00000001<<8);
for(j=0;j<720000;j++);
GPIOA->BSRR=(0x00000001<<24);
for(i=0;i<720000;i++); }
return 0;
}

最后得编译上面的代码,得到main.c  对应的.o文件。如下

看着这些.o文件是不是挺面熟,在MDK工程的obj文件夹下有这一堆文件,然后后面需要用这些文件最终生成HEX文件。前回避了Makefile到这里连接脚本是必须的了,不过好处是可以暂时不用自己写,直接用ST提供的脚本随便一个同系列的芯片的链接脚本吧内存定义那一部分改成对应芯片的FLASH和RAM大小就行。

然后执行下面的命令  注意-T是指指定连接脚本就是STM32F103X6_FLASH.ld

arm-none-eabi-gcc system_stm32f10x.o startup_stm32f103xb.o  core_cm3.o  main.o -T STM32F103X6_FLASH.ld -o led.elf -mthumb -mcpu=cortex-m3 -W -Wall -lm -lc

这时我遇到了这样一个问题

官方连接文件中有一段和现有的arm-none-eabi-gcc版本不兼容导致的 exit undefined的问题错误码

gcc 链接出错exit.c:(.text.exit+0x16): undefined reference to `_exit'这个链接给出了解决方法和原因说明(https://blog.csdn.net/weixin_30224379/article/details/95334513)

我选择在链接脚本中增加_exit 符号提供给链接器,然后再次执行链接命令目录下得到led.elf文件,到这里就算是大功告成了,接下来如果你只需要执行两条简单的命令就可以得到对应的可以烧录的文件

arm-none-eabi-objcopy  led.elf led.bin -Obinary   得到bin文件 
arm-none-eabi-objcopy led.elf led.hex -Oihex      得到hex文件 

最终我在Windows下使用串口烧录软件将,程序下载到板子上,灯欢快的闪起来了。所以这也算是我的第一个Linux下的ARM程序开发,后来我学着写了一个Makefile测试了下可以用,但是吃相难看放到最后,当做回忆。。。。。

 1 TOP    = $(shell pwd)
2 COMPLIT = arm-none-eabi
3 TARGET := led
4 ASM := $(COMPLIT)-as
5 CC := $(COMPLIT)-gcc
6 LD := $(COMPLIT)-ld
7 OBJCOPY = $(COMPLIT)-objcopy
8 OBJDUMP = $(COMPLIT)-objdump
9 OBJ = system_stm32f10x.o startup_stm32f103xb.o core_cm3.o main.o
10 SRC = $(TOP)/src/
11 INC = $(TOP)/inc/
12 FLAG := -W -Wall -g -I $(INC) -lm -lc -mcpu=cortex-m3 -mthumb -D STM32F10X_HD -D USE_STDPERIPH_DRIVER -O1 -std=gnu11
13
14 all: $(OBJ)
15 $(CC) $(OBJ) -T STM32F103X6_FLASH.ld -o $(TARGET).elf -mthumb -mcpu=cortex-m3 -W -Wall -lm -lc
16 $(OBJCOPY) $(TARGET).elf $(TARGET).bin -Obinary
17 $(OBJCOPY) $(TARGET).elf $(TARGET).hex -Oihex
18 main.o:
19 $(CC) -o main.o -c $(FLAG) $(SRC)main.c
20 startup_stm32f103xb.o: startup_stm32f103xb.s $(INC)system_stm32f10x.h
21 $(ASM) -o startup_stm32f103xb.o startup_stm32f103xb.s
22 system_stm32f10x.o:
23 $(CC) -o system_stm32f10x.o -c $(FLAG) $(SRC)system_stm32f10x.c
24 core_cm3.o:
25 $(CC) -o core_cm3.o -c $(FLAG) $(SRC)core_cm3.c
26
27
28 clean:
29 rm *.o

makefile

Linux下开发STM32单片机的更多相关文章

  1. [编译] 3、在Linux下搭建51单片机的开发烧写环境(makefile版)

    星期二, 10. 七月 2018 01:01上午 - beautifulzzzz 一.SDCC(Small Device C Compiler)编译环境搭建 SDCC是一个小型设备的C语言编译器,该编 ...

  2. [编译] 8、在Linux下搭建 stm8 单片机的开发烧写环境(makefile版)

    目录 一.SDCC(Small Device C Compiler)编译环境搭建 1.1.下载 1.2.编译 1.3.测试 二.Hex2Bin+命令行烧写工具配置使用 2.1.下载工具安装配置 2.2 ...

  3. 使用eclipse在linux下开发C/C++

    一直在Linux下开发,苦于没有IDE,一般都是自己编写Makefile,然后在windows下用文本编辑器ftp打开文件编辑,然后在linux下完成编译.调试代码也只能是命令行用gdb进行调试,相当 ...

  4. linux下开发C语言需要安装的manpages手册

    linux下开发C代码需要安装的manpages: $ sudo apt-get install manpages$ sudo apt-get install manpages-dev$ sudo a ...

  5. ubuntu linux下建立stm32开发环境: 程序烧录 openocd+openjtag

    原文出处: http://blog.csdn.net/embbnux/article/details/17619621 之前建立stm32开发环境,程序也已经编译好生成main.bin,接下来就是要把 ...

  6. 在linux下搭建STM32工程

    转载自康神博客:http://blog.csdn.net/u013298300/article/details/50243935 在LINUX下开始一个STM32工程 在LINUX下开始一个STM32 ...

  7. 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境

    在Linux下没有像keli那样好用的IDE来开发51单片机,开发环境只能自己搭建了. 第一步:安装交叉编译工具 a) 安装SDCC sudo apt-get install sdcc b)测试SDC ...

  8. linux下开发板网络速度测试记录

        由于做的项目对于网络和USB的读写速度有很高的要求,因此新拿回来的板子要测试网络和usb的最佳传输速度.要考虑不少因素,先把我能想到的记录下来.     测试的环境是开发板和ubuntu虚拟机 ...

  9. linux下开发c第一弹--相关环境需求

    我用的是mac,mac和linux一般集成了一定的开发环境,基本上需要gcc.vim.gdb之类的,linux下需要apt-get,mac下homebrew的brew install都可以解决问题.同 ...

随机推荐

  1. nmap的理解与利用(初级)

    在命令窗口下输入命令等待,可以用回车来查看进度 nmap进行探测之前要把域名通过dns服务器解析为ip地址,我们也可以使用指定的dns服务器进行解析. nmap --dns-servers 主机地址 ...

  2. django form和form组件

    form介绍: 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是 ...

  3. 网络基础知识之Cisco

    2021-01-2313:35:21 大家好,我是新手,刚学完Cisco协议,以后,我会每天都会给大家一些学习笔记 和一些学习心得,这方面不会的可以找我.qq2934896930. 网络的定义: 计算 ...

  4. 浅析Linux进程空间布局

    一.进程空间分布概述 对于一个进程,其空间分布如下图所示: 1.参数说明 程序段(Text):程序代码在内存中的映射,存放函数体的二进制代码. 初始化过的数据(Data):在程序运行初已经对变量进行初 ...

  5. 《进击吧!Blazor!》第一章 3.页面制作

    作者介绍 陈超超Ant Design Blazor 项目贡献者拥有十多年从业经验,长期基于.Net技术栈进行架构与开发产品的工作,Ant Design Blazor 项目贡献者,现就职于正泰集团 写专 ...

  6. 倍增小结 ST 与 LCA

    倍增 倍增我是真滴不会 倍增法(英语:binary lifting),顾名思义就是翻倍. 能够使线性的处理转化为对数级的处理,大大地优化时间复杂度. (ps:上次学倍增LCA,没学会,老老实实为了严格 ...

  7. 信息: TLD skipped. URI: http://java.sun.com/jstl/* is already defined解决方法

    整合Spring MVC由于用到jstl,所以假如jstl便签用的jar包,启动tomcat时控制台出现了如下的输出: standard.jar与jstl.jar一起使用,但是jstl 1.2版本的就 ...

  8. 引入 Gateway 网关,这些坑一定要学会避开!!!

    Spring cloud gateway是替代zuul的网关产品,基于Spring 5.Spring boot 2.0以上.Reactor, 提供任意的路由匹配和断言.过滤功能.上一篇文章谈了一下Ga ...

  9. 31-1.解决service iptables save出错

    CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系统启动和管理系统服务的相关命令全部由systemctl命令来代替.service命令只保留下了极少部分使用 ...

  10. 设计模式(六)——建造者模式(源码StringBuilder分析)

    建造者模式 1 盖房项目需求 1) 需要建房子:这一过程为打桩.砌墙.封顶 2) 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的. 3) 请编写程序,完成需求. ...